diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/api/MentorStudyController.java b/src/main/java/com/gdschongik/gdsc/domain/study/api/MentorStudyController.java index 69a615e9d..d85ba3af1 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/api/MentorStudyController.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/api/MentorStudyController.java @@ -3,7 +3,7 @@ import com.gdschongik.gdsc.domain.study.application.MentorStudyService; import com.gdschongik.gdsc.domain.study.dto.request.StudyAnnouncementCreateUpdateRequest; import com.gdschongik.gdsc.domain.study.dto.request.StudyUpdateRequest; -import com.gdschongik.gdsc.domain.study.dto.response.MentorStudyResponse; +import com.gdschongik.gdsc.domain.study.dto.response.StudyResponse; import com.gdschongik.gdsc.domain.study.dto.response.StudyStudentResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,8 +30,8 @@ public ResponseEntity updateStudy(@PathVariable Long studyId, @RequestBody @Operation(summary = "내 스터디 조회", description = "내가 멘토로 있는 스터디를 조회합니다.") @GetMapping("/me") - public ResponseEntity> getStudiesInCharge() { - List response = mentorStudyService.getStudiesInCharge(); + public ResponseEntity> getStudiesInCharge() { + List response = mentorStudyService.getStudiesInCharge(); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java index 579ba7717..68cba2679 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/api/StudentStudyDetailController.java @@ -46,6 +46,7 @@ public ResponseEntity> getStudyCurriculums( return ResponseEntity.ok(response); } + @Deprecated @Operation(summary = "이번주 제출해야 할 과제 조회", description = "마감 기한이 이번주까지인 과제를 조회합니다.") @GetMapping("/assignments/upcoming") public ResponseEntity> getUpcomingAssignments( diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/CommonStudyService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/CommonStudyService.java index 6bcf2aae9..0bdb66e9c 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/CommonStudyService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/CommonStudyService.java @@ -1,21 +1,20 @@ package com.gdschongik.gdsc.domain.study.application; -import static com.gdschongik.gdsc.global.exception.ErrorCode.STUDY_NOT_FOUND; +import static com.gdschongik.gdsc.global.exception.ErrorCode.*; -import com.gdschongik.gdsc.domain.member.domain.Member; +import com.gdschongik.gdsc.domain.study.dao.AssignmentHistoryRepository; +import com.gdschongik.gdsc.domain.study.dao.AttendanceRepository; import com.gdschongik.gdsc.domain.study.dao.StudyAnnouncementRepository; import com.gdschongik.gdsc.domain.study.dao.StudyHistoryRepository; import com.gdschongik.gdsc.domain.study.dao.StudyRepository; import com.gdschongik.gdsc.domain.study.domain.Study; import com.gdschongik.gdsc.domain.study.domain.StudyAnnouncement; -import com.gdschongik.gdsc.domain.study.domain.StudyHistory; import com.gdschongik.gdsc.domain.study.domain.StudyValidator; import com.gdschongik.gdsc.domain.study.dto.response.CommonStudyResponse; import com.gdschongik.gdsc.domain.study.dto.response.StudyAnnouncementResponse; import com.gdschongik.gdsc.global.exception.CustomException; import com.gdschongik.gdsc.global.util.MemberUtil; import java.util.List; -import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -29,6 +28,8 @@ public class CommonStudyService { private final StudyRepository studyRepository; private final StudyHistoryRepository studyHistoryRepository; private final StudyAnnouncementRepository studyAnnouncementRepository; + private final AttendanceRepository attendanceRepository; + private final AssignmentHistoryRepository assignmentHistoryRepository; private final MemberUtil memberUtil; private final StudyValidator studyValidator; @@ -40,15 +41,23 @@ public CommonStudyResponse getStudyInformation(Long studyId) { @Transactional(readOnly = true) public List getStudyAnnouncements(Long studyId) { - Member currentMember = memberUtil.getCurrentMember(); - final Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); - Optional studyHistory = studyHistoryRepository.findByStudentAndStudyId(currentMember, studyId); - - studyValidator.validateStudyMentorOrStudent(currentMember, study, studyHistory); - final List studyAnnouncements = studyAnnouncementRepository.findAllByStudyIdOrderByCreatedAtDesc(studyId); return studyAnnouncements.stream().map(StudyAnnouncementResponse::from).toList(); } + + /** + * 이벤트 핸들러에서 사용되므로, `@Transactional` 을 사용하지 않습니다. + */ + public void deleteAttendance(Long studyId, Long memberId) { + attendanceRepository.deleteByStudyIdAndMemberId(studyId, memberId); + } + + /** + * 이벤트 핸들러에서 사용되므로, `@Transactional` 을 사용하지 않습니다. + */ + public void deleteAssignmentHistory(Long studyId, Long memberId) { + assignmentHistoryRepository.deleteByStudyIdAndMemberId(studyId, memberId); + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/MentorStudyService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/MentorStudyService.java index 31bcd0aaf..ed972f338 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/MentorStudyService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/MentorStudyService.java @@ -15,7 +15,7 @@ import com.gdschongik.gdsc.domain.study.dto.request.StudyAnnouncementCreateUpdateRequest; import com.gdschongik.gdsc.domain.study.dto.request.StudyCurriculumCreateRequest; import com.gdschongik.gdsc.domain.study.dto.request.StudyUpdateRequest; -import com.gdschongik.gdsc.domain.study.dto.response.MentorStudyResponse; +import com.gdschongik.gdsc.domain.study.dto.response.StudyResponse; import com.gdschongik.gdsc.domain.study.dto.response.StudyStudentResponse; import com.gdschongik.gdsc.global.exception.CustomException; import com.gdschongik.gdsc.global.exception.ErrorCode; @@ -42,10 +42,10 @@ public class MentorStudyService { private final StudyDetailValidator studyDetailValidator; @Transactional(readOnly = true) - public List getStudiesInCharge() { + public List getStudiesInCharge() { Member currentMember = memberUtil.getCurrentMember(); List myStudies = studyRepository.findAllByMentor(currentMember); - return myStudies.stream().map(MentorStudyResponse::from).toList(); + return myStudies.stream().map(StudyResponse::from).toList(); } @Transactional(readOnly = true) diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java index 0bc4af0c7..d55b9784d 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java @@ -70,6 +70,7 @@ public void applyStudy(Long studyId) { @Transactional public void cancelStudyApply(Long studyId) { + // TODO: 통합 테스트 통해 수강철회 관련 이벤트 처리 확인 Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); Member currentMember = memberUtil.getCurrentMember(); diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudyEventHandler.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudyEventHandler.java new file mode 100644 index 000000000..45e29a8fa --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudyEventHandler.java @@ -0,0 +1,23 @@ +package com.gdschongik.gdsc.domain.study.application; + +import com.gdschongik.gdsc.domain.study.domain.StudyApplyCanceledEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Slf4j +@Component +@RequiredArgsConstructor +public class StudyEventHandler { + + private final CommonStudyService commonStudyService; + + @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) + public void handleStudyApplyCanceledEvent(StudyApplyCanceledEvent event) { + log.info("[StudyEventHandler] 스터디 수강신청 취소 이벤트 수신: studyId={}, memberId={}", event.studyId(), event.memberId()); + commonStudyService.deleteAttendance(event.studyId(), event.memberId()); + commonStudyService.deleteAssignmentHistory(event.studyId(), event.memberId()); + } +} diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepository.java b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepository.java index 108112e6f..cd5addbc8 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepository.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepository.java @@ -10,4 +10,6 @@ public interface AssignmentHistoryCustomRepository { boolean existsSubmittedAssignmentByMemberAndStudy(Member member, Study study); List findAssignmentHistoriesByStudentAndStudyId(Member member, Long studyId); + + void deleteByStudyIdAndMemberId(Long studyId, Long memberId); } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepositoryImpl.java b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepositoryImpl.java index 4c6df554c..df884bfc6 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepositoryImpl.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AssignmentHistoryCustomRepositoryImpl.java @@ -53,4 +53,16 @@ public List findAssignmentHistoriesByStudentAndStudyId(Member private BooleanExpression eqStudyId(Long studyId) { return studyId != null ? studyDetail.study.id.eq(studyId) : null; } + + @Override + public void deleteByStudyIdAndMemberId(Long studyId, Long memberId) { + queryFactory + .delete(assignmentHistory) + .where(eqMemberId(memberId), eqStudyId(studyId)) + .execute(); + } + + private BooleanExpression eqMemberId(Long memberId) { + return memberId != null ? assignmentHistory.member.id.eq(memberId) : null; + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepository.java b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepository.java index 175472c02..e04482f5d 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepository.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepository.java @@ -6,4 +6,6 @@ public interface AttendanceCustomRepository { List findByMemberAndStudyId(Member member, Long studyId); + + void deleteByStudyIdAndMemberId(Long studyId, Long memberId); } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepositoryImpl.java b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepositoryImpl.java index 16ed1b15c..af382f4d2 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepositoryImpl.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceCustomRepositoryImpl.java @@ -33,4 +33,12 @@ private BooleanExpression eqMemberId(Long memberId) { private BooleanExpression eqStudyId(Long studyId) { return studyId != null ? attendance.studyDetail.study.id.eq(studyId) : null; } + + @Override + public void deleteByStudyIdAndMemberId(Long studyId, Long memberId) { + queryFactory + .delete(attendance) + .where(eqMemberId(memberId), eqStudyId(studyId)) + .execute(); + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyApplyCanceledEvent.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyApplyCanceledEvent.java new file mode 100644 index 000000000..0b737cf1c --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyApplyCanceledEvent.java @@ -0,0 +1,3 @@ +package com.gdschongik.gdsc.domain.study.domain; + +public record StudyApplyCanceledEvent(Long studyId, Long memberId) {} diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetailValidator.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetailValidator.java index 91341292d..f6b75b698 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetailValidator.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyDetailValidator.java @@ -19,7 +19,7 @@ public void validateCancelStudyAssignment(Member member, StudyDetail studyDetail public void validatePublishStudyAssignment( Member member, StudyDetail studyDetail, AssignmentCreateUpdateRequest request) { validateStudyMentorAuthorization(member, studyDetail); - validateDeadLine(request.deadLine()); + validateDeadLine(request.deadLine(), studyDetail.getPeriod().getStartDate()); } // 해당 스터디의 멘토가 아니라면 스터디에 대한 권한이 없다. @@ -29,8 +29,8 @@ private void validateStudyMentorAuthorization(Member member, StudyDetail studyDe } } - private void validateDeadLine(LocalDateTime deadline) { - if (deadline.isBefore(LocalDateTime.now())) { + private void validateDeadLine(LocalDateTime deadline, LocalDateTime studyStartDate) { + if (deadline.isBefore(LocalDateTime.now()) || deadline.isBefore(studyStartDate)) { throw new CustomException(ASSIGNMENT_DEADLINE_INVALID); } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyHistory.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyHistory.java index e8cd313d8..854a5001d 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyHistory.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyHistory.java @@ -10,6 +10,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.PreRemove; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; import lombok.AccessLevel; @@ -48,6 +49,11 @@ public static StudyHistory create(Member student, Study study) { return StudyHistory.builder().student(student).study(study).build(); } + @PreRemove + private void preRemove() { + registerEvent(new StudyApplyCanceledEvent(this.study.getId(), this.student.getId())); + } + /** * 레포지토리 링크를 업데이트합니다. */ diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyValidator.java b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyValidator.java index 93a95deab..3d6a67fd3 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyValidator.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/domain/StudyValidator.java @@ -5,7 +5,6 @@ import com.gdschongik.gdsc.domain.member.domain.Member; import com.gdschongik.gdsc.global.annotation.DomainService; import com.gdschongik.gdsc.global.exception.CustomException; -import java.util.Optional; @DomainService public class StudyValidator { @@ -25,21 +24,4 @@ public void validateStudyMentor(Member currentMember, Study study) { throw new CustomException(STUDY_MENTOR_INVALID); } } - - public void validateStudyMentorOrStudent(Member currentMember, Study study, Optional studyHistory) { - // 어드민인 경우 검증 통과 - if (currentMember.isAdmin()) { - return; - } - - // 해당 스터디의 수강생인지 검증 - if (currentMember.isStudent() && studyHistory.isEmpty()) { - throw new CustomException(STUDY_ACCESS_NOT_ALLOWED); - } - - // 해당 스터디의 담당 멘토인지 검증 - if (!currentMember.getId().equals(study.getMentor().getId())) { - throw new CustomException(STUDY_MENTOR_INVALID); - } - } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentResponse.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentResponse.java index 1a020d83f..40b09fe30 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentResponse.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentResponse.java @@ -13,7 +13,8 @@ public record AssignmentResponse( @Schema(description = "마감 기한") LocalDateTime deadline, @Schema(description = "주차") Long week, @Schema(description = "과제 명세 링크") String descriptionLink, - @Schema(description = "과제 상태") StudyStatus assignmentStatus) { + @Schema(description = "과제 상태") StudyStatus assignmentStatus, + @Schema(description = "주차 시작일") LocalDateTime studyDetailStartDate) { public static AssignmentResponse from(StudyDetail studyDetail) { Assignment assignment = studyDetail.getAssignment(); return new AssignmentResponse( @@ -23,6 +24,7 @@ public static AssignmentResponse from(StudyDetail studyDetail) { assignment.getDeadline(), studyDetail.getWeek(), assignment.getDescriptionLink(), - assignment.getStatus()); + assignment.getStatus(), + studyDetail.getPeriod().getStartDate()); } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentSubmittableDto.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentSubmittableDto.java index 037665c40..3fe71fa6b 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentSubmittableDto.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/AssignmentSubmittableDto.java @@ -19,7 +19,8 @@ public record AssignmentSubmittableDto( @Nullable @Schema(description = "과제 명세 링크") String descriptionLink, @Nullable @Schema(description = "마감 기한") LocalDateTime deadline, @Nullable @Schema(description = "과제 제출 링크") String submissionLink, - @Nullable @Schema(description = "과제 제출 실패 사유") SubmissionFailureType submissionFailureType) { + @Nullable @Schema(description = "과제 제출 실패 사유") SubmissionFailureType submissionFailureType, + @Nullable @Schema(description = "최종 수정 일시") LocalDateTime committedAt) { public static AssignmentSubmittableDto of(StudyDetail studyDetail, AssignmentHistory assignmentHistory) { Assignment assignment = studyDetail.getAssignment(); @@ -40,12 +41,22 @@ public static AssignmentSubmittableDto of(StudyDetail studyDetail, AssignmentHis assignment.getDescriptionLink(), assignment.getDeadline(), assignmentHistory.getSubmissionLink(), - assignmentHistory.getSubmissionFailureType()); + assignmentHistory.getSubmissionFailureType(), + assignmentHistory.getCommittedAt()); } private static AssignmentSubmittableDto cancelledAssignment(StudyDetail studyDetail, Assignment assignment) { return new AssignmentSubmittableDto( - studyDetail.getId(), assignment.getStatus(), studyDetail.getWeek(), null, null, null, null, null, null); + studyDetail.getId(), + assignment.getStatus(), + studyDetail.getWeek(), + null, + null, + null, + null, + null, + null, + null); } private static AssignmentSubmittableDto beforeAssignmentSubmit(StudyDetail studyDetail, Assignment assignment) { @@ -58,6 +69,7 @@ private static AssignmentSubmittableDto beforeAssignmentSubmit(StudyDetail study assignment.getDescriptionLink(), assignment.getDeadline(), null, + null, null); } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/MentorStudyResponse.java b/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/MentorStudyResponse.java deleted file mode 100644 index 7b0e710ec..000000000 --- a/src/main/java/com/gdschongik/gdsc/domain/study/dto/response/MentorStudyResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gdschongik.gdsc.domain.study.dto.response; - -import com.gdschongik.gdsc.domain.study.domain.Study; -import com.gdschongik.gdsc.domain.study.domain.StudyType; -import com.gdschongik.gdsc.global.util.formatter.SemesterFormatter; -import io.swagger.v3.oas.annotations.media.Schema; - -public record MentorStudyResponse( - Long studyId, - @Schema(description = "활동 학기") String semester, - @Schema(description = "이름") String title, - @Schema(description = "종류") StudyType studyType, - @Schema(description = "상세설명 노션 링크") String notionLink, - @Schema(description = "멘토 이름") String mentorName) { - - public static MentorStudyResponse from(Study study) { - return new MentorStudyResponse( - study.getId(), - SemesterFormatter.format(study.getAcademicYear(), study.getSemesterType()), - study.getTitle(), - study.getStudyType(), - study.getNotionLink(), - study.getMentor().getName()); - } -} diff --git a/src/main/java/com/gdschongik/gdsc/global/common/constant/GithubConstant.java b/src/main/java/com/gdschongik/gdsc/global/common/constant/GithubConstant.java index 2ffd6b0c7..8a3f58093 100644 --- a/src/main/java/com/gdschongik/gdsc/global/common/constant/GithubConstant.java +++ b/src/main/java/com/gdschongik/gdsc/global/common/constant/GithubConstant.java @@ -3,7 +3,7 @@ public class GithubConstant { public static final String GITHUB_DOMAIN = "github.com/"; - public static final String GITHUB_ASSIGNMENT_PATH = "week%d/WIL.md"; + public static final String GITHUB_ASSIGNMENT_PATH = "week%d/wil.md"; public static final String GITHUB_USER_API_URL = "https://api.github.com/user/%s"; private GithubConstant() {} diff --git a/src/test/java/com/gdschongik/gdsc/domain/study/domain/StudyValidatorTest.java b/src/test/java/com/gdschongik/gdsc/domain/study/domain/StudyValidatorTest.java index 602aefaa8..3a65e77b1 100644 --- a/src/test/java/com/gdschongik/gdsc/domain/study/domain/StudyValidatorTest.java +++ b/src/test/java/com/gdschongik/gdsc/domain/study/domain/StudyValidatorTest.java @@ -8,7 +8,6 @@ import com.gdschongik.gdsc.global.exception.CustomException; import com.gdschongik.gdsc.helper.FixtureHelper; import java.time.LocalDateTime; -import java.util.Optional; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -89,45 +88,4 @@ class 스터디_멘토역할_검증시 { .doesNotThrowAnyException(); } } - - @Nested - class 스터디_멘토_또는_학생역할_검증시 { - - @Test - void 수강하지않는_스터디가_아니라면_실패한다() { - // given - Member student = createMember(1L); - Member mentor = createMentor(2L); - LocalDateTime assignmentCreatedDate = LocalDateTime.now().minusDays(1); - Study study = fixtureHelper.createStudy( - mentor, - Period.createPeriod(assignmentCreatedDate.plusDays(5), assignmentCreatedDate.plusDays(10)), - Period.createPeriod(assignmentCreatedDate.minusDays(5), assignmentCreatedDate)); - StudyHistory studyHistory = null; - - // when & then - assertThatThrownBy(() -> studyValidator.validateStudyMentorOrStudent( - student, study, Optional.ofNullable(studyHistory))) - .isInstanceOf(CustomException.class) - .hasMessage(STUDY_ACCESS_NOT_ALLOWED.getMessage()); - } - - @Test - void 멘토이지만_자신이_맡은_스터디가_아니라면_실패한다() { - // given - Member currentMember = createMentor(1L); - Member mentor = createMentor(2L); - LocalDateTime assignmentCreatedDate = LocalDateTime.now().minusDays(1); - Study study = fixtureHelper.createStudy( - mentor, - Period.createPeriod(assignmentCreatedDate.plusDays(5), assignmentCreatedDate.plusDays(10)), - Period.createPeriod(assignmentCreatedDate.minusDays(5), assignmentCreatedDate)); - - // when & then - assertThatThrownBy( - () -> studyValidator.validateStudyMentorOrStudent(currentMember, study, Optional.empty())) - .isInstanceOf(CustomException.class) - .hasMessage(STUDY_MENTOR_INVALID.getMessage()); - } - } } diff --git a/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java b/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java index 05f8852db..d39cf6334 100644 --- a/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java +++ b/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java @@ -39,7 +39,7 @@ private StudyConstant() {} public static final String CURRICULUM_DESCRIPTION = "curriculumDescription"; // AssignmentHistory - public static final String SUBMISSION_LINK = "https://github.com/ownername/reponame/blob/main/week1/WIL.md"; + public static final String SUBMISSION_LINK = "https://github.com/ownername/reponame/blob/main/week1/wil.md"; public static final String COMMIT_HASH = "aa11bb22cc33"; public static final Integer CONTENT_LENGTH = 2000; public static final LocalDateTime COMMITTED_AT = LocalDateTime.of(2024, 9, 8, 0, 0);