{"id":19316627,"url":"https://github.com/wisskirchenj/recipe-server","last_synced_at":"2026-04-17T13:31:01.116Z","repository":{"id":110253616,"uuid":"580556812","full_name":"wisskirchenj/recipe-server","owner":"wisskirchenj","description":"Spring boot 3.0 recipe backend with Spring Security 6, persisting into an H2 database.","archived":false,"fork":false,"pushed_at":"2024-04-22T16:50:31.000Z","size":271,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-24T04:42:14.649Z","etag":null,"topics":["native-image","oauth2-resource-server","postgres","spring-boot-3-1"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wisskirchenj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-20T21:18:11.000Z","updated_at":"2024-04-22T16:50:34.000Z","dependencies_parsed_at":"2023-04-22T12:30:30.942Z","dependency_job_id":"1bc0bf75-81a1-496c-a4bf-c302ddb261d4","html_url":"https://github.com/wisskirchenj/recipe-server","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wisskirchenj/recipe-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Frecipe-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Frecipe-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Frecipe-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Frecipe-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wisskirchenj","download_url":"https://codeload.github.com/wisskirchenj/recipe-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisskirchenj%2Frecipe-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31931167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T12:37:54.787Z","status":"ssl_error","status_checked_at":"2026-04-17T12:37:25.095Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["native-image","oauth2-resource-server","postgres","spring-boot-3-1"],"created_at":"2024-11-10T01:12:02.907Z","updated_at":"2026-04-17T13:31:01.079Z","avatar_url":"https://github.com/wisskirchenj.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IDEA EDU Course\n\nImplemented in the \u003cb\u003eSpring Security for Java Backend Developer\u003c/b\u003e Track of hyperskill.org's JetBrain Academy.\u003cbr\u003e\nhttps://hyperskill.org/projects/180\n\nProject goal is to implement a Spring boot recipe application with Spring Security and persisting into an H2 database.\n\n## Technology / External Libraries\n\n- Java 20\n- Spring Boot 3.1.1 (with Spring Security 6.1.x and Oauth2-Resource-server)\n- Native image on GraalVM (Liberica 17.0.7)\n- Spring Web using \"classical\" WebMvC @RestController-style\n- Spring Data JPA and Validate\n- Postgres Database\n- Lombok\n- Spring Tests with MockMvC\n- Gradle 8.2\n\n## Program description\n\nThe application represents a program, that receives recipes voa REST-endpoints and stores them in a database.\nWe create a multi-user web service with Spring Boot that allows storing, retrieving, updating, and deleting recipes.\n\nCurrently implemented endpoints:\n\n\u003e \u003cb\u003ePOST /api/register (unauthenticated)\u003c/b\u003e. -\u003e post email and password as Json to register. Returns 200 OK on success\nor 400 BAD REQUEST, if invalid Json or User with email already exists.\nThe request JSON looks as:\u003cpre\u003e\n{\n\"email\": \"hans.wurst@xyz.de\",\n\"password\": \"topsecret\",\n}\u003c/pre\u003e The password needs 8 characters, email is checked as valid format.\n\n\u003e \u003cb\u003ePOST /api/recipe/new (authenticated)\u003c/b\u003e. -\u003e post a recipe as Json to persist it server-side with the timestamp and the creator.\nThe request JSON looks as:\u003cpre\u003e\n{\n\"name\": \"apple pie\",\n\"category\": \"bakery\",\n\"description\": \"easy apple pie\",\n\"ingredients\": [\"100 g sugar\", \"200 g butter\", \"5 apples\"],\n\"directions\": [\"make dough\", \"put in oven\", \"bake at 200°\"]\n}\u003c/pre\u003e It returns the id in the database as key-value object.\n\n\u003e \u003cb\u003eGET /api/recipe/{id} (authenticated)\u003c/b\u003e. -\u003e receives recipe with id from the database.\n\n\u003e \u003cb\u003eDELETE /api/recipe/{id} (authenticated)\u003c/b\u003e. -\u003e delete recipe with id if the principal is the creator. In this case\nreturns 204, if not 403 FORBIDDEN is returned or 404 not Found, if recipe with id does not exist.\n\n\u003e \u003cb\u003ePUT /api/recipe/{id} (authenticated)\u003c/b\u003e. -\u003e receives a recipe as a JSON object and updates the recipe with specified id\nif the principal is the creator. In this case returns 204, if not 403 FORBIDDEN is returned or 404 not Found, if recipe with id does not exist.\nAlso, updates the dateTime field.\n\n\u003e \u003cb\u003eGET /api/recipe/search/?category=search (authenticated)\u003c/b\u003e.  \n\u003e \u003cb\u003eGET /api/recipe/search/?name=search (authenticated)\u003c/b\u003e. -\u003e retrieve all recipes matching to either a\ncase-insensitive category parameter search or a case-insensitive substring search on the name as a Json-array, which\nis sorted descending by update timestamp.\n\n\n## Project completion\n\nProject was completed on 01.01.23.\n\n## Repository Contents\n\nSources for all project tasks (5 stages) with tests and configurations.\n\n## Progress\n\n20.12.22 Project started. Just setup of build and repo with gradle.\n\n23.12.22 Stage 1 completed. Post and get endpoint /api/recipe/ with full test coverage. Setup of typical Rest-Service\npackage structure with mapping of Dto \u003c-\u003e entities\n\n24.12.22 Stage 2 completed. Now recipes posted are added in a list starting with id=1. The get method needs a\npath variable containing the id. 404 is returned if the requested element does not exist or 400 in case the path variable\nis not in integer format.\n\n26.12.22 Stage 3 completed. Now recipes posted are persisted in a H2 database. Also hibernate validation is performed\non input - tested with a new fancy generic and record-capable JpaUnitTestValidator. A delete endpoint is added.\n\n27.12.22 Stage 4 completed. Now recipes posted are persisted in a H2 database. Recipe entity gets additional category and\nan @UpdateTimestamp annotated LocalDateTime field. Put endpoint added to update recipe by id and a parameter search\non category or name substrings with sorting by newest posted/ updated.\n\n01.01.23 Stage 5 completed. Added Spring security v 6.0 and a register endpoint for users to register. Only registered users\nmay access the api/recipe endpoints. Further update / delete actions are only permitted, if the session user is the creator\nof a recipe (creator stored in recipe table).\n\n26.06.23 Image/artifact tag 0.3.0: Move to postgres-database. Implement Oauth2-authentication with oauth2-resource-server. Remove\nUser management and register endpoint, since this will be handled by authorization server with OIDC.\n\nuntil 30.09.23 Add custom observability with actuator and Micrometer, add DemoController for rendering image media types.\nSetup http-client with token retrieval from Spring authorization server and bearer token authorization. Permit all \nactuator endpoints for demo purposes. Add custom metrics `recipe.not.found` for recipe not found requests.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisskirchenj%2Frecipe-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwisskirchenj%2Frecipe-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisskirchenj%2Frecipe-server/lists"}