|
1 | 1 | package umc.th.juinjang.api.note.shared.service; |
2 | 2 |
|
3 | | -import java.util.Comparator; |
4 | | -import java.util.HashSet; |
5 | | -import java.util.List; |
6 | | -import java.util.Map; |
7 | | -import java.util.Set; |
8 | | -import java.util.stream.Collectors; |
9 | | -import java.util.stream.IntStream; |
10 | | - |
| 3 | +import lombok.RequiredArgsConstructor; |
| 4 | +import lombok.extern.slf4j.Slf4j; |
11 | 5 | import org.springframework.data.domain.Page; |
12 | 6 | import org.springframework.data.domain.Pageable; |
13 | 7 | import org.springframework.stereotype.Service; |
14 | 8 | import org.springframework.transaction.annotation.Transactional; |
15 | | - |
16 | | -import lombok.RequiredArgsConstructor; |
17 | | -import lombok.extern.slf4j.Slf4j; |
18 | 9 | import umc.th.juinjang.api.checklist.service.ChecklistAnswerFinder; |
19 | 10 | import umc.th.juinjang.api.checklist.service.ReportFinder; |
20 | 11 | import umc.th.juinjang.api.checklist.service.response.ChecklistAnswerResponseDTO; |
|
40 | 31 | import umc.th.juinjang.domain.pencil.used.model.UsedPencil; |
41 | 32 | import umc.th.juinjang.domain.report.model.Report; |
42 | 33 |
|
| 34 | +import java.util.*; |
| 35 | +import java.util.stream.Collectors; |
| 36 | +import java.util.stream.IntStream; |
| 37 | + |
43 | 38 | @Service |
44 | 39 | @Slf4j |
45 | 40 | @RequiredArgsConstructor |
46 | 41 | public class SharedNoteQueryService { |
47 | 42 |
|
48 | | - private final UsedPencilFinder usedPencilFinder; |
49 | | - private final SharedNoteFinder sharedNoteFinder; |
50 | | - private final LikedNoteFinder likedNoteFinder; |
51 | | - private final ChecklistAnswerFinder checklistAnswerFinder; |
52 | | - private final ViewCountService viewCountService; |
53 | | - private final ReportFinder reportFinder; |
54 | | - |
55 | | - @Transactional |
56 | | - public SharedNoteGetResponse findSharedNote(Member member, Long sharedNoteId) { |
57 | | - SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
58 | | - Limjang limjang = sharedNote.getLimjang(); |
59 | | - |
60 | | - boolean isBuyerOrOwner = getIsBuyerOrOwner(member, sharedNote); |
61 | | - |
62 | | - long viewCount = viewCountService.getViewCount(member, sharedNote); |
63 | | - |
64 | | - Integer countBuyer = makeBuyerCount(usedPencilFinder.countBySharedNoteId(sharedNoteId)); |
65 | | - boolean isLiked = likedNoteFinder.existsByMemberAndSharedNote(member, sharedNote); |
66 | | - |
67 | | - if (isBuyerOrOwner) { |
68 | | - return SharedNoteGetResponse.ofPurchased(isBuyerOrOwner, limjang, limjang.getAddressEntity(), sharedNote, |
69 | | - sharedNote.getMember(), countBuyer, isLiked, viewCount); |
70 | | - } else { |
71 | | - return SharedNoteGetResponse.ofNotPurchased(isBuyerOrOwner, limjang, limjang.getAddressEntity(), sharedNote, |
72 | | - sharedNote.getMember(), countBuyer, isLiked, viewCount); |
73 | | - } |
74 | | - } |
75 | | - |
76 | | - private boolean getIsBuyerOrOwner(Member requestMember, SharedNote sharedNote) { |
77 | | - return usedPencilFinder.existsByMemberAndSharedNoteId(requestMember, sharedNote.getSharedNoteId()) || |
78 | | - sharedNote.getMember().getMemberId().equals(requestMember.getMemberId()); |
79 | | - } |
80 | | - |
81 | | - private Integer makeBuyerCount(int count) { |
82 | | - if (count >= 100) { |
83 | | - return 100; |
84 | | - } else if (count >= 50) { |
85 | | - return 50; |
86 | | - } else if (count >= 30) { |
87 | | - return 30; |
88 | | - } else if (count >= 10) { |
89 | | - return 10; |
90 | | - } |
91 | | - return null; |
92 | | - } |
93 | | - |
94 | | - @Transactional(readOnly = true) |
95 | | - public SharedNoteExploreGetResponse findExploreSharedNote(Member member, List<String> code, |
96 | | - ExploreSortType sort, |
97 | | - LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword, |
98 | | - Pageable pageable) { |
99 | | - |
100 | | - Page<SharedNote> pages = sharedNoteFinder.findSharedNoteInExployer(code, sort, propertyType, priceType, keyword, |
101 | | - pageable); |
102 | | - List<SharedNote> sharedNotes = pages.getContent(); |
103 | | - List<Long> ids = sharedNotes.stream().map(SharedNote::getSharedNoteId).toList(); |
104 | | - |
105 | | - Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
106 | | - Set<Long> purchasedIds = new HashSet<>(usedPencilFinder.findByMemberInSharedNoteIdsAndTypeIsOwned(member, ids)); |
107 | | - |
108 | | - Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
109 | | - return SharedNoteExploreGetResponse.of(pages.getTotalElements(), sharedNotes, purchasedIds, likedNoteIds, |
110 | | - viewcountMap, member.getMemberId()); |
111 | | - } |
112 | | - |
113 | | - private Map<Long, Long> mapIdsAndViewcount(List<SharedNote> sharedNotes) { |
114 | | - return sharedNotes.stream().collect(Collectors.toMap( |
115 | | - SharedNote::getSharedNoteId, |
116 | | - SharedNote::getViewCount |
117 | | - )); |
118 | | - } |
119 | | - |
120 | | - public UserSharedNotesGetResponse findUserSharedNotes(Member member, NoteType noteType, |
121 | | - LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
122 | | - |
123 | | - switch (noteType) { |
124 | | - case LIKED -> { |
125 | | - return getUserLikedSharedNotes(member, propertyType, priceType, keyword); |
126 | | - } |
127 | | - case SHARED -> { |
128 | | - return getUserSharedNotes(member, noteType, propertyType, priceType, keyword); |
129 | | - } |
130 | | - case OWNED -> { |
131 | | - return getUserOwnedSharedNotes(member, noteType, propertyType, priceType, keyword); |
132 | | - } |
133 | | - default -> throw new SharedNoteHandler(ErrorStatus.SHAREDNOTE_TYPE_ERROR); |
134 | | - } |
135 | | - } |
136 | | - |
137 | | - private UserSharedNotesGetResponse getUserOwnedSharedNotes(Member member, NoteType noteType, |
138 | | - LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
139 | | - |
140 | | - List<UsedPencil> usedPencils = usedPencilFinder.findAllByMemberAndTypeIsOwnedOrderByCreatedAtDesc(member); |
141 | | - List<Long> sharedNoteIds = usedPencils.stream().map(UsedPencil::getSharedNoteId).toList(); |
142 | | - |
143 | | - List<SharedNote> sharedNotes = sharedNoteFinder.findUserSharedNotes(member, noteType, propertyType, priceType, |
144 | | - keyword, sharedNoteIds); |
145 | | - List<SharedNote> sortedSharedNotes = sortByUsedPencilCreatedAt(sharedNoteIds, sharedNotes); |
146 | | - |
147 | | - Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
148 | | - Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
149 | | - |
150 | | - return UserSharedNotesGetResponse.ofOwned(sortedSharedNotes, likedNoteIds, viewcountMap); |
151 | | - } |
152 | | - |
153 | | - private List<SharedNote> sortByUsedPencilCreatedAt(List<Long> sharedNoteIds, List<SharedNote> sharedNotes) { |
154 | | - Map<Long, Integer> orderMap = IntStream.range(0, sharedNoteIds.size()) |
155 | | - .boxed() |
156 | | - .collect(Collectors.toMap(sharedNoteIds::get, i -> i)); |
157 | | - |
158 | | - return sharedNotes.stream() |
159 | | - .sorted(Comparator.comparingInt(note -> orderMap.get(note.getSharedNoteId()))) |
160 | | - .toList(); |
161 | | - } |
162 | | - |
163 | | - private UserSharedNotesGetResponse getUserSharedNotes(Member member, NoteType noteType, |
164 | | - LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
165 | | - List<SharedNote> sharedNotes = sharedNoteFinder.findUserSharedNotes(member, noteType, propertyType, priceType, |
166 | | - keyword, List.of()); |
167 | | - Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
168 | | - |
169 | | - Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
170 | | - return UserSharedNotesGetResponse.ofShared(member, sharedNotes, likedNoteIds, viewcountMap); |
171 | | - } |
172 | | - |
173 | | - private UserSharedNotesGetResponse getUserLikedSharedNotes(Member member, LimjangPropertyType propertyType, |
174 | | - LimjangPriceType priceType, String keyword) { |
175 | | - |
176 | | - List<LikedNote> userLikedNotes = likedNoteFinder.findAllByMemberAndDynamic(member, propertyType, |
177 | | - priceType, keyword); |
178 | | - List<SharedNote> sharedNotes = userLikedNotes.stream().map(LikedNote::getSharedNote).toList(); |
179 | | - |
180 | | - Set<Long> purchasedIds = new HashSet<>(usedPencilFinder.findByMemberInSharedNoteIdsAndTypeIsOwned(member, |
181 | | - sharedNotes.stream().map(SharedNote::getSharedNoteId).toList())); |
182 | | - Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
183 | | - |
184 | | - return UserSharedNotesGetResponse.ofLiked(sharedNotes, purchasedIds, viewcountMap, member.getMemberId()); |
185 | | - } |
186 | | - |
187 | | - @Transactional(readOnly = true) |
188 | | - public SharedNoteCheckListAndReviewResponse findChecklistAndReview(Member member, Long sharedNoteId) { |
189 | | - SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
190 | | - Limjang note = sharedNote.getLimjang(); |
191 | | - List<ChecklistAnswerResponseDTO.AnswerDto> answers = checklistAnswerFinder.findByLimjangId( |
192 | | - note.getLimjangId()); |
193 | | - |
194 | | - Report report = reportFinder.findReportByNote(note); |
195 | | - |
196 | | - boolean isOwned = usedPencilFinder.existsByMemberAndSharedNoteId(member, sharedNoteId); |
197 | | - // ๊ตฌ๋งคํ๋ค๋ฉด review ํฌํจ, ์๋๋ฉด null |
198 | | - String review = isOwned ? sharedNote.getReview() : null; |
199 | | - Float totalRate = isOwned ? report.getTotalRate() : null; |
200 | | - return new SharedNoteCheckListAndReviewResponse(review, totalRate, answers); |
201 | | - } |
202 | | - |
203 | | - public ReportWithLimjangResponseDTO getReportBySharedNoteId(Long sharedNoteId) { |
204 | | - SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
205 | | - Limjang note = sharedNote.getLimjang(); |
206 | | - Report report = reportFinder.findReportByNote(note); |
207 | | - return new ReportWithLimjangResponseDTO(ReportGetResponse.of(report), LimjangDetailGetResponse.of(note)); |
208 | | - } |
| 43 | + private final UsedPencilFinder usedPencilFinder; |
| 44 | + private final SharedNoteFinder sharedNoteFinder; |
| 45 | + private final LikedNoteFinder likedNoteFinder; |
| 46 | + private final ChecklistAnswerFinder checklistAnswerFinder; |
| 47 | + private final ViewCountService viewCountService; |
| 48 | + private final ReportFinder reportFinder; |
| 49 | + |
| 50 | + @Transactional |
| 51 | + public SharedNoteGetResponse findSharedNote(Member member, Long sharedNoteId) { |
| 52 | + SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
| 53 | + Limjang limjang = sharedNote.getLimjang(); |
| 54 | + |
| 55 | + boolean isBuyerOrOwner = getIsBuyerOrOwner(member, sharedNote); |
| 56 | + |
| 57 | + long viewCount = viewCountService.getViewCount(member, sharedNote); |
| 58 | + |
| 59 | + Integer countBuyer = makeBuyerCount(usedPencilFinder.countBySharedNoteId(sharedNoteId)); |
| 60 | + boolean isLiked = likedNoteFinder.existsByMemberAndSharedNote(member, sharedNote); |
| 61 | + |
| 62 | + if (isBuyerOrOwner) { |
| 63 | + return SharedNoteGetResponse.ofPurchased(isBuyerOrOwner, limjang, limjang.getAddressEntity(), sharedNote, |
| 64 | + sharedNote.getMember(), countBuyer, isLiked, viewCount); |
| 65 | + } else { |
| 66 | + return SharedNoteGetResponse.ofNotPurchased(isBuyerOrOwner, limjang, limjang.getAddressEntity(), sharedNote, |
| 67 | + sharedNote.getMember(), countBuyer, isLiked, viewCount); |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + private boolean getIsBuyerOrOwner(Member requestMember, SharedNote sharedNote) { |
| 72 | + return usedPencilFinder.existsByMemberAndSharedNoteId(requestMember, sharedNote.getSharedNoteId()) || |
| 73 | + sharedNote.getMember().getMemberId().equals(requestMember.getMemberId()); |
| 74 | + } |
| 75 | + |
| 76 | + private Integer makeBuyerCount(int count) { |
| 77 | + if (count >= 100) { |
| 78 | + return 100; |
| 79 | + } else if (count >= 50) { |
| 80 | + return 50; |
| 81 | + } else if (count >= 30) { |
| 82 | + return 30; |
| 83 | + } else if (count >= 10) { |
| 84 | + return 10; |
| 85 | + } |
| 86 | + return null; |
| 87 | + } |
| 88 | + |
| 89 | + @Transactional(readOnly = true) |
| 90 | + public SharedNoteExploreGetResponse findExploreSharedNote(Member member, List<String> code, |
| 91 | + ExploreSortType sort, |
| 92 | + LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword, |
| 93 | + Pageable pageable) { |
| 94 | + |
| 95 | + Page<SharedNote> pages = sharedNoteFinder.findSharedNoteInExployer(code, sort, propertyType, priceType, keyword, |
| 96 | + pageable); |
| 97 | + List<SharedNote> sharedNotes = pages.getContent(); |
| 98 | + List<Long> ids = sharedNotes.stream().map(SharedNote::getSharedNoteId).toList(); |
| 99 | + |
| 100 | + Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
| 101 | + Set<Long> purchasedIds = new HashSet<>(usedPencilFinder.findByMemberInSharedNoteIdsAndTypeIsOwned(member, ids)); |
| 102 | + |
| 103 | + Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
| 104 | + return SharedNoteExploreGetResponse.of(pages.getTotalElements(), sharedNotes, purchasedIds, likedNoteIds, |
| 105 | + viewcountMap, member.getMemberId()); |
| 106 | + } |
| 107 | + |
| 108 | + private Map<Long, Long> mapIdsAndViewcount(List<SharedNote> sharedNotes) { |
| 109 | + return sharedNotes.stream().collect(Collectors.toMap( |
| 110 | + SharedNote::getSharedNoteId, |
| 111 | + SharedNote::getViewCount |
| 112 | + )); |
| 113 | + } |
| 114 | + |
| 115 | + public UserSharedNotesGetResponse findUserSharedNotes(Member member, NoteType noteType, |
| 116 | + LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
| 117 | + |
| 118 | + switch (noteType) { |
| 119 | + case LIKED -> { |
| 120 | + return getUserLikedSharedNotes(member, propertyType, priceType, keyword); |
| 121 | + } |
| 122 | + case SHARED -> { |
| 123 | + return getUserSharedNotes(member, noteType, propertyType, priceType, keyword); |
| 124 | + } |
| 125 | + case OWNED -> { |
| 126 | + return getUserOwnedSharedNotes(member, noteType, propertyType, priceType, keyword); |
| 127 | + } |
| 128 | + default -> throw new SharedNoteHandler(ErrorStatus.SHAREDNOTE_TYPE_ERROR); |
| 129 | + } |
| 130 | + } |
| 131 | + |
| 132 | + private UserSharedNotesGetResponse getUserOwnedSharedNotes(Member member, NoteType noteType, |
| 133 | + LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
| 134 | + |
| 135 | + List<UsedPencil> usedPencils = usedPencilFinder.findAllByMemberAndTypeIsOwnedOrderByCreatedAtDesc(member); |
| 136 | + List<Long> sharedNoteIds = usedPencils.stream().map(UsedPencil::getSharedNoteId).toList(); |
| 137 | + |
| 138 | + List<SharedNote> sharedNotes = sharedNoteFinder.findUserSharedNotes(member, noteType, propertyType, priceType, |
| 139 | + keyword, sharedNoteIds); |
| 140 | + List<SharedNote> sortedSharedNotes = sortByUsedPencilCreatedAt(sharedNoteIds, sharedNotes); |
| 141 | + |
| 142 | + Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
| 143 | + Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
| 144 | + |
| 145 | + return UserSharedNotesGetResponse.ofOwned(sortedSharedNotes, likedNoteIds, viewcountMap); |
| 146 | + } |
| 147 | + |
| 148 | + private List<SharedNote> sortByUsedPencilCreatedAt(List<Long> sharedNoteIds, List<SharedNote> sharedNotes) { |
| 149 | + Map<Long, Integer> orderMap = IntStream.range(0, sharedNoteIds.size()) |
| 150 | + .boxed() |
| 151 | + .collect(Collectors.toMap(sharedNoteIds::get, i -> i)); |
| 152 | + |
| 153 | + return sharedNotes.stream() |
| 154 | + .sorted(Comparator.comparingInt(note -> orderMap.get(note.getSharedNoteId()))) |
| 155 | + .toList(); |
| 156 | + } |
| 157 | + |
| 158 | + private UserSharedNotesGetResponse getUserSharedNotes(Member member, NoteType noteType, |
| 159 | + LimjangPropertyType propertyType, LimjangPriceType priceType, String keyword) { |
| 160 | + List<SharedNote> sharedNotes = sharedNoteFinder.findUserSharedNotes(member, noteType, propertyType, priceType, |
| 161 | + keyword, List.of()); |
| 162 | + Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
| 163 | + |
| 164 | + Set<Long> likedNoteIds = new HashSet<>(likedNoteFinder.findLikedSharedNoteIds(member, sharedNotes)); |
| 165 | + return UserSharedNotesGetResponse.ofShared(member, sharedNotes, likedNoteIds, viewcountMap); |
| 166 | + } |
| 167 | + |
| 168 | + private UserSharedNotesGetResponse getUserLikedSharedNotes(Member member, LimjangPropertyType propertyType, |
| 169 | + LimjangPriceType priceType, String keyword) { |
| 170 | + |
| 171 | + List<LikedNote> userLikedNotes = likedNoteFinder.findAllByMemberAndDynamic(member, propertyType, |
| 172 | + priceType, keyword); |
| 173 | + List<SharedNote> sharedNotes = userLikedNotes.stream().map(LikedNote::getSharedNote).toList(); |
| 174 | + |
| 175 | + Set<Long> purchasedIds = new HashSet<>(usedPencilFinder.findByMemberInSharedNoteIdsAndTypeIsOwned(member, |
| 176 | + sharedNotes.stream().map(SharedNote::getSharedNoteId).toList())); |
| 177 | + Map<Long, Long> viewcountMap = mapIdsAndViewcount(sharedNotes); |
| 178 | + |
| 179 | + return UserSharedNotesGetResponse.ofLiked(sharedNotes, purchasedIds, viewcountMap, member.getMemberId()); |
| 180 | + } |
| 181 | + |
| 182 | + @Transactional(readOnly = true) |
| 183 | + public SharedNoteCheckListAndReviewResponse findChecklistAndReview(Member member, Long sharedNoteId) { |
| 184 | + SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
| 185 | + Limjang note = sharedNote.getLimjang(); |
| 186 | + List<ChecklistAnswerResponseDTO.AnswerDto> answers = checklistAnswerFinder.findByLimjangId( |
| 187 | + note.getLimjangId()); |
| 188 | + |
| 189 | + Report report = reportFinder.findReportByNote(note); |
| 190 | + |
| 191 | + boolean isBuyerOrOwner = getIsBuyerOrOwner(member, sharedNote); |
| 192 | + // ๊ตฌ๋งคํ๋ค๋ฉด review ํฌํจ, ์๋๋ฉด null |
| 193 | + String review = isBuyerOrOwner ? sharedNote.getReview() : null; |
| 194 | + Float totalRate = isBuyerOrOwner ? report.getTotalRate() : null; |
| 195 | + return new SharedNoteCheckListAndReviewResponse(review, totalRate, answers); |
| 196 | + } |
| 197 | + |
| 198 | + public ReportWithLimjangResponseDTO getReportBySharedNoteId(Long sharedNoteId) { |
| 199 | + SharedNote sharedNote = sharedNoteFinder.findByIdWithNoteAndAddress(sharedNoteId); |
| 200 | + Limjang note = sharedNote.getLimjang(); |
| 201 | + Report report = reportFinder.findReportByNote(note); |
| 202 | + return new ReportWithLimjangResponseDTO(ReportGetResponse.of(report), LimjangDetailGetResponse.of(note)); |
| 203 | + } |
209 | 204 | } |
0 commit comments