Skip to content

Commit 0f98916

Browse files
authored
Merge pull request #396 from Juinjang/refactor/#394
[refactor/#394] 노트 재공유 기간 제한 삭제 및 보상 횟수 제한 적용
2 parents 09595e1 + becbd12 commit 0f98916

4 files changed

Lines changed: 51 additions & 51 deletions

File tree

src/main/java/umc/th/juinjang/api/note/shared/service/SharedNoteCommandService.java

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

3-
import java.time.LocalDateTime;
4-
import java.util.Optional;
53
import java.util.List;
4+
import java.util.Optional;
65
import java.sql.Timestamp;
7-
8-
96
import org.hibernate.exception.LockAcquisitionException;
107
import org.springframework.dao.CannotAcquireLockException;
118
import org.springframework.stereotype.Service;
@@ -135,60 +132,65 @@ public void deleteSharedNote(Member member, Long sharedNoteId, LocalDateTime del
135132

136133
@Transactional
137134
public void createSharedNote(Member member, Long noteId, SharedNotePostRequest request) {
138-
Integer rewardPencilCount = 0;
139-
Long price = 0L;
140135

136+
Limjang limjang = noteFinder.getNoteByIdWhereDeletedIsFalse(noteId);
141137
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);
150142
}
151143

152-
//Limjang 조회
153-
Limjang limjang = noteFinder.getNoteByIdWhereDeletedIsFalse(noteId);
144+
// 최초 공유라면 보상 지급
145+
boolean isFirstTimeShared = latestSharedNote.isEmpty();
146+
Integer rewardPencilCount = isFirstTimeShared ? calculateReward(limjang, request) : 0;
154147

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) {
156159
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;
173162
}
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;
178165
}
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) {
179186
limjang.updateRewardPencil(rewardPencilCount);
180187
noteUpdater.save(limjang);
181188

182-
//저장
183-
SharedNote sharedNote = SharedNote.toSharedNote(member, limjang, request);
184-
sharedNote.updatePrice(price);
185-
sharedNoteUpdater.save(sharedNote);
186-
187-
//사용자 지갑에 rewardPencil만큼 업데이트
188189
PencilAccount pencilAccount = pencilAccountFinder.findByMemberWithLock(member);
189190
pencilAccount.increaseAcquiredBalance(rewardPencilCount);
191+
190192
acquiredPencilUpdater.save(
191-
createAcquiredPencil(sharedNote.getSharedNoteId(), member, rewardPencilCount.longValue(),
192-
AcquiredType.NOTE));
193+
createAcquiredPencil(sharedNoteId, member, (long)rewardPencilCount, AcquiredType.NOTE));
193194
}
195+
194196
}

src/main/java/umc/th/juinjang/api/note/shared/service/SharedNoteFinder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public Long getLikedNoteById(Long id) {
5151
return sharedNoteRepository.getLikeCountById(id);
5252
}
5353

54-
public Optional<SharedNote> findLatestByLimjangId(Long limjangId) {
55-
return sharedNoteRepository.findLatestByLimjangId(limjangId);
54+
public Optional<SharedNote> findLatestByLimjangId(Long noteId) {
55+
return sharedNoteRepository.findTop1ByLimjang_LimjangIdOrderByCreatedAtDesc(noteId);
5656
}
5757

5858
Page<SharedNote> findSharedNoteInExployer(List<String> code, ExploreSortType sort,

src/main/java/umc/th/juinjang/domain/note/shared/model/SharedNote.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public class SharedNote extends BaseEntity {
6262
private Long likeCount;
6363

6464
@ManyToOne(fetch = FetchType.LAZY)
65-
@JoinColumn(name = "limjang_id", nullable = false, unique = true)
65+
@JoinColumn(name = "limjang_id", nullable = false)
6666
private Limjang limjang;
6767

6868
@ManyToOne(fetch = FetchType.LAZY)

src/main/java/umc/th/juinjang/domain/note/shared/repository/SharedNoteRepository.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,8 @@ public interface SharedNoteRepository extends JpaRepository<SharedNote, Long>, S
3333
@Query("UPDATE SharedNote sn SET sn.likeCount = sn.likeCount - 1 WHERE sn.sharedNoteId = :sharedNoteId")
3434
void decrementLikedCountById(@Param("sharedNoteId") Long sharedNoteId);
3535

36-
Optional<SharedNote> getBySharedNoteIdAndMemberAndDeletedAtIsNull(Long sharedNoteId, Member member);
36+
Optional<SharedNote> findTop1ByLimjang_LimjangIdOrderByCreatedAtDesc(Long limjangId);
3737

38-
@Query("SELECT sn FROM SharedNote sn WHERE sn.limjang.limjangId = :limjangId ORDER BY sn.createdAt DESC")
39-
Optional<SharedNote> findLatestByLimjangId(@Param("limjangId") Long limjangId);
4038

4139
@Query("SELECT s.sharedNoteId, s.viewCount FROM SharedNote s WHERE s.sharedNoteId IN :ids")
4240
List<Object[]> findAllViewCountById(@Param("ids") List<Long> ids);

0 commit comments

Comments
 (0)