V025 migration drops the column. Removed from Recipe entity, RecipeDetailResponse, RecipeSummaryResponse, RecipeRepository JPQL, RecipeService, and RecipeController. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
79 lines
3.1 KiB
Java
79 lines
3.1 KiB
Java
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<ApiResponse<List<RecipeSummaryResponse>>> 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<RecipeSummaryResponse> 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<RecipeDetailResponse> 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);
|
|
}
|
|
}
|