|
1 | 1 | package umc.th.juinjang.api.note.shared.service; |
2 | 2 |
|
3 | | -import java.time.LocalDateTime; |
4 | | -import java.util.Optional; |
5 | 3 | import java.util.List; |
| 4 | +import java.util.Optional; |
6 | 5 | import java.sql.Timestamp; |
7 | | - |
8 | | - |
9 | 6 | import org.hibernate.exception.LockAcquisitionException; |
10 | 7 | import org.springframework.dao.CannotAcquireLockException; |
11 | 8 | import org.springframework.stereotype.Service; |
@@ -135,60 +132,65 @@ public void deleteSharedNote(Member member, Long sharedNoteId, LocalDateTime del |
135 | 132 |
|
136 | 133 | @Transactional |
137 | 134 | public void createSharedNote(Member member, Long noteId, SharedNotePostRequest request) { |
138 | | - Integer rewardPencilCount = 0; |
139 | | - Long price = 0L; |
140 | 135 |
|
| 136 | + Limjang limjang = noteFinder.getNoteByIdWhereDeletedIsFalse(noteId); |
141 | 137 | Optional<SharedNote> latestSharedNote = sharedNoteFinder.findLatestByLimjangId(noteId); |
142 | | - if (latestSharedNote.isPresent()) { |
143 | | - SharedNote note = latestSharedNote.get(); |
144 | | - if (note.getDeletedAt() == null) { |
145 | | - throw new SharedNoteHandler(ErrorStatus.SHAREDNOTE_ALREADY_EXISTS); |
146 | | - } |
147 | | - if (note.getDeletedAt().toLocalDateTime().isAfter(LocalDateTime.now().minusMonths(6))) { |
148 | | - throw new SharedNoteHandler(ErrorStatus.SHAREDNOTE_DELETED_RECENTLY); |
149 | | - } |
| 138 | + |
| 139 | + // 이미 삭제되지 않은 공유글이 있으면 차단 |
| 140 | + if (latestSharedNote.isPresent() && latestSharedNote.get().getDeletedAt() == null) { |
| 141 | + throw new SharedNoteHandler(ErrorStatus.SHAREDNOTE_ALREADY_EXISTS); |
150 | 142 | } |
151 | 143 |
|
152 | | - //Limjang 조회 |
153 | | - Limjang limjang = noteFinder.getNoteByIdWhereDeletedIsFalse(noteId); |
| 144 | + // 최초 공유라면 보상 지급 |
| 145 | + boolean isFirstTimeShared = latestSharedNote.isEmpty(); |
| 146 | + Integer rewardPencilCount = isFirstTimeShared ? calculateReward(limjang, request) : 0; |
154 | 147 |
|
155 | | - //사진 공유 체크 + 임장노트에 사진이 있으면 |
| 148 | + // 공유 저장 |
| 149 | + SharedNote sharedNote = SharedNote.toSharedNote(member, limjang, request); |
| 150 | + sharedNoteUpdater.save(sharedNote); |
| 151 | + |
| 152 | + // 보상 처리 |
| 153 | + if (rewardPencilCount > 0) { |
| 154 | + applyReward(member, limjang, sharedNote.getSharedNoteId(), rewardPencilCount); |
| 155 | + } |
| 156 | + } |
| 157 | + |
| 158 | + private int calculateReward(Limjang limjang, SharedNotePostRequest request) { |
156 | 159 | if (request.isImageShared() == Boolean.TRUE && !limjang.getImageList().isEmpty()) { |
157 | | - //SafeSearch 검사 (유해 이미지가 하나라도 있으면 차단) |
158 | | - for (var image : limjang.getImageList()) { |
159 | | - boolean safe = safeSearchClient.isSafeImage( |
160 | | - image.getImageUrl(), |
161 | | - Likelihood.UNLIKELY, // adult |
162 | | - Likelihood.POSSIBLE, // spoof |
163 | | - Likelihood.POSSIBLE, // medical |
164 | | - Likelihood.UNLIKELY, // violence |
165 | | - Likelihood.LIKELY // racy |
166 | | - ); |
167 | | - if (!safe) { |
168 | | - throw new SharedNoteHandler(ErrorStatus.SHARED_NOT_ALLOWED); |
169 | | - } |
170 | | - } |
171 | | - rewardPencilCount = 7; |
172 | | - price = 10L; |
| 160 | + validateImagesAreSafe(limjang); |
| 161 | + return 7; |
173 | 162 | } |
174 | | - //사진 공유 안함 체크 or 임장노트에 사진이 없으면 |
175 | | - else if (request.isImageShared() == Boolean.TRUE || limjang.getImageList().isEmpty()) { |
176 | | - rewardPencilCount = 2; |
177 | | - price = 5L; |
| 163 | + if (request.isImageShared() == Boolean.TRUE || limjang.getImageList().isEmpty()) { |
| 164 | + return 2; |
178 | 165 | } |
| 166 | + return 0; |
| 167 | + } |
| 168 | + |
| 169 | + private void validateImagesAreSafe(Limjang limjang) { |
| 170 | + for (var image : limjang.getImageList()) { |
| 171 | + boolean safe = safeSearchClient.isSafeImage( |
| 172 | + image.getImageUrl(), |
| 173 | + Likelihood.UNLIKELY, // adult |
| 174 | + Likelihood.POSSIBLE, // spoof |
| 175 | + Likelihood.POSSIBLE, // medical |
| 176 | + Likelihood.UNLIKELY, // violence |
| 177 | + Likelihood.LIKELY // racy |
| 178 | + ); |
| 179 | + if (!safe) { |
| 180 | + throw new SharedNoteHandler(ErrorStatus.SHARED_NOT_ALLOWED); |
| 181 | + } |
| 182 | + } |
| 183 | + } |
| 184 | + |
| 185 | + private void applyReward(Member member, Limjang limjang, Long sharedNoteId, int rewardPencilCount) { |
179 | 186 | limjang.updateRewardPencil(rewardPencilCount); |
180 | 187 | noteUpdater.save(limjang); |
181 | 188 |
|
182 | | - //저장 |
183 | | - SharedNote sharedNote = SharedNote.toSharedNote(member, limjang, request); |
184 | | - sharedNote.updatePrice(price); |
185 | | - sharedNoteUpdater.save(sharedNote); |
186 | | - |
187 | | - //사용자 지갑에 rewardPencil만큼 업데이트 |
188 | 189 | PencilAccount pencilAccount = pencilAccountFinder.findByMemberWithLock(member); |
189 | 190 | pencilAccount.increaseAcquiredBalance(rewardPencilCount); |
| 191 | + |
190 | 192 | acquiredPencilUpdater.save( |
191 | | - createAcquiredPencil(sharedNote.getSharedNoteId(), member, rewardPencilCount.longValue(), |
192 | | - AcquiredType.NOTE)); |
| 193 | + createAcquiredPencil(sharedNoteId, member, (long)rewardPencilCount, AcquiredType.NOTE)); |
193 | 194 | } |
| 195 | + |
194 | 196 | } |
0 commit comments