Skip to content

Commit

Permalink
feat: 테마별 향수 추천 시 향수 스토리 반환
Browse files Browse the repository at this point in the history
  • Loading branch information
oliviarla committed Dec 27, 2023
1 parent e1ee9ba commit f87bd95
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import java.util.List;

public record PerfumeThemeResponseDto(
String title, String content, String thumbnail, List<SimplePerfumeResponseDto> perfumes) {
String title, String content, String thumbnail, List<SimplePerfumeThemeResponseDto> perfumes) {
public static PerfumeThemeResponseDto from(PerfumeThemeResult perfumeThemeResult) {
return new PerfumeThemeResponseDto(
perfumeThemeResult.title(),
perfumeThemeResult.content(),
perfumeThemeResult.thumbnail(),
perfumeThemeResult.perfumes().stream().map(SimplePerfumeResponseDto::of).toList());
perfumeThemeResult.perfumes().stream().map(SimplePerfumeThemeResponseDto::of).toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.perfume.api.perfume.adapter.in.http.dto;

import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;

public record SimplePerfumeThemeResponseDto(
Long id, String name, String story, String thumbnail, String brandName) {
public static SimplePerfumeThemeResponseDto of(
SimplePerfumeThemeResult simplePerfumeThemeResult) {
return new SimplePerfumeThemeResponseDto(
simplePerfumeThemeResult.id(),
simplePerfumeThemeResult.name(),
simplePerfumeThemeResult.story(),
simplePerfumeThemeResult.thumbnail(),
simplePerfumeThemeResult.brandName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.perfume.api.perfume.adapter.out.persistence.perfume.mapper.PerfumeMapper;
import io.perfume.api.perfume.application.port.in.dto.PerfumeNameResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;
import io.perfume.api.perfume.application.port.out.PerfumeQueryRepository;
import io.perfume.api.perfume.domain.NotePyramid;
import io.perfume.api.perfume.domain.Perfume;
Expand Down Expand Up @@ -59,14 +60,14 @@ public Optional<Perfume> findPerfumeById(Long id) {
}

@Override
public List<SimplePerfumeResult> findPerfumesByIds(List<Long> ids) {
public List<SimplePerfumeThemeResult> findPerfumesByIds(List<Long> ids) {
return jpaQueryFactory
.select(
Projections.constructor(
SimplePerfumeResult.class,
SimplePerfumeThemeResult.class,
perfumeJpaEntity.id,
perfumeJpaEntity.name,
perfumeJpaEntity.concentration,
perfumeJpaEntity.story,
brandEntity.name,
fileJpaEntity.url))
.from(perfumeJpaEntity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
import java.util.List;

public record PerfumeThemeResult(
String title, String content, String thumbnail, List<SimplePerfumeResult> perfumes) {}
String title, String content, String thumbnail, List<SimplePerfumeThemeResult> perfumes) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.perfume.api.perfume.application.port.in.dto;

public record SimplePerfumeThemeResult(
Long id, String name, String story, String brandName, String thumbnail) {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.perfume.api.common.page.CustomSlice;
import io.perfume.api.perfume.application.port.in.dto.PerfumeNameResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;
import io.perfume.api.perfume.domain.NotePyramid;
import io.perfume.api.perfume.domain.Perfume;
import java.util.List;
Expand All @@ -15,7 +16,7 @@ public interface PerfumeQueryRepository {

Optional<Perfume> findPerfumeById(Long id);

List<SimplePerfumeResult> findPerfumesByIds(List<Long> ids);
List<SimplePerfumeThemeResult> findPerfumesByIds(List<Long> ids);

NotePyramid getNotePyramidByPerfume(Long perfumeId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import io.perfume.api.perfume.application.exception.PerfumeThemeNotFoundException;
import io.perfume.api.perfume.application.port.in.GetPerfumeThemeUseCase;
import io.perfume.api.perfume.application.port.in.dto.PerfumeThemeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;
import io.perfume.api.perfume.application.port.out.PerfumeQueryRepository;
import io.perfume.api.perfume.application.port.out.PerfumeThemeQueryRepository;
import io.perfume.api.perfume.domain.PerfumeTheme;
Expand All @@ -26,7 +26,7 @@ public PerfumeThemeResult getRecentTheme() {
perfumeThemeQueryRepository
.getRecentTheme()
.orElseThrow(PerfumeThemeNotFoundException::new);
List<SimplePerfumeResult> perfumes =
List<SimplePerfumeThemeResult> perfumes =
perfumeQueryRepository.findPerfumesByIds(perfumeTheme.getPerfumeIds());
String thumbnail =
findFileUseCase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
import io.perfume.api.perfume.application.exception.PerfumeThemeNotFoundException;
import io.perfume.api.perfume.application.port.in.GetPerfumeThemeUseCase;
import io.perfume.api.perfume.application.port.in.dto.PerfumeThemeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeResult;
import io.perfume.api.perfume.domain.Concentration;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -49,11 +48,11 @@ void setUp(

@Test
void getRecentTheme() throws Exception {
List<SimplePerfumeResult> perfumes = new ArrayList<>();
List<SimplePerfumeThemeResult> perfumes = new ArrayList<>();
for (int i = 1; i < 4; i++) {
perfumes.add(
new SimplePerfumeResult(
(long) i, "No." + i, Concentration.EAU_DE_TOILETTE, "샤넬", "test-url.com/" + i));
new SimplePerfumeThemeResult(
(long) i, "No." + i, "이 향수의 유래는 ...", "샤넬", "test-url.com/" + i));
}
PerfumeThemeResult perfumeThemeResult =
new PerfumeThemeResult(
Expand All @@ -78,10 +77,9 @@ void getRecentTheme() throws Exception {
fieldWithPath("thumbnail").description("테마 썸네일 URL"),
fieldWithPath("perfumes[].id").description("테마에 포함된 향수 ID"),
fieldWithPath("perfumes[].name").description("테마에 포함된 향수 이름"),
fieldWithPath("perfumes[].story").description("테마에 포함된 향수 스토리"),
fieldWithPath("perfumes[].thumbnail").description("테마에 포함된 향수 썸네일 URL"),
fieldWithPath("perfumes[].brandName").description("테마에 포함된 향수 브랜드 이름"),
fieldWithPath("perfumes[].strength").description("테마에 포함된 향수 강도"),
fieldWithPath("perfumes[].duration").description("테마에 포함된 향수 지속력"))));
fieldWithPath("perfumes[].brandName").description("테마에 포함된 향수 브랜드 이름"))));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.perfume.api.perfume.adapter.out.persistence.perfume;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
Expand All @@ -19,6 +20,7 @@
import io.perfume.api.perfume.adapter.out.persistence.perfumeNote.PerfumeNoteEntity;
import io.perfume.api.perfume.application.port.in.dto.PerfumeNameResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeResult;
import io.perfume.api.perfume.application.port.in.dto.SimplePerfumeThemeResult;
import io.perfume.api.perfume.domain.Concentration;
import io.perfume.api.perfume.domain.NotePyramid;
import io.perfume.api.perfume.domain.Perfume;
Expand Down Expand Up @@ -85,6 +87,43 @@ void findPerfumeById() {
assertNull(resultPerfume.getDeletedAt());
}

@Test
void findPerfumesByIds() {
// given
List<PerfumeJpaEntity> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(
PerfumeJpaEntity.builder()
.name("perfume" + i)
.story("story" + i)
.concentration(Concentration.EAU_DE_PARFUM)
.perfumeShopUrl("https://www.aesop.com/kr/p/fragrance/fresh/tacit-eau-de-parfum/")
.brandId(1L)
.categoryId(1L)
.thumbnailId(1L)
.build());
}
List<PerfumeJpaEntity> perfumeJpaEntities = perfumeJpaRepository.saveAll(list);
assertThat(perfumeJpaEntities).hasSize(5);

// when
List<SimplePerfumeThemeResult> perfumesByIds =
perfumeQueryPersistenceAdapter.findPerfumesByIds(
List.of(perfumeJpaEntities.get(0).getId(), perfumeJpaEntities.get(1).getId()));

// then
assertThat(perfumesByIds).hasSize(2);
assertThat(perfumesByIds.get(0).id()).isEqualTo(perfumeJpaEntities.get(0).getId());
assertThat(perfumesByIds.get(1).id()).isEqualTo(perfumeJpaEntities.get(1).getId());
}

@Test
void returnEmptyListIfFindPerfumesByNotExistingIds() {
List<SimplePerfumeThemeResult> perfumesByIds =
perfumeQueryPersistenceAdapter.findPerfumesByIds(List.of(1L, 3L));
assertThat(perfumesByIds).isEmpty();
}

@Test
void getNotePyramidIdsByPerfume() {
// given
Expand Down

0 comments on commit f87bd95

Please sign in to comment.