Skip to content

Commit 6dcee3a

Browse files
authored
Merge pull request #85 from SWU-Elixir/feat/3-recipe-CRUD
feat: 로그인한 사용자가 작성한 레시피 최대 10개 조회 API 구현
2 parents ea099c4 + 00acf1d commit 6dcee3a

File tree

5 files changed

+85
-4
lines changed

5 files changed

+85
-4
lines changed

src/main/java/BE_Elixir/Elixir/domain/recipe/controller/RecipeController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeHomeResponseDTO;
88
import BE_Elixir.Elixir.domain.recipe.dto.request.RecipeRequestDTO;
99
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeResponseDTO;
10+
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeSummaryResponse;
1011
import BE_Elixir.Elixir.domain.recipe.service.RecipeService;
1112
import BE_Elixir.Elixir.global.enums.CategorySlowAging;
1213
import BE_Elixir.Elixir.global.enums.CategoryType;
@@ -203,4 +204,25 @@ public ResponseEntity<CommonResponse<?>> deleteRecipe(
203204
}
204205
}
205206

207+
// 로그인한 사용자가 작성한 레시피를 최대 10개까지 조회
208+
@GetMapping("/my")
209+
public ResponseEntity<CommonResponse<List<RecipeSummaryResponse>>> getMyRecipes(
210+
@AuthenticationPrincipal MemberDetails memberDetails,
211+
@RequestParam(defaultValue = "10") int size
212+
) {
213+
try {
214+
Member member = memberDetails.getMember();
215+
List<RecipeSummaryResponse> recipes = recipeService.getMyRecipes(member, size);
216+
return ResponseEntity.ok(CommonResponse.success(
217+
HttpStatus.OK.value(), HttpStatus.OK.toString(),
218+
"작성한 레시피 조회 성공", recipes
219+
));
220+
} catch (Exception e) {
221+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
222+
.body(CommonResponse.error(
223+
HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.toString(),
224+
"작성한 레시피 조회 실패 - " + e.getMessage()
225+
));
226+
}
227+
}
206228
}

src/main/java/BE_Elixir/Elixir/domain/recipe/controller/api/RecipeApi.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import BE_Elixir.Elixir.domain.member.entity.MemberDetails;
44
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeDetailResponseDTO;
55
import BE_Elixir.Elixir.domain.recipe.dto.request.RecipeRequestDTO;
6+
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeSummaryResponse;
67
import BE_Elixir.Elixir.global.enums.CategorySlowAging;
78
import BE_Elixir.Elixir.global.enums.CategoryType;
89
import BE_Elixir.Elixir.global.response.CommonResponse;
@@ -188,4 +189,24 @@ ResponseEntity<CommonResponse<?>> deleteRecipe(
188189
@PathVariable Long recipeId,
189190
@AuthenticationPrincipal MemberDetails memberDetails
190191
);
192+
193+
// 로그인한 사용자가 작성한 레시피를 최대 10개까지 조회
194+
@Operation(summary = "작성한 레시피를 최대 10개까지 조회", description = "작성한 레시피를 최대 10개까지 조회합니다.",
195+
security = @SecurityRequirement(name = "bearerAuth"))
196+
@ApiResponses({
197+
@ApiResponse(responseCode = "200", description = "작성한 레시피를 최대 10개까지 조회 성공",
198+
content = @Content(schema = @Schema(implementation = CommonResponse.class),
199+
examples = @ExampleObject(value = """
200+
{
201+
"status": 200,
202+
"code": "200 OK",
203+
"message": "작성한 레시피를 최대 10개까지 조회 성공",
204+
"data": true
205+
}
206+
""")))
207+
})
208+
ResponseEntity<CommonResponse<List<RecipeSummaryResponse>>> getMyRecipes(
209+
@AuthenticationPrincipal MemberDetails memberDetails,
210+
@RequestParam(defaultValue = "10") int size
211+
);
191212
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package BE_Elixir.Elixir.domain.recipe.dto.response;
2+
3+
import BE_Elixir.Elixir.domain.recipe.entity.Recipe;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
import java.util.List;
8+
import java.util.stream.Collectors;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class RecipeSummaryResponse {
13+
private Long recipeId;
14+
private String imageUrl;
15+
private String title;
16+
private List<Long> ingredientTags;
17+
18+
public static RecipeSummaryResponse from(Recipe recipe) {
19+
return new RecipeSummaryResponse(
20+
recipe.getId(),
21+
recipe.getImageUrl(),
22+
recipe.getTitle(),
23+
recipe.getIngredientTags().stream()
24+
.map(tag -> tag.getIngredient().getId())
25+
.collect(Collectors.toList())
26+
);
27+
}
28+
}

src/main/java/BE_Elixir/Elixir/domain/recipe/repository/RecipeRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public interface RecipeRepository extends JpaRepository<Recipe, Long> {
4646
"WHERE r.member.id = :memberId " +
4747
"AND r.createdAt >= :openedAt")
4848
List<String> findIngredientsByMemberIdAndTimeAfter(@Param("memberId") Long memberId, @Param("openedAt") LocalDateTime openedAt);
49+
50+
// 사용자가 작성한 레시피 size만큼 가져오기
51+
@Query(value = "SELECT * FROM recipe WHERE member_id = :memberId ORDER BY created_at DESC LIMIT :size", nativeQuery = true)
52+
List<Recipe> findTopRecipesByUserId(@Param("memberId") Long userId, @Param("size") int size);
53+
4954
}
5055

5156

src/main/java/BE_Elixir/Elixir/domain/recipe/service/RecipeService.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import BE_Elixir.Elixir.domain.ingredient.entity.Ingredient;
77
import BE_Elixir.Elixir.domain.member.entity.Member;
88
import BE_Elixir.Elixir.domain.recipe.dto.request.RecipeRequestDTO;
9-
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeCommentResponseDTO;
10-
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeDetailResponseDTO;
11-
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeHomeResponseDTO;
12-
import BE_Elixir.Elixir.domain.recipe.dto.response.RecipeResponseDTO;
9+
import BE_Elixir.Elixir.domain.recipe.dto.response.*;
1310
import BE_Elixir.Elixir.domain.recipe.entity.Recipe;
1411
import BE_Elixir.Elixir.domain.recipe.entity.RecipeIngredient;
1512
import BE_Elixir.Elixir.domain.ingredient.repository.IngredientRepository;
@@ -289,4 +286,12 @@ public void deleteRecipe(Long recipeId, Member member) {
289286

290287
recipeRepository.delete(recipe);
291288
}
289+
290+
// 로그인한 사용자가 작성한 레시피를 최대 10개까지 조회
291+
public List<RecipeSummaryResponse> getMyRecipes(Member member, int size) {
292+
List<Recipe> recipes = recipeRepository.findTopRecipesByUserId(member.getId(), size);
293+
return recipes.stream()
294+
.map(RecipeSummaryResponse::from)
295+
.collect(Collectors.toList());
296+
}
292297
}

0 commit comments

Comments
 (0)