Skip to content

Commit

Permalink
Merge pull request #8 from team-acode/feat/fragrance
Browse files Browse the repository at this point in the history
feat: 상세페이지 - 기본 정보, 노트 정보
  • Loading branch information
yoonsseo authored Jan 10, 2024
2 parents 10b3827 + a53b053 commit 56f39d0
Show file tree
Hide file tree
Showing 21 changed files with 383 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package server.acode.domain.family.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import server.acode.domain.family.entity.Family;

@Repository
public interface FamilyRepository extends JpaRepository<Family, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package server.acode.domain.family.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import server.acode.domain.family.entity.Family;
import server.acode.domain.family.entity.FragranceFamily;
import server.acode.domain.fragrance.entity.Fragrance;

import java.util.List;

@Repository
public interface FragranceFamilyRepository extends JpaRepository<FragranceFamily, Long> {
@Query("SELECT ff.family FROM FragranceFamily ff WHERE ff.fragrance = :fragrance")
List<Family> findByFragrance(@Param("fragrance") Fragrance fragrance);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package server.acode.domain.family.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import server.acode.domain.family.entity.MainFamily;

@Repository
public interface MainFamilyRepository extends JpaRepository<MainFamily, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package server.acode.domain.fragrance.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
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 server.acode.domain.fragrance.dto.response.GetFragranceNote;
import server.acode.domain.fragrance.dto.response.GetFragranceResponse;
import server.acode.domain.fragrance.service.FragranceService;
import server.acode.domain.user.entity.User;

@RestController
@RequestMapping("/api/v1/fragrance")
@RequiredArgsConstructor
public class FragranceController {
private final FragranceService fragranceService;

@GetMapping("/{fragranceId}")
public GetFragranceResponse getFragranceDetail(
@PathVariable("fragranceId") Long fragranceId,
@AuthenticationPrincipal User user) {
return fragranceService.getFragranceDetail(fragranceId, user);
}

@GetMapping("/{fragranceId}/note")
public GetFragranceNote getFragranceNote(@PathVariable("fragranceId") Long fragranceId) {
return fragranceService.getFragranceNote(fragranceId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package server.acode.domain.fragrance.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import server.acode.domain.fragrance.entity.Capacity;

@Getter
@NoArgsConstructor
public class CapacityInfo {
private String capacity;
private int price;

@Builder
public CapacityInfo(Capacity capacity) {
this.capacity = capacity.getCapacity();
this.price = capacity.getPrice();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package server.acode.domain.fragrance.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import server.acode.domain.family.entity.Family;

@Getter
@NoArgsConstructor
public class FamilyInfo {
private Long familyId;
private String familyIcon;
private String familyName;

@Builder
public FamilyInfo(Family family) {
this.familyId = family.getId();
this.familyIcon = family.getIcon();
this.familyName = family.getKorName();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package server.acode.domain.fragrance.dto.response;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import server.acode.domain.fragrance.entity.Fragrance;

import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GetFragranceNote {
private Long fragranceId;
private boolean isSingle;
private List<NoteInfo> topNote;
private List<NoteInfo> middelNote;
private List<NoteInfo> baseNote;

public GetFragranceNote(Fragrance fragrance, List<NoteInfo> topNote, List<NoteInfo> middelNote, List<NoteInfo> baseNote) {
this.fragranceId = fragrance.getId();
this.isSingle = fragrance.isSingle();
this.topNote = topNote;
this.middelNote = middelNote;
this.baseNote = baseNote;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package server.acode.domain.fragrance.dto.response;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import server.acode.domain.fragrance.entity.Fragrance;

import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GetFragranceResponse {
private Long fragranceId;
private boolean isScraped;
private String thumbnail;
private String image1;
private String image2;

private String korBrand;
private String fragranceName;
private String concentration;

private List<FamilyInfo> familyList;
private List<CapacityInfo> capacityList;
private String style;

// @Builder
public GetFragranceResponse(Fragrance fragrance, boolean isScraped, List<FamilyInfo> familyList, List<CapacityInfo> capacityList) {
this.fragranceId = fragrance.getId();
this.thumbnail = fragrance.getThumbnail();
this.image1 = fragrance.getImage1();
this.image2 = fragrance.getImage2();
this.korBrand = fragrance.getKorBrand();
this.fragranceName = fragrance.getName();
this.concentration = fragrance.getConcentration().name();
this.style = fragrance.getStyle();

this.isScraped = isScraped;
this.familyList = familyList;
this.capacityList = capacityList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package server.acode.domain.fragrance.dto.response;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import server.acode.domain.ingredient.entity.Ingredient;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class NoteInfo {
private Long ingredientId;
private String ingredientName;
private String acode; // 어코드 설명

public NoteInfo(Ingredient ingredient) {
this.ingredientId = ingredient.getId();
this.ingredientName = ingredient.getKorName();
this.acode = ingredient.getAcode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,20 @@ public class Fragrance extends BaseTimeEntity {
private String engBrand; // 브랜드 영어 이름


@Column(columnDefinition = "integer default 0")
private int rateSum; // 별점 총점

@Column(columnDefinition = "integer default 0")
private int reviewCnt; // 리뷰 수

@Column(length = 10)
@Enumerated(EnumType.STRING)
private Concentration concentration; // EDP, EDT, EDC

@Column(columnDefinition = "tinyint(0) default 0")
private boolean isSingle;

@Column(columnDefinition = "integer default 0")
private int view; // 조회수

private String poster; //포스터 이미지 url
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package server.acode.domain.fragrance.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import server.acode.domain.fragrance.entity.Capacity;
import server.acode.domain.fragrance.entity.Fragrance;

import java.util.List;
import java.util.Optional;

@Repository
public interface CapacityRepository extends JpaRepository<Capacity, Long> {
List<Capacity> findByFragrance(Fragrance fragrance);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package server.acode.domain.fragrance.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import server.acode.domain.fragrance.entity.Fragrance;

@Repository
public interface FragranceRepository extends JpaRepository<Fragrance, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package server.acode.domain.fragrance.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import server.acode.domain.family.entity.Family;
import server.acode.domain.family.repository.FragranceFamilyRepository;
import server.acode.domain.fragrance.dto.response.*;
import server.acode.domain.fragrance.entity.Capacity;
import server.acode.domain.fragrance.entity.Fragrance;
import server.acode.domain.fragrance.repository.CapacityRepository;
import server.acode.domain.fragrance.repository.FragranceRepository;
import server.acode.domain.ingredient.entity.Ingredient;
import server.acode.domain.ingredient.repository.BaseNoteRepository;
import server.acode.domain.ingredient.repository.MiddleNoteRepository;
import server.acode.domain.ingredient.repository.TopNoteRepository;
import server.acode.domain.user.entity.User;
import server.acode.domain.user.repository.ScrapRepository;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class FragranceService {
private final FragranceRepository fragranceRepository;

private final ScrapRepository scrapRepository;
private final FragranceFamilyRepository fragranceFamilyRepository;
private final CapacityRepository capacityRepository;

private final TopNoteRepository topNoteRepository;
private final MiddleNoteRepository middleNoteRepository;
private final BaseNoteRepository baseNoteRepository;

public GetFragranceResponse getFragranceDetail(Long fragranceId, User user) {
boolean isScraped = false;

Fragrance fragrance = fragranceRepository.findById(fragranceId)
.orElseThrow(RuntimeException::new); //FRAGRANCE_NOT_FOUND

isScraped = scrapRepository.findByUserAndFragrance(user, fragrance).isPresent();

List<Family> findFamilyList = fragranceFamilyRepository.findByFragrance(fragrance);
List<FamilyInfo> familyList = findFamilyList.stream().map(FamilyInfo::new).toList();

List<Capacity> findCapacityList = capacityRepository.findByFragrance(fragrance);
List<CapacityInfo> capacityList = findCapacityList.stream().map(CapacityInfo::new).toList();

return new GetFragranceResponse(fragrance, isScraped, familyList, capacityList);
}


public GetFragranceNote getFragranceNote(Long fragranceId) {
Fragrance fragrance = fragranceRepository.findById(fragranceId)
.orElseThrow(RuntimeException::new); //FRAGRANCE_NOT_FOUND

List<Ingredient> findTopNote = topNoteRepository.findByFragrance(fragrance);
List<NoteInfo> topNote = findTopNote.stream().map(NoteInfo::new).toList();

List<Ingredient> findMiddleNote = middleNoteRepository.findByFragrance(fragrance);
List<NoteInfo> middleNote = findMiddleNote.stream().map(NoteInfo::new).toList();

List<Ingredient> findBaseNote = baseNoteRepository.findByFragrance(fragrance);
List<NoteInfo> baseNote = findBaseNote.stream().map(NoteInfo::new).toList();

return new GetFragranceNote(fragrance, topNote, middleNote, baseNote);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ public class Ingredient extends BaseTimeEntity {

private String background; // 배경 url

//나중에 줄글 길면 도메인 수정해야 할 수도 있음
private String summary; // 향료 설명 줄글

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ingredient_type_id")
private IngredientType ingredientType;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package server.acode.domain.ingredient.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import server.acode.domain.fragrance.entity.Fragrance;
import server.acode.domain.ingredient.entity.BaseNote;
import server.acode.domain.ingredient.entity.Ingredient;

import java.util.List;

@Repository
public interface BaseNoteRepository extends JpaRepository<BaseNote, Long> {
@Query("SELECT bn.ingredient FROM BaseNote bn WHERE bn.fragrance = :fragrance")
List<Ingredient> findByFragrance(@Param("fragrance") Fragrance fragrance);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package server.acode.domain.ingredient.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import server.acode.domain.ingredient.entity.Ingredient;

@Repository
public interface IngredientRepository extends JpaRepository<Ingredient, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package server.acode.domain.ingredient.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import server.acode.domain.ingredient.entity.IngredientType;

@Repository
public interface IngredientTypeRepository extends JpaRepository<IngredientType, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package server.acode.domain.ingredient.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import server.acode.domain.fragrance.entity.Fragrance;
import server.acode.domain.ingredient.entity.Ingredient;
import server.acode.domain.ingredient.entity.MiddleNote;

import java.util.List;

@Repository
public interface MiddleNoteRepository extends JpaRepository<MiddleNote, Long> {
@Query("SELECT mn.ingredient FROM MiddleNote mn WHERE mn.fragrance = :fragrance")
List<Ingredient> findByFragrance(@Param("fragrance") Fragrance fragrance);
}
Loading

0 comments on commit 56f39d0

Please sign in to comment.