= Финална имплементација на случаи на употреба == Корисникот пополнува форма за додавање на нов рецепт Најавен корисник се навигира кон страницата за листање на рецепти [[Image(cookCraft1A.jpg, height=450, width=900)]] Корисникот го клика копчето за додавање на рецепт и е пренасочен кон страница со форма за пополување на информации за рецептот [[Image(cookCraft2.png, height=450, width=900)]] По пополнување на потребните информации корисникот го кликнува копчето за поденување на формата. [[Image(cookCraft3.png, height=450, width=900)]] ** При испраќање на апликацијата преку POST барање најпрво преку jwt токенот се пребарува мејлот на корисникот. Потоа се прават некои основни проверки пред да се додаде апликацијата во базата ** {{{ @PostMapping("/recipes/add") public ResponseEntity addRecipeApplication( @RequestHeader("Authorization") String tokenHeader, @RequestBody RecipeApplicationDTO recipeApplicationDTO ) { String token = tokenHeader.substring(7); String email = jwtUtil.extractEmail(token); if (email == null) { return new ResponseEntity<>("Error finding user", HttpStatus.BAD_REQUEST); } if (recipeApplicationDTO.getRecipeName() == null || recipeApplicationDTO.getRecipeName().isEmpty()) { return new ResponseEntity<>("Recipe name is required", HttpStatus.BAD_REQUEST); } if (recipeApplicationDTO.getIngredients() == null || recipeApplicationDTO.getIngredients().isEmpty()) { return new ResponseEntity<>("Ingredients are required", HttpStatus.BAD_REQUEST); } recipeService.addRecipeApplication(recipeApplicationDTO); return new ResponseEntity<>(HttpStatus.OK); } }}} ** Во сервисниот дел апликацијата само се пренесува до последниот слој. ** {{{ @Override public void addRecipeApplication(RecipeApplicationDTO recipeApplicationDTO) { recipeDAO.addRecipeApplication(recipeApplicationDTO); } }}} ** Во последниот слој се додава потребнит ** {{{ @Override public void addRecipeApplication(RecipeApplicationDTO recipeApplicationDTO) { String sql = "INSERT INTO recipe_application " + "(recipe_name, description, category, origin, meal_thumb, video_url) " + "VALUES (?, ?, ?, ?, ?, ?) RETURNING id"; Integer recipeId = jdbcTemplate.queryForObject(sql, new Object[] { recipeApplicationDTO.getRecipeName(), recipeApplicationDTO.getRecipeDesc(), recipeApplicationDTO.getRecipeCategory(), recipeApplicationDTO.getRecipeOrigin(), recipeApplicationDTO.getRecipeMealThumb(), recipeApplicationDTO.getRecipeVideoURL() }, Integer.class); if (recipeId == null) { throw new IllegalStateException("Failed to retrieve generated id for the recipe."); } recipeApplicationDTO.getIngredients().forEach(ingredient -> { jdbcTemplate.update("INSERT INTO recipe_application_ingredients (ingredient, dose, recipe_id) VALUES (?, ?, ?)", ingredient.getIngredient(), ingredient.getDose(), recipeId); }); } }}} == Администраторот проверува поднесени рецепти Администраторот се наоѓа на администраторската страница [[Image(cookCraft4.png, height=570, width=600)]] Администраторот селектира одреден рецепт и му се прикажува податоци за рецептот [[Image(cookCraft5.png, height=570, width=650)]] == Најава преку Google === Ненајавен корисник Ненајавениот корисник го кликнува копчето за најава преку google профил, го селектира посакуваниот профил и се логира. [[Image(cookCraftLoginA.jpg)]] == Корисникот добива мејл кога доставувач ќе му ја прифати нарачката.