diff --git a/src/main/java/com/drinkeg/drinkeg/domain/comment/domain/Comment.java b/src/main/java/com/drinkeg/drinkeg/domain/comment/domain/Comment.java index 37fbfdcf..1edc28dd 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/comment/domain/Comment.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/comment/domain/Comment.java @@ -6,19 +6,14 @@ import com.drinkeg.drinkeg.domain.party.domain.Party; import com.drinkeg.drinkeg.domain.recomment.domain.Recomment; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.ArrayList; import java.util.List; @Entity @Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Comment extends BaseEntity { @Id @@ -36,11 +31,27 @@ public class Comment extends BaseEntity { private String content; @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL, orphanRemoval = true) - private List recomments = new ArrayList<>(); + private List recomments; - @Builder.Default private boolean isDeleted = false; + public static Comment create(Member member, Party party, String content) { + return Comment.builder() + .member(member) + .party(party) + .content(content) + .build(); + } + + @Builder + public Comment(Party party, Member member, String content, List recomments) { + this.party = party; + this.member = member; + this.content = content; + this.recomments = recomments != null ? recomments : new ArrayList<>(); + this.isDeleted = false; + } + public void addRecomment(Recomment recomment) { this.recomments.add(recomment); recomment.setParentComment(this); // 자식의 참조도 설정 diff --git a/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentRequestDTO.java b/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentRequestDTO.java index 159e3293..ab0de02d 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentRequestDTO.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentRequestDTO.java @@ -18,11 +18,6 @@ public class CommentRequestDTO { public static Comment toEntity(CommentRequestDTO commentRequest, Party party, Member member) { - return Comment.builder() - .party(party) - .member(member) - .content(commentRequest.getContent()) - .isDeleted(false) // 기본값 설정 - .build(); + return Comment.create(member, party, commentRequest.getContent()); } } \ No newline at end of file diff --git a/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentResponseDTO.java b/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentResponseDTO.java index 42f59e14..cc67c05e 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentResponseDTO.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/comment/dto/CommentResponseDTO.java @@ -48,11 +48,9 @@ public static CommentResponseDTO fromEntity(Comment comment, String timeAgo, Str public static Comment setDeleted(Comment comment) { comment = Comment.builder() - .id(comment.getId()) .party(comment.getParty()) .member(comment.getMember()) .content("삭제된 댓글입니다.") - .isDeleted(true) .build(); return comment; } diff --git a/src/main/java/com/drinkeg/drinkeg/domain/member/domain/Member.java b/src/main/java/com/drinkeg/drinkeg/domain/member/domain/Member.java index da59c1ff..d31da9e5 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/member/domain/Member.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/member/domain/Member.java @@ -64,19 +64,19 @@ public class Member { private boolean agreement; - - // CascadeType.ALL: Member 엔티티가 삭제되면 연관된 TastingNote 엔티티도 삭제 - @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "member") private List tastingNotes = new ArrayList<>(); - @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) + // CascadeType.REMOVE: Member 엔티티가 삭제되면 연관된 WineWishlist 엔티티도 삭제 + @OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true) private List wineWishlists = new ArrayList<>(); - @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) + // CascadeType.REMOVE: Member 엔티티가 삭제되면 연관된 MyWine 엔티티도 삭제 + @OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true) private List myWines = new ArrayList<>(); @Builder - private Member(String name, String email, Role role, Provider provider, String username, String password, + public Member(String name, String email, Role role, Provider provider, String username, String password, String region, Boolean isNewbie, Boolean isFirst, Long monthPriceMax, List wineSort, List wineArea, boolean agreement, boolean isAdult) { this.name = name; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/myWine/controller/request/MyWineRequest.java b/src/main/java/com/drinkeg/drinkeg/domain/myWine/controller/request/MyWineRequest.java index ec4f7a81..3d6daf37 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/myWine/controller/request/MyWineRequest.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/myWine/controller/request/MyWineRequest.java @@ -2,17 +2,14 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDate; @Getter @Builder @AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class MyWineRequest { @NotNull(message = "와인 id는 null 일 수 없습니다.") diff --git a/src/main/java/com/drinkeg/drinkeg/domain/myWine/domain/MyWine.java b/src/main/java/com/drinkeg/drinkeg/domain/myWine/domain/MyWine.java index d17fb049..27bfe55f 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/myWine/domain/MyWine.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/myWine/domain/MyWine.java @@ -18,11 +18,11 @@ public class MyWine { private Long id; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") + @JoinColumn(name = "member_id", nullable = false) private Member member; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "wine_id") + @JoinColumn(name = "wine_id", nullable = false) private Wine wine; private LocalDate purchaseDate; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/myWine/dto/response/MyWineResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/myWine/dto/response/MyWineResponse.java index 4bb42105..cb799f4b 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/myWine/dto/response/MyWineResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/myWine/dto/response/MyWineResponse.java @@ -2,10 +2,7 @@ import com.drinkeg.drinkeg.domain.myWine.domain.MyWine; import com.drinkeg.drinkeg.domain.wine.domain.Wine; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDate; import java.time.temporal.ChronoUnit; @@ -13,7 +10,7 @@ @Getter @Builder @AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class MyWineResponse { private Long myWineid; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/controller/TastingNoteController.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/controller/TastingNoteController.java index 4794e1fa..45dcb514 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/controller/TastingNoteController.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/controller/TastingNoteController.java @@ -78,14 +78,4 @@ public ApiResponse deleteTastingNote(@AuthenticationPrincipal PrincipalD return ApiResponse.onSuccess("노트 삭제 완료"); } - // 선택한 노트 보기 - @GetMapping("/nose") - @Operation(summary = "사용자가 선택/직접입력 한 Nose List 보여주기", description = "사용자가 선택/집접입력 한 Noes List 보여주기") - - public ApiResponse>> showMemberNoseMapList(@AuthenticationPrincipal PrincipalDetail principalDetail) { - - List> noseMapList = - tastingNoteService.showMemberNoseMapList(principalDetail.getUsername()); - return ApiResponse.onSuccess(noseMapList); - } } diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNote.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNote.java index dfe81ade..0285ef36 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNote.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNote.java @@ -6,16 +6,18 @@ import com.drinkeg.drinkeg.domain.wine.domain.Wine; import jakarta.persistence.*; import lombok.*; +import lombok.extern.slf4j.Slf4j; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import static jakarta.persistence.FetchType.*; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Slf4j public class TastingNote extends BaseEntity { @Id @@ -51,6 +53,25 @@ public class TastingNote extends BaseEntity { private String review; + @Builder + public TastingNote(Member member, Wine wine, String color, LocalDate tasteDate, + int sugarContent, int acidity, int tannin, int body, int alcohol, + List noseList, float rating, String review) { + this.member = member; + this.wine = wine; + this.color = color; + this.tasteDate = tasteDate; + this.sugarContent = sugarContent; + this.acidity = acidity; + this.tannin = tannin; + this.body = body; + this.alcohol = alcohol; + this.noseList = noseList != null ? noseList : new ArrayList<>(); + this.rating = rating; + this.review = review; + } + + // TastingNote 생성 매서드 public static TastingNote create(Member member, Wine wine, TastingNoteRequest tastingNoteRequest) { TastingNote tastingNote = TastingNote.builder() .member(member) @@ -65,9 +86,10 @@ public static TastingNote create(Member member, Wine wine, TastingNoteRequest ta .rating(tastingNoteRequest.getRating()) .review(tastingNoteRequest.getReview()) .build(); - for (String noseElement : tastingNoteRequest.getNose()){ - tastingNote.addNoseElement(noseElement); - } + + Set uniqueNoseElements = new HashSet<>(tastingNoteRequest.getNose()); + uniqueNoseElements.forEach(tastingNote::addNoseElement); + return tastingNote; } @@ -78,55 +100,33 @@ public TastingNote addNoseElement(String noseElement) { return this; } - public TastingNote removeTastingNoteNose(TastingNoteNose tastingNoteNose) { - noseList.remove(tastingNoteNose); - tastingNoteNose.updateTastingNote(null); + public TastingNote removeNose(TastingNoteNose nose) { + this.noseList.remove(nose); + nose.updateTastingNote(null); return this; } - public void updateColor(String color) { - this.color = color; - } - public void updateTasteDate(LocalDate tasteDate) { - this.tasteDate = tasteDate; - } - public void updateSugarContent(int sugarContent) { - this.sugarContent = sugarContent; - } - public void updateAcidity(int acidity) { - this.acidity = acidity; - } - public void updateTannin(int tannin) { - this.tannin = tannin; - } - public void updateBody(int body) { - this.body = body; - } - public void updateAlcohol(int alcohol) { - this.alcohol = alcohol; - } - public void updateRating(float rating) { - this.rating = rating; - } - public void updateReview(String review) { - this.review = review; + + public void updateTastingNote(String color, LocalDate tasteDate, + Integer sugarContent, Integer acidity, Integer tannin, Integer body, Integer alcohol, + List updateNoseList, Float rating, String review){ + if (color != null) this.color = color; + if (tasteDate != null) this.tasteDate = tasteDate; + if (sugarContent != null) this.sugarContent = sugarContent; + if (acidity != null) this.acidity = acidity; + if (tannin != null) this.tannin = tannin; + if (body != null) this.body = body; + if (alcohol != null) this.alcohol = alcohol; + if (rating != null) this.rating = rating; + if (review != null) this.review = review; + if (updateNoseList != null) this.updateTastingNoteNoseList(updateNoseList); } - @Builder - public TastingNote(Member member, Wine wine, String color, LocalDate tasteDate, - int sugarContent, int acidity, int tannin, int body, int alcohol, - List noseList, float rating, String review) { - this.member = member; - this.wine = wine; - this.color = color; - this.tasteDate = tasteDate; - this.sugarContent = sugarContent; - this.acidity = acidity; - this.tannin = tannin; - this.body = body; - this.alcohol = alcohol; - this.noseList = noseList != null ? noseList : new ArrayList<>(); - this.rating = rating; - this.review = review; + public void updateTastingNoteNoseList(List updateNoseList) { + // 기존 noseList 전체 삭제 + noseList.forEach(this::removeNose); + // updateNoseList로 대체 + Set uniqueNoseElements = new HashSet<>(updateNoseList); + uniqueNoseElements.forEach(this::addNoseElement); } } diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNoteNose.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNoteNose.java index 54754450..7a8af4c7 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNoteNose.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/domain/TastingNoteNose.java @@ -6,6 +6,9 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + uniqueConstraints = @UniqueConstraint(columnNames = {"tasting_note_id", "nose_element"}) +) public class TastingNoteNose { @Id @@ -14,10 +17,11 @@ public class TastingNoteNose { // TastingNote와의 다대일 관계 설정 @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "tasting_note_id") + @JoinColumn(name = "tasting_note_id", nullable = false) private TastingNote tastingNote; // 향 요소 + @Column(nullable = false) private String noseElement; public void updateTastingNote(TastingNote tastingNote) { diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteRequest.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteRequest.java index e9ce9440..30df37fb 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteRequest.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteRequest.java @@ -1,15 +1,14 @@ package com.drinkeg.drinkeg.domain.tastingNote.dto.request; -import com.querydsl.core.annotations.QueryProjection; import jakarta.validation.constraints.*; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class TastingNoteRequest { @NotNull(message = "와인 ID는 필수입니다.") @@ -21,7 +20,6 @@ public class TastingNoteRequest { @NotNull(message = "시음 날짜는 필수입니다") private LocalDate tasteDate; - @NotNull(message = "당도 선택은 필수입니다.") @Min(value = 0, message = "당도는 0 이상 100 이하의 정수 값이어야 합니다.") @Max(value = 100, message = "당도는 0 이상 100 이하의 정수 값이어야 합니다.") @@ -50,7 +48,6 @@ public class TastingNoteRequest { @NotEmpty(message = "향 선택은 필수입니다.") private List nose = new ArrayList<>(); - @NotNull(message = "만족도 선택은 필수입니다.") @Min(value = 0, message = "만족도는 0 이상 5 이하의 실수 값이어야 합니다.") @Max(value = 5, message = "만족도는 0 이상 5 이하의 실수 값이어야 합니다.") diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteUpdateRequest.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteUpdateRequest.java index 70830ce9..b12557e7 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteUpdateRequest.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/request/TastingNoteUpdateRequest.java @@ -33,8 +33,7 @@ public class TastingNoteUpdateRequest { @Max(value = 100, message = "알콜도는 0 이상 100 이하의 정수 값이어야 합니다.") private Integer alcohol; - private final List addNoseList = new ArrayList<>(); - private final List removeNoseList = new ArrayList<>(); + private final List updateNoseList = new ArrayList<>(); @Min(0) @Max(5) diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/response/TastingNoteResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/response/TastingNoteResponse.java index 7752f75b..e7e7c37b 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/response/TastingNoteResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/dto/response/TastingNoteResponse.java @@ -5,6 +5,7 @@ import lombok.Builder; import com.drinkeg.drinkeg.domain.wine.domain.Wine; import com.querydsl.core.annotations.QueryProjection; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -16,7 +17,7 @@ import java.util.stream.Collectors; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class TastingNoteResponse { private Long noteId; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepository.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepository.java deleted file mode 100644 index b99bb2af..00000000 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.drinkeg.drinkeg.domain.tastingNote.repository; - -import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNoteNose; -import org.springframework.data.jpa.repository.JpaRepository; - - -public interface TastingNoteNoseRepository extends JpaRepository, TastingNoteNoseRepositoryCustom { - - -} diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryCustom.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryCustom.java deleted file mode 100644 index 844dd746..00000000 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryCustom.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.drinkeg.drinkeg.domain.tastingNote.repository; - -import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNoteNose; - -import java.util.List; - -public interface TastingNoteNoseRepositoryCustom { - - List getTastingNoteNoseListByUsername(String username); -} diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryImpl.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryImpl.java deleted file mode 100644 index 74bbd2ff..00000000 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/repository/TastingNoteNoseRepositoryImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.drinkeg.drinkeg.domain.tastingNote.repository; - -import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNoteNose; -import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static com.drinkeg.drinkeg.domain.tastingNote.domain.QTastingNote.tastingNote; -import static com.drinkeg.drinkeg.domain.tastingNote.domain.QTastingNoteNose.tastingNoteNose; - - -@Repository -@RequiredArgsConstructor -@Transactional -public class TastingNoteNoseRepositoryImpl implements TastingNoteNoseRepositoryCustom { - - private final JPAQueryFactory queryFactory; - - @Override - public List getTastingNoteNoseListByUsername(String username) { - return queryFactory.selectFrom(tastingNoteNose) - .join(tastingNoteNose.tastingNote, tastingNote) - .where(tastingNote.member.username.eq(username)) - .fetch(); - } -} diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteService.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteService.java index b80b5038..de2aeda7 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteService.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteService.java @@ -22,8 +22,6 @@ public interface TastingNoteService { Long deleteTastingNote(Long noteId, String username); - List> showMemberNoseMapList(String username); - public void setTastingNoteMemberNull(String username); } \ No newline at end of file diff --git a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteServiceImpl.java b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteServiceImpl.java index 06c55c01..e19f7db9 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteServiceImpl.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/tastingNote/service/TastingNoteServiceImpl.java @@ -6,13 +6,11 @@ import com.drinkeg.drinkeg.global.apipayLoad.code.status.ErrorStatus; import com.drinkeg.drinkeg.domain.member.domain.Member; import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNote; -import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNoteNose; import com.drinkeg.drinkeg.domain.tastingNote.dto.request.TastingNoteRequest; import com.drinkeg.drinkeg.domain.tastingNote.dto.request.TastingNoteUpdateRequest; import com.drinkeg.drinkeg.domain.tastingNote.dto.response.AllTastingNoteResponse; import com.drinkeg.drinkeg.domain.tastingNote.dto.response.TastingNotePreviewResponse; import com.drinkeg.drinkeg.domain.tastingNote.dto.response.TastingNoteResponse; -import com.drinkeg.drinkeg.domain.tastingNote.repository.TastingNoteNoseRepository; import com.drinkeg.drinkeg.domain.tastingNote.repository.TastingNoteRepository; import com.drinkeg.drinkeg.domain.wine.domain.Wine; import com.drinkeg.drinkeg.domain.wine.repository.WineRepository; @@ -25,7 +23,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.stream.Collectors; @Slf4j @Service @@ -34,7 +31,6 @@ public class TastingNoteServiceImpl implements TastingNoteService { private final TastingNoteRepository tastingNoteRepository; - private final TastingNoteNoseRepository tastingNoteNoseRepository; private final WineRepository wineRepository; private final MemberRepository memberRepository; @@ -86,9 +82,29 @@ public AllTastingNoteResponse findAllTastingNote(TastingNoteWineSort wineSort, S return AllTastingNoteResponse.create(tastingNoteSortCountResponse, tastingNotePreviewResponseList); } + // 와인 타입별 필터링 로직 + private boolean filterBySort(TastingNote note, String sort) { + String wineSort = note.getWine().getSort(); + + switch (sort) { + case "red": + return wineSort.contains("레드"); + case "white": + return wineSort.contains("화이트"); + case "sparkling": + return wineSort.contains("스파클링"); + case "rose": + return wineSort.contains("로제"); + case "all": + return true; // 전체 보기 + default: + return !wineSort.contains("레드") && !wineSort.contains("화이트") + && !wineSort.contains("스파클링") && !wineSort.contains("로제"); + } + } @Override - public void updateTastingNote(Long noteId, TastingNoteUpdateRequest tastingNoteUpdateRequest, String username) { + public void updateTastingNote(Long noteId, TastingNoteUpdateRequest t, String username) { // 회원을 조회한다. Member member = memberRepository.findByUsername(username).orElseThrow( @@ -106,49 +122,9 @@ public void updateTastingNote(Long noteId, TastingNoteUpdateRequest tastingNoteU } // TastingNote를 업데이트한다. - if(tastingNoteUpdateRequest.getColor() != null) { - foundNote.updateColor(tastingNoteUpdateRequest.getColor()); - } - if(tastingNoteUpdateRequest.getTastingDate() != null) { - foundNote.updateTasteDate(tastingNoteUpdateRequest.getTastingDate()); - } - - if(tastingNoteUpdateRequest.getSugarContent() != null) { - foundNote.updateSugarContent(tastingNoteUpdateRequest.getSugarContent()); - } - if(tastingNoteUpdateRequest.getAcidity() != null) { - foundNote.updateAcidity(tastingNoteUpdateRequest.getAcidity()); - } - if(tastingNoteUpdateRequest.getTannin() != null) { - foundNote.updateTannin(tastingNoteUpdateRequest.getTannin()); - } - if(tastingNoteUpdateRequest.getBody() != null) { - foundNote.updateBody(tastingNoteUpdateRequest.getBody()); - } - if(tastingNoteUpdateRequest.getAlcohol() != null) { - foundNote.updateAlcohol(tastingNoteUpdateRequest.getAlcohol()); - } - - List addNoseList = tastingNoteUpdateRequest.getAddNoseList(); - if(!addNoseList.isEmpty()){ - for(String addNose: addNoseList){ - foundNote.addNoseElement(addNose); - } - } - - List removeNoseList = tastingNoteUpdateRequest.getRemoveNoseList(); - if(!removeNoseList.isEmpty()){ - for(Long removeNoseId: removeNoseList){ - removeNoseElement(removeNoseId); - } - } - - if(tastingNoteUpdateRequest.getRating() != null) { - foundNote.updateRating(tastingNoteUpdateRequest.getRating()); - } - if(tastingNoteUpdateRequest.getReview() != null) { - foundNote.updateReview(tastingNoteUpdateRequest.getReview()); - } + foundNote.updateTastingNote(t.getColor(), t.getTastingDate(), + t.getSugarContent(), t.getAcidity(), t.getTannin(), t.getBody(), t.getAlcohol(), + t.getUpdateNoseList(), t.getRating(), t.getReview()); tastingNoteRepository.save(foundNote); @@ -182,26 +158,9 @@ public Long deleteTastingNote(Long noteId, String username) { return noteId; } - @Override - public List> showMemberNoseMapList(String username) { - - // 사용자가 작성한 TastingNoteNose 리스트 가져오기 - List tastingNoteNoseList = tastingNoteNoseRepository.getTastingNoteNoseListByUsername(username); - - // TastingNoteNose 리스트를 Map으로 변환 - return tastingNoteNoseList.stream() - .map(nose -> Map.of(nose.getId(), nose.getNoseElement())) - .collect(Collectors.toList()); - - } - // 회원 탈퇴 시 탈퇴한 회원의 테이스팅 노트의 member_id null 로 설정 @Override public void setTastingNoteMemberNull(String username) { tastingNoteRepository.updateTastingNoteMemberNull(username); } - - private void removeNoseElement(Long noseElementId){ - tastingNoteNoseRepository.deleteById(noseElementId); - } } diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/HomeWineResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/HomeWineResponse.java index 7b2a5afa..a5caddc7 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/HomeWineResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/HomeWineResponse.java @@ -1,13 +1,13 @@ package com.drinkeg.drinkeg.domain.wine.dto.response; import com.drinkeg.drinkeg.domain.wine.domain.Wine; -import com.querydsl.core.annotations.QueryProjection; import lombok.Builder; +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class HomeWineResponse { private Long wineId; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WinePreviewResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WinePreviewResponse.java index 53b142d8..4a4bb720 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WinePreviewResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WinePreviewResponse.java @@ -5,7 +5,8 @@ import lombok.*; @Getter -@NoArgsConstructor +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class WinePreviewResponse { private Long wineId; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineReviewResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineReviewResponse.java index af56bdeb..d5052c40 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineReviewResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineReviewResponse.java @@ -3,13 +3,14 @@ import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNote; import com.querydsl.core.annotations.QueryProjection; import lombok.Builder; +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class WineReviewResponse { private String name; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineWithThreeReviewsResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineWithThreeReviewsResponse.java index 727cd46f..96816750 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineWithThreeReviewsResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wine/dto/response/WineWithThreeReviewsResponse.java @@ -3,6 +3,7 @@ import com.drinkeg.drinkeg.domain.tastingNote.domain.TastingNote; import com.drinkeg.drinkeg.domain.wine.domain.Wine; import com.querydsl.core.annotations.QueryProjection; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,7 +11,7 @@ import java.util.List; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class WineWithThreeReviewsResponse { private WineInfoResponse wineInfoResponse; private List recentReviews; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wine/repository/WineRepositoryImpl.java b/src/main/java/com/drinkeg/drinkeg/domain/wine/repository/WineRepositoryImpl.java index 647fdcc7..b670c7ed 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wine/repository/WineRepositoryImpl.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wine/repository/WineRepositoryImpl.java @@ -1,7 +1,6 @@ package com.drinkeg.drinkeg.domain.wine.repository; import com.drinkeg.drinkeg.domain.wine.domain.Wine; -import com.drinkeg.drinkeg.domain.wine.dto.response.*; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wineNote/domain/WineNote.java b/src/main/java/com/drinkeg/drinkeg/domain/wineNote/domain/WineNote.java new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/com/drinkeg/drinkeg/domain/wineWishlist/dto/response/WineWishlistResponse.java b/src/main/java/com/drinkeg/drinkeg/domain/wineWishlist/dto/response/WineWishlistResponse.java index e83e1736..5e73f850 100644 --- a/src/main/java/com/drinkeg/drinkeg/domain/wineWishlist/dto/response/WineWishlistResponse.java +++ b/src/main/java/com/drinkeg/drinkeg/domain/wineWishlist/dto/response/WineWishlistResponse.java @@ -2,13 +2,14 @@ import com.drinkeg.drinkeg.domain.wine.dto.response.WinePreviewResponse; import com.querydsl.core.annotations.QueryProjection; +import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @Builder -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class WineWishlistResponse { private Long id; private WinePreviewResponse wine;