package com.recipeapp.recipe; import com.recipeapp.common.ApiResponse; import com.recipeapp.recipe.dto.*; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.net.URI; import java.security.Principal; import java.util.List; import java.util.UUID; @RestController @RequestMapping("/v1/recipes") public class RecipeController { private final RecipeService recipeService; private final HouseholdResolver householdResolver; public RecipeController(RecipeService recipeService, HouseholdResolver householdResolver) { this.recipeService = recipeService; this.householdResolver = householdResolver; } @GetMapping public ResponseEntity>> listRecipes( Principal principal, @RequestParam(required = false) String search, @RequestParam(required = false) String effort, @RequestParam(name = "cookTimeMin.lte", required = false) Integer cookTimeMaxMin, @RequestParam(required = false) String sort, @RequestParam(defaultValue = "20") int limit, @RequestParam(defaultValue = "0") int offset) { UUID householdId = householdResolver.resolve(principal.getName()); List recipes = recipeService.listRecipes( householdId, search, effort, cookTimeMaxMin, sort, limit, offset); long total = recipeService.countRecipes( householdId, search, effort, cookTimeMaxMin); var pagination = new ApiResponse.Pagination(total, limit, offset, offset + limit < total); var meta = new ApiResponse.Meta(pagination); return ResponseEntity.ok(ApiResponse.success(recipes, meta)); } @GetMapping("/{id}") public RecipeDetailResponse getRecipe(Principal principal, @PathVariable UUID id) { UUID householdId = householdResolver.resolve(principal.getName()); return recipeService.getRecipe(householdId, id); } @PostMapping public ResponseEntity createRecipe( Principal principal, @Valid @RequestBody RecipeCreateRequest request) { UUID householdId = householdResolver.resolve(principal.getName()); RecipeDetailResponse detail = recipeService.createRecipe(householdId, request); return ResponseEntity.created(URI.create("/v1/recipes/" + detail.id())).body(detail); } @PutMapping("/{id}") public RecipeDetailResponse updateRecipe( Principal principal, @PathVariable UUID id, @Valid @RequestBody RecipeCreateRequest request) { UUID householdId = householdResolver.resolve(principal.getName()); return recipeService.updateRecipe(householdId, id, request); } @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteRecipe(Principal principal, @PathVariable UUID id) { UUID householdId = householdResolver.resolve(principal.getName()); recipeService.deleteRecipe(householdId, id); } }