Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,31 +1,61 @@
package com.back.domain.cocktail.controller;

import com.back.domain.cocktail.dto.CocktailDetailDto;
import com.back.domain.cocktail.dto.CocktailDetailResponseDto;
import com.back.domain.cocktail.dto.CocktailSearchRequestDto;
import com.back.domain.cocktail.dto.CocktailSearchResponseDto;
import com.back.domain.cocktail.dto.CocktailSummaryResponseDto;
import com.back.domain.cocktail.service.CocktailService;
import com.back.domain.user.service.UserService;
import com.back.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("api/cocktails")
@RequiredArgsConstructor
public class CocktailController {

private final CocktailService cocktailService;
private final UserService userService;

@GetMapping("/{id}")
@Transactional
@Operation(summary = "칵테일 단건 조회")
public RsData<CocktailDetailDto> getCocktailDetailById(@PathVariable long id) {
public RsData<CocktailDetailDto> getCocktailDetailById(@PathVariable long id){

CocktailDetailResponseDto cocktailDetailResponseDto = cocktailService.getCocktailDetailById(id);
return RsData.successOf(cocktailDetailResponseDto);
}

// @param lastId 마지막으로 가져온 칵테일 ID (첫 요청 시 null 가능)
// @param size 가져올 데이터 개수 (기본값 DEFAULT_SIZE)
// @return RsData 형태의 칵테일 요약 정보 리스트
@GetMapping
@Transactional
@Operation(summary = "칵테일 다건 조회")
public RsData<List<CocktailSummaryResponseDto>> getCocktails(
@RequestParam(value = "lastId", required = false) Long lastId,
@RequestParam(value = "size", required = false) Integer size
) {
List<CocktailSummaryResponseDto> cocktails = cocktailService.getCocktails(lastId, size);
return RsData.successOf(cocktails);
}


// 칵테일 검색 및 필터링
// POST 방식으로 JSON body를 통해 검색 조건 전달

@PostMapping("/search")
@Operation(summary = "칵테일 검색 및 필터링")
public RsData<List<CocktailSearchResponseDto>> searchAndFilter(
@RequestBody CocktailSearchRequestDto cocktailSearchRequestDto
) {
// 서비스 호출
List<CocktailSearchResponseDto> searchResults = cocktailService.searchAndFilter(cocktailSearchRequestDto);

CocktailDetailDto cocktailDetailDto = cocktailService.getCocktailDetailById(id);
return RsData.successOf(cocktailDetailDto);
// RsData로 통일된 응답 반환
return RsData.successOf(searchResults);
}
}
32 changes: 0 additions & 32 deletions src/main/java/com/back/domain/cocktail/dto/CocktailDetailDto.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.back.domain.cocktail.dto;

import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CocktailDetailResponseDto {
private Long cocktailId;
private String cocktailName;
private AlcoholStrength alcoholStrength;
private CocktailType cocktailType;
private AlcoholBaseType alcoholBaseType;
private String cocktailImgUrl;
private String cocktailStory;
private String ingredient;
private String recipe;

public CocktailDetailResponseDto(
long cocktailId, String cocktailName,
AlcoholStrength alcoholStrength, CocktailType cocktailType,
AlcoholBaseType alcoholBaseType, String cocktailImgUrl,
String cocktailStory, String ingredient,
String recipe
) {
this.cocktailId = cocktailId;
this.cocktailName = cocktailName;
this.alcoholStrength = alcoholStrength;
this.cocktailType = cocktailType;
this.alcoholBaseType = alcoholBaseType;
this.cocktailImgUrl = cocktailImgUrl;
this.cocktailStory = cocktailStory;
this.ingredient = ingredient;
this.recipe = recipe;
}

public CocktailDetailResponseDto(Cocktail cocktail) {
this.cocktailId = cocktail.getCocktailId();
this.cocktailName = cocktail.getCocktailName();
this.alcoholStrength = cocktail.getAlcoholStrength();
this.cocktailType = cocktail.getCocktailType();
this.alcoholBaseType = cocktail.getAlcoholBaseType();
this.cocktailImgUrl = cocktail.getCocktailImgUrl();
this.cocktailStory = cocktail.getCocktailStory();
this.ingredient = cocktail.getIngredient();
this.recipe = cocktail.getRecipe();
}
}
29 changes: 0 additions & 29 deletions src/main/java/com/back/domain/cocktail/dto/CocktailRequestDto.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
Expand All @@ -12,7 +14,7 @@
@Getter
@Setter
@NoArgsConstructor
public class CocktailFilterRequestDto {
public class CocktailSearchRequestDto {

private String keyword; // 검색 키워드

Expand All @@ -23,15 +25,20 @@ public class CocktailFilterRequestDto {
private List<AlcoholBaseType> alcoholBaseTypes;

// 페이징/정렬 추가하고 싶으면 여기 옵션 추가
@Min(0)
private Integer page; // 0-based 페이지 번호
@Max(100)
private Integer size; // 페이지 사이즈

// 생성자
public CocktailFilterRequestDto(String keyword,
List<AlcoholStrength> alcoholStrengths,
List<CocktailType> cocktailTypes,
List<AlcoholBaseType> alcoholBaseTypes,
Integer page, Integer size) {
public CocktailSearchRequestDto(
String keyword,
List<AlcoholStrength> alcoholStrengths,
List<CocktailType> cocktailTypes,
List<AlcoholBaseType> alcoholBaseTypes,
Integer page,
Integer size
) {
this.keyword = keyword;
this.alcoholStrengths = alcoholStrengths;
this.cocktailTypes = cocktailTypes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,21 @@
@Getter
@Setter
@NoArgsConstructor
public class CocktailResponseDto {
public class CocktailSearchResponseDto {

private long cocktailId;
private String cocktailName;
private AlcoholStrength alcoholStrength;
private String cocktailStory;
private CocktailType cocktailType;
private AlcoholBaseType alcoholBaseType;
private String ingredient;
private String recipe;
private String cocktailImgUrl;
private String cocktailStory;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public CocktailResponseDto(long cocktailId, String cocktailName,
AlcoholStrength alcoholStrength, CocktailType cocktailType,
AlcoholBaseType alcoholBaseType, String cocktailImgUrl,
String cocktailStory, LocalDateTime createdAt) {
public CocktailSearchResponseDto(long cocktailId, String cocktailName,
AlcoholStrength alcoholStrength, CocktailType cocktailType,
AlcoholBaseType alcoholBaseType, String cocktailImgUrl,
String cocktailStory, LocalDateTime createdAt) {
this.cocktailId = cocktailId;
this.cocktailName = cocktailName;
this.alcoholStrength = alcoholStrength;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import lombok.Getter;

@Getter
public class CocktailSummaryDto {
public class CocktailSummaryResponseDto {
private Long cocktailId;
private String cocktailName;
private String cocktailImgUrl;

public CocktailSummaryDto(Long id, String name, String imageUrl) {
public CocktailSummaryResponseDto(Long id, String name, String imageUrl) {
this.cocktailId = id;
this.cocktailName = name;
this.cocktailImgUrl = imageUrl;
Expand Down
47 changes: 24 additions & 23 deletions src/main/java/com/back/domain/cocktail/service/CocktailService.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.back.domain.cocktail.service;

import com.back.domain.cocktail.dto.CocktailDetailDto;
import com.back.domain.cocktail.dto.CocktailFilterRequestDto;
import com.back.domain.cocktail.dto.CocktailResponseDto;
import com.back.domain.cocktail.dto.CocktailSummaryDto;
import com.back.domain.cocktail.dto.CocktailDetailResponseDto;
import com.back.domain.cocktail.dto.CocktailSearchRequestDto;
import com.back.domain.cocktail.dto.CocktailSearchResponseDto;
import com.back.domain.cocktail.dto.CocktailSummaryResponseDto;
import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
Expand Down Expand Up @@ -31,13 +31,14 @@ public class CocktailService {

@Transactional(readOnly = true)
public Cocktail getCocktailById(Long id) {

return cocktailRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("User not found. id=" + id));
}
}

// 칵테일 무한스크롤 조회
@Transactional(readOnly = true)
public List<CocktailSummaryDto> getCocktails (Long lastId, Integer size)
public List<CocktailSummaryResponseDto> getCocktails (Long lastId, Integer size)
{ // 무한스크롤 조회, 클라이언트 쪽에서 lastId와 size 정보를 받음.(스크롤 이벤트)
int fetchSize = (size != null) ? size : DEFAULT_SIZE;

Expand All @@ -50,7 +51,7 @@ public List<CocktailSummaryDto> getCocktails (Long lastId, Integer size)
cocktails = cocktailRepository.findByCocktailIdLessThanOrderByCocktailIdDesc(lastId, PageRequest.of(0, fetchSize));
}
return cocktails.stream()
.map(c -> new CocktailSummaryDto(c.getCocktailId(), c.getCocktailName(), c.getCocktailImgUrl()))
.map(c -> new CocktailSummaryResponseDto(c.getCocktailId(), c.getCocktailName(), c.getCocktailImgUrl()))
.collect(Collectors.toList());
}

Expand All @@ -69,42 +70,42 @@ public List<Cocktail> cocktailSearch (String keyword){

// 칵테일 검색,필터기능
@Transactional(readOnly = true)
public List<CocktailResponseDto> searchAndFilter (CocktailFilterRequestDto cocktailFilterRequestDto){
public List<CocktailSearchResponseDto> searchAndFilter (CocktailSearchRequestDto cocktailSearchRequestDto){
// 기본값 페이지/사이즈 정하기(PAGE 기본값 0, 사이즈 10)
int page = cocktailFilterRequestDto.getPage() != null && cocktailFilterRequestDto.getPage() >= 0
? cocktailFilterRequestDto.getPage() : 0;
int page = cocktailSearchRequestDto.getPage() != null && cocktailSearchRequestDto.getPage() >= 0
? cocktailSearchRequestDto.getPage() : 0;

int size = cocktailFilterRequestDto.getSize() != null && cocktailFilterRequestDto.getSize() > 0
? cocktailFilterRequestDto.getSize() : DEFAULT_SIZE;
int size = cocktailSearchRequestDto.getSize() != null && cocktailSearchRequestDto.getSize() > 0
? cocktailSearchRequestDto.getSize() : DEFAULT_SIZE;

// searchWithFilters에서 조회한 결과값을 pageResult에 저장.
Pageable pageable = PageRequest.of(page, size);

// 빈 리스트(null 또는 [])는 null로 변환
List<AlcoholStrength> strengths = CollectionUtils.isEmpty(cocktailFilterRequestDto.getAlcoholStrengths())
List<AlcoholStrength> strengths = CollectionUtils.isEmpty(cocktailSearchRequestDto.getAlcoholStrengths())
? null
: cocktailFilterRequestDto.getAlcoholStrengths();
: cocktailSearchRequestDto.getAlcoholStrengths();

List<CocktailType> types = CollectionUtils.isEmpty(cocktailFilterRequestDto.getCocktailTypes())
List<CocktailType> types = CollectionUtils.isEmpty(cocktailSearchRequestDto.getCocktailTypes())
? null
: cocktailFilterRequestDto.getCocktailTypes();
: cocktailSearchRequestDto.getCocktailTypes();

List<AlcoholBaseType> bases = CollectionUtils.isEmpty(cocktailFilterRequestDto.getAlcoholBaseTypes())
List<AlcoholBaseType> bases = CollectionUtils.isEmpty(cocktailSearchRequestDto.getAlcoholBaseTypes())
? null
: cocktailFilterRequestDto.getAlcoholBaseTypes();
: cocktailSearchRequestDto.getAlcoholBaseTypes();

// Repository 호출
Page<Cocktail> pageResult = cocktailRepository.searchWithFilters(
cocktailFilterRequestDto.getKeyword(),
cocktailSearchRequestDto.getKeyword(),
strengths, // List<AlcoholStrength>
types, // List<CocktailType>
bases, // List<AlcoholBaseType>
pageable
);

//Cocktail 엔티티 → CocktailResponseDto 응답 DTO로 바꿔주는 과정
List<CocktailResponseDto> resultDtos = pageResult.stream()
.map(c -> new CocktailResponseDto(
List<CocktailSearchResponseDto> resultDtos = pageResult.stream()
.map(c -> new CocktailSearchResponseDto(
c.getCocktailId(),
c.getCocktailName(),
c.getAlcoholStrength(),
Expand All @@ -125,9 +126,9 @@ public List<CocktailResponseDto> searchAndFilter (CocktailFilterRequestDto cockt

// 칵테일 상세조회
@Transactional(readOnly = true)
public CocktailDetailDto getCocktailDetailById (Long cocktailId){
public CocktailDetailResponseDto getCocktailDetailById (Long cocktailId){
Cocktail cocktail = cocktailRepository.findById(cocktailId)
.orElseThrow(() -> new NoSuchElementException("칵테일을 찾을 수 없습니다. id: " + cocktailId));
return new CocktailDetailDto(cocktail);
return new CocktailDetailResponseDto(cocktail);
}
}
Loading