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
Expand Up @@ -465,13 +465,14 @@ private StepRecommendationResponseDto getFinalRecommendations(
);

List<CocktailSummaryResponseDto> recommendations = cocktailPage.getContent().stream()
.map(cocktail -> new CocktailSummaryResponseDto(
cocktail.getId(),
cocktail.getCocktailName(),
cocktail.getCocktailImgUrl(),
cocktail.getAlcoholStrength()
))
.collect(Collectors.toList());
.map(cocktail -> new CocktailSummaryResponseDto(
cocktail.getId(),
cocktail.getCocktailName(),
cocktail.getCocktailNameKo(),
cocktail.getCocktailImgUrl(),
cocktail.getAlcoholStrength().getDescription()
))
.collect(Collectors.toList());

// 추천 이유는 각 칵테일별 설명으로 들어가도록 유도
String stepTitle = recommendations.isEmpty()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,42 +1,36 @@
package com.back.domain.cocktail.controller;

import com.back.domain.cocktail.repository.CocktailRepository;
import com.back.domain.cocktail.dto.CocktailShareResponseDto;
import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.service.CocktailService;
import com.back.global.rsData.RsData;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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 java.util.Map;

@RestController
@RequestMapping("/cocktails")
@RequiredArgsConstructor
public class CocktailShareController {
private final CocktailRepository cocktailRepository;
private final CocktailService cocktailService;

@Value("${custom.prod.frontUrl}")
private String frontUrl;

@GetMapping("/{id}/share")
public ResponseEntity<RsData<Map<String, String>>> getShareLink(@PathVariable Long id) {
return cocktailRepository.findById(id)
.map(cocktail -> {
Map<String, String> response = Map.of(
// 공유 URL
"url", frontUrl +"/cocktails/" + cocktail.getId(),
// 공유 제목
"title", cocktail.getCocktailName(),
// 공유 이미지 (선택)
"imageUrl", cocktail.getCocktailImgUrl()
);
return ResponseEntity.ok(RsData.successOf(response));
})
.orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칵테일이 없는 경우는 없을 거라서 예외 발생이 필요없어진 거죵?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

orElseGet()을 제거한 이유는 Service에서 칵테일이 없으면 orElseThrow예외를 던지도록 구조를 바꾸었기 때문입니당.

.body(RsData.failOf("칵테일을 찾을 수 없습니다.")));
public ResponseEntity<RsData<CocktailShareResponseDto>> getShareLink(@PathVariable Long id) {
Cocktail cocktail = cocktailService.getCocktailById(id);

CocktailShareResponseDto responseDto = new CocktailShareResponseDto(
frontUrl + "/cocktails/" + cocktail.getId(),
cocktail.getCocktailNameKo(),
cocktail.getCocktailImgUrl()
);

return ResponseEntity.ok(RsData.successOf(responseDto));
}
}
Original file line number Diff line number Diff line change
@@ -1,52 +1,15 @@
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.getId();
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();
}
public record CocktailDetailResponseDto(
Long cocktailId,
String cocktailName,
String cocktailNameKo,
String alcoholStrength,
String cocktailType,
String alcoholBaseType,
String cocktailImgUrl,
String cocktailStory,
String ingredient,
String recipe
) {
}
Original file line number Diff line number Diff line change
@@ -1,39 +1,34 @@
package com.back.domain.cocktail.dto;

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;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
public class CocktailSearchResponseDto {

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

public CocktailSearchResponseDto(long cocktailId, String cocktailName,
AlcoholStrength alcoholStrength, CocktailType cocktailType,
AlcoholBaseType alcoholBaseType, String cocktailImgUrl,
String cocktailStory, LocalDateTime createdAt) {
public CocktailSearchResponseDto(long cocktailId, String cocktailName, String cocktailNameKo,
String alcoholStrength, String cocktailType,
String alcoholBaseType, String cocktailImgUrl,
String cocktailStory) {
this.cocktailId = cocktailId;
this.cocktailName = cocktailName;
this.cocktailNameKo = cocktailNameKo;
this.alcoholStrength = alcoholStrength;
this.cocktailType = cocktailType;
this.alcoholBaseType = alcoholBaseType;
this.cocktailImgUrl = cocktailImgUrl;
this.cocktailStory = cocktailStory;
this.createdAt = createdAt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.back.domain.cocktail.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class CocktailShareResponseDto {
private String url;
private String title;
private String imageUrl;
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package com.back.domain.cocktail.dto;

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

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

public CocktailSummaryResponseDto(Long id, String name, String imageUrl, AlcoholStrength alcoholStrength) {
this.cocktailId = id;
this.cocktailName = name;
this.cocktailImgUrl = imageUrl;
this.alcoholStrength = alcoholStrength;
public record CocktailSummaryResponseDto(
Long cocktailId,
String cocktailName,
String cocktailNameKo,
String cocktailImgUrl,
String alcoholStrength // Enum 대신 String
) {
public CocktailSummaryResponseDto(Cocktail cocktail) {
this(
cocktail.getId(),
cocktail.getCocktailName(),
cocktail.getCocktailNameKo(),
cocktail.getCocktailImgUrl(),
cocktail.getAlcoholStrength().getDescription() // 설명으로 변환
);
}
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/back/domain/cocktail/entity/Cocktail.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

Expand All @@ -20,6 +21,7 @@
@Builder
@ToString
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Cocktail {
@Id
@GeneratedValue(strategy = IDENTITY)
Expand Down
64 changes: 52 additions & 12 deletions src/main/java/com/back/domain/cocktail/service/CocktailService.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -51,7 +52,7 @@ public List<CocktailSummaryResponseDto> getCocktails (Long lastId, Integer size)
cocktails = cocktailRepository.findByIdLessThanOrderByIdDesc(lastId, PageRequest.of(0, fetchSize));
}
return cocktails.stream()
.map(c -> new CocktailSummaryResponseDto(c.getId(), c.getCocktailName(), c.getCocktailImgUrl(), c.getAlcoholStrength()))
.map(c -> new CocktailSummaryResponseDto(c.getId(), c.getCocktailName(), c.getCocktailNameKo(), c.getCocktailImgUrl(), c.getAlcoholStrength().getDescription()))
.collect(Collectors.toList());
}

Expand Down Expand Up @@ -108,12 +109,12 @@ public List<CocktailSearchResponseDto> searchAndFilter (CocktailSearchRequestDto
.map(c -> new CocktailSearchResponseDto(
c.getId(),
c.getCocktailName(),
c.getAlcoholStrength(),
c.getCocktailType(),
c.getAlcoholBaseType(),
c.getCocktailNameKo(),
c.getAlcoholStrength().getDescription(),
c.getCocktailType().getDescription(),
c.getAlcoholBaseType().getDescription(),
c.getCocktailImgUrl(),
c.getCocktailStory(),
c.getCreatedAt()
c.getCocktailStory()
))
.collect(Collectors.toList());

Expand All @@ -124,11 +125,50 @@ public List<CocktailSearchResponseDto> searchAndFilter (CocktailSearchRequestDto
// return CollectionUtils.isEmpty(list) ? null : list;
// }

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

// ingredient 분수 변환
String formattedIngredient = convertFractions(cocktail.getIngredient());

return new CocktailDetailResponseDto(
cocktail.getId(),
cocktail.getCocktailName(),
cocktail.getCocktailNameKo(),
cocktail.getAlcoholStrength().getDescription(),
cocktail.getCocktailType().getDescription(),
cocktail.getAlcoholBaseType().getDescription(),
cocktail.getCocktailImgUrl(),
cocktail.getCocktailStory(),
formattedIngredient,
cocktail.getRecipe()
);
}

private String convertFractions(String ingredient) {
if (ingredient == null) return null;

// 치환 테이블 생성
Map<String, String> fractionMap = Map.of(
"1/2", "½",
"1/3", "⅓",
"2/3", "⅔",
"1/4", "¼",
"3/4", "¾",
"1/8", "⅛",
"3/8", "⅜",
"5/8", "⅝",
"7/8", "⅞"
);

// 테이블 기반 치환
for (Map.Entry<String, String> entry : fractionMap.entrySet()) {
ingredient = ingredient.replace(entry.getKey(), entry.getValue());
}

return ingredient;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ public List<CocktailRecommendResponseDto> recommendRelatedCocktails(Long cocktai
c.getCocktailNameKo(),
c.getCocktailName(),
c.getCocktailImgUrl(),
c.getAlcoholStrength().name(),
c.getAlcoholBaseType().name()
c.getAlcoholStrength().getDescription(),
c.getAlcoholBaseType().getDescription()
))
.toList();
}
Expand Down
Loading