Skip to content

Commit c8409db

Browse files
committed
๐Ÿ› fix: ๋‚ด ๋…ธํŠธ ์กฐํšŒ ์•ˆ๋จ ์ด์Šˆ ํ•ด๊ฒฐ
1 parent 2fe5498 commit c8409db

File tree

1 file changed

+167
-172
lines changed

1 file changed

+167
-172
lines changed
Lines changed: 167 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
11
package umc.th.juinjang.api.note.shared.service;
22

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;
115
import org.springframework.data.domain.Page;
126
import org.springframework.data.domain.Pageable;
137
import org.springframework.stereotype.Service;
148
import org.springframework.transaction.annotation.Transactional;
15-
16-
import lombok.RequiredArgsConstructor;
17-
import lombok.extern.slf4j.Slf4j;
189
import umc.th.juinjang.api.checklist.service.ChecklistAnswerFinder;
1910
import umc.th.juinjang.api.checklist.service.ReportFinder;
2011
import umc.th.juinjang.api.checklist.service.response.ChecklistAnswerResponseDTO;
@@ -40,170 +31,174 @@
4031
import umc.th.juinjang.domain.pencil.used.model.UsedPencil;
4132
import umc.th.juinjang.domain.report.model.Report;
4233

34+
import java.util.*;
35+
import java.util.stream.Collectors;
36+
import java.util.stream.IntStream;
37+
4338
@Service
4439
@Slf4j
4540
@RequiredArgsConstructor
4641
public class SharedNoteQueryService {
4742

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+
}
209204
}

0 commit comments

Comments
ย (0)