Skip to content

Commit 9ca3f6d

Browse files
committed
feat: 링크 만료 시간 하루로 설정
1 parent a32e42b commit 9ca3f6d

3 files changed

Lines changed: 31 additions & 3 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/plans/entity/Plan.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ public class Plan {
5454
@Column(name = "share_token", unique = true, length = 13)
5555
private String shareToken;
5656

57+
@Column(name = "share_token_expires_at")
58+
private LocalDateTime shareTokenExpiresAt;
59+
5760
@OneToMany(mappedBy = "plan", cascade = CascadeType.ALL, orphanRemoval = true)
5861
private List<PlanParticipant> participants = new ArrayList<>();
5962

@@ -91,9 +94,23 @@ public void addSchedule(Schedule schedule) {
9194

9295
public void generateShareToken() {
9396
this.shareToken = UUID.randomUUID().toString().substring(0, 13);
97+
// 만료 시간: 현재 시간으로부터 1일 후
98+
this.shareTokenExpiresAt = LocalDateTime.now().plusDays(1);
9499
}
95100

96101
public void clearShareToken() {
97102
this.shareToken = null;
103+
this.shareTokenExpiresAt = null;
104+
}
105+
106+
/**
107+
* 공유 토큰이 만료되었는지 확인
108+
* @return 만료되었으면 true, 아니면 false
109+
*/
110+
public boolean isShareTokenExpired() {
111+
if (shareTokenExpiresAt == null) {
112+
return true; // 만료 시간이 없으면 만료된 것으로 간주
113+
}
114+
return LocalDateTime.now().isAfter(shareTokenExpiresAt);
98115
}
99116
}

src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -712,8 +712,8 @@ public PlanShareLinkResponse generateShareLink(Long planId, User user) {
712712
// 권한 체크 (수정 권한 확인: OWNER 또는 EDITOR)
713713
Plan plan = findPlanWithEditPermissionCheck(planId, user);
714714

715-
// shareToken이 이미 있으면 재사용, 없으면 생성
716-
if (plan.getShareToken() == null) {
715+
// shareToken이 없거나 만료되었으면 새로 생성, 유효하면 재사용
716+
if (plan.getShareToken() == null || plan.isShareTokenExpired()) {
717717
plan.generateShareToken();
718718
planRepository.save(plan);
719719
}
@@ -738,6 +738,11 @@ public PlanDetailResponse getPlanByShareToken(String shareToken, User user) {
738738
Plan plan = planRepository.findByShareToken(shareToken)
739739
.orElseThrow(() -> new BusinessException(PlanErrorCode.INVALID_SHARE_TOKEN));
740740

741+
// 만료 시간 검증
742+
if (plan.isShareTokenExpired()) {
743+
throw new BusinessException(PlanErrorCode.SHARE_TOKEN_EXPIRED);
744+
}
745+
741746
// 자기 자신의 플랜은 조회 불가
742747
if (plan.getUserId().equals(user.getId())) {
743748
throw new BusinessException(PlanErrorCode.USER_ALREADY_PARTICIPANT);
@@ -761,6 +766,11 @@ public PlanDetailResponse acceptPlanInvitation(String shareToken, User user) {
761766
Plan plan = planRepository.findByShareToken(shareToken)
762767
.orElseThrow(() -> new BusinessException(PlanErrorCode.INVALID_SHARE_TOKEN));
763768

769+
// 만료 시간 검증
770+
if (plan.isShareTokenExpired()) {
771+
throw new BusinessException(PlanErrorCode.SHARE_TOKEN_EXPIRED);
772+
}
773+
764774
// 자기 자신의 플랜은 참가할 수 없음
765775
if (plan.getUserId().equals(user.getId())) {
766776
throw new BusinessException(PlanErrorCode.USER_ALREADY_PARTICIPANT);

src/main/java/com/back/web7_9_codecrete_be/global/error/code/PlanErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public enum PlanErrorCode implements ErrorCode {
2121
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "P-109", "사용자를 찾을 수 없습니다."),
2222
USER_ALREADY_PARTICIPANT(HttpStatus.BAD_REQUEST, "P-110", "이미 참가자로 등록된 사용자입니다."),
2323
INVALID_SHARE_TOKEN(HttpStatus.NOT_FOUND, "P-111", "유효하지 않은 공유 링크입니다."),
24-
SHARE_TOKEN_NOT_GENERATED(HttpStatus.BAD_REQUEST, "P-112", "공유 링크가 생성되지 않았습니다.");
24+
SHARE_TOKEN_NOT_GENERATED(HttpStatus.BAD_REQUEST, "P-112", "공유 링크가 생성되지 않았습니다."),
25+
SHARE_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "P-113", "공유 링크가 만료되었습니다.");
2526

2627
private final HttpStatus status;
2728
private final String code;

0 commit comments

Comments
 (0)