diff --git a/aics-admin/src/testFixtures/java/graduationUser/application/GraduationUserAdminFacadeTest.java b/aics-admin/src/testFixtures/java/graduationUser/application/GraduationUserAdminFacadeTest.java index 9757baba..6c66d231 100644 --- a/aics-admin/src/testFixtures/java/graduationUser/application/GraduationUserAdminFacadeTest.java +++ b/aics-admin/src/testFixtures/java/graduationUser/application/GraduationUserAdminFacadeTest.java @@ -28,6 +28,7 @@ import kgu.developers.domain.thesis.application.command.ThesisCommandService; import kgu.developers.domain.thesis.application.query.ThesisQueryService; import kgu.developers.domain.thesis.domain.Thesis; +import kgu.developers.domain.user.application.query.UserQueryService; import kgu.developers.domain.user.domain.User; import mock.repository.FakeCertificateRepository; import mock.repository.FakeFileRepository; @@ -71,8 +72,10 @@ public void init() { fakeThesisRepository = new FakeThesisRepository(); fakeCertificateRepository = new FakeCertificateRepository(); + UserQueryService userQueryService = new UserQueryService(fakeUserRepository); + GraduationUserExcel graduationUserExcel = new GraduationUserExcelImpl(); - GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(fakeGraduationUserRepository, fakeThesisRepository, fakeCertificateRepository, graduationUserExcel); + GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(userQueryService, fakeGraduationUserRepository, fakeThesisRepository, fakeCertificateRepository, graduationUserExcel); FakeFileRepository fakeFileRepository = new FakeFileRepository(); FakeScheduleRepository fakeScheduleRepository = new FakeScheduleRepository(); @@ -89,14 +92,16 @@ public void init() { fakeThesisRepository, fileStorageService, fileCommandService, - scheduleQueryService + scheduleQueryService, + graduationUserQueryService ); CertificateCommandService certificateCommandService = new CertificateCommandService( fakeCertificateRepository, fileStorageService, fileCommandService, - scheduleQueryService + scheduleQueryService, + graduationUserQueryService ); fakeThesisRepository.save( diff --git a/aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java b/aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java index 63e4d27e..da919c41 100644 --- a/aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java +++ b/aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java @@ -4,7 +4,6 @@ import kgu.developers.domain.graduationUser.application.command.GraduationUserCommandService; import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService; import kgu.developers.domain.graduationUser.domain.GraduationUser; -import kgu.developers.domain.user.application.query.UserQueryService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -14,16 +13,13 @@ public class CertificateFacade { private final CertificateCommandService certificateCommandService; - private final UserQueryService userQueryService; private final GraduationUserQueryService graduationUserQueryService; private final GraduationUserCommandService graduationUserCommandService; public Long submitCertificate(MultipartFile file, Long scheduleId) { Long certificateId = certificateCommandService.submitCertificate(file,scheduleId); - String userId = userQueryService.getMyId(); - GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId); + GraduationUser graduationUser = graduationUserQueryService.me(); graduationUserCommandService.updateCertificate(graduationUser, certificateId); return certificateId; } - } diff --git a/aics-api/src/main/java/kgu/developers/api/graduationUser/application/GraduationUserFacade.java b/aics-api/src/main/java/kgu/developers/api/graduationUser/application/GraduationUserFacade.java index 6625e55b..af62ae6f 100644 --- a/aics-api/src/main/java/kgu/developers/api/graduationUser/application/GraduationUserFacade.java +++ b/aics-api/src/main/java/kgu/developers/api/graduationUser/application/GraduationUserFacade.java @@ -5,7 +5,6 @@ import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService; import kgu.developers.domain.graduationUser.domain.GraduationType; import kgu.developers.domain.graduationUser.domain.GraduationUser; -import kgu.developers.domain.user.application.query.UserQueryService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -14,25 +13,19 @@ public class GraduationUserFacade { private final GraduationUserQueryService graduationUserQueryService; private final GraduationUserCommandService graduationUserCommandService; - private final UserQueryService userQueryService; public void updateGraduationType(GraduationType type) { - String userId = userQueryService.getMyId(); - GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId); - graduationUser.validateAccessPermission(userQueryService.getMyId()); + GraduationUser graduationUser = graduationUserQueryService.me(); graduationUserCommandService.updateGraduationType(graduationUser,type); } public void updateGraduationUserEmail(String email) { - String userId = userQueryService.getMyId(); - GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId); - graduationUser.validateAccessPermission(userQueryService.getMyId()); + GraduationUser graduationUser = graduationUserQueryService.me(); graduationUserCommandService.updateGraduationUserEmail(graduationUser,email); } public MyGraduationUserResponse getMyGraduationUser() { - String userId = userQueryService.getMyId(); - GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId); + GraduationUser graduationUser = graduationUserQueryService.me(); return MyGraduationUserResponse.from(graduationUser); } } diff --git a/aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java b/aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java index 49fb16ac..ea8b9b42 100644 --- a/aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java +++ b/aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java @@ -6,7 +6,6 @@ import kgu.developers.domain.schedule.application.query.ScheduleQueryService; import kgu.developers.domain.schedule.domain.Schedule; import kgu.developers.domain.thesis.application.command.ThesisCommandService; -import kgu.developers.domain.user.application.query.UserQueryService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -16,15 +15,13 @@ public class ThesisFacade { private final ThesisCommandService thesisCommandService; - private final UserQueryService userQueryService; private final GraduationUserQueryService graduationUserQueryService; private final ScheduleQueryService scheduleQueryService; private final GraduationUserCommandService graduationUserCommandService; public Long submitThesis(MultipartFile file, Long scheduleId) { Long thesisId = thesisCommandService.submitThesis(file,scheduleId); - String userId = userQueryService.getMyId(); - GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId); + GraduationUser graduationUser = graduationUserQueryService.me(); Schedule schedule = scheduleQueryService.getScheduleManagement(scheduleId); diff --git a/aics-api/src/testFixtures/java/graduationUser/application/GraduationUserFacadeTest.java b/aics-api/src/testFixtures/java/graduationUser/application/GraduationUserFacadeTest.java index e352b927..a649c5a5 100644 --- a/aics-api/src/testFixtures/java/graduationUser/application/GraduationUserFacadeTest.java +++ b/aics-api/src/testFixtures/java/graduationUser/application/GraduationUserFacadeTest.java @@ -33,13 +33,18 @@ public class GraduationUserFacadeTest { public void init() { fakeGraduationUserRepository = new FakeGraduationUserRepository(); FakeUserRepository fakeUserRepository = new FakeUserRepository(); + UserQueryService userQueryService = new UserQueryService(fakeUserRepository); - GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(fakeGraduationUserRepository,new FakeThesisRepository(), new FakeCertificateRepository(), new GraduationUserExcelImpl()); - GraduationUserCommandService graduationUserCommandService = new GraduationUserCommandService(fakeGraduationUserRepository); + GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService( + userQueryService, + fakeGraduationUserRepository, + new FakeThesisRepository(), + new FakeCertificateRepository(), + new GraduationUserExcelImpl()); - UserQueryService userQueryService = new UserQueryService(fakeUserRepository); + GraduationUserCommandService graduationUserCommandService = new GraduationUserCommandService(fakeGraduationUserRepository); BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - graduationuserFacade = new GraduationUserFacade(graduationUserQueryService,graduationUserCommandService,userQueryService); + graduationuserFacade = new GraduationUserFacade(graduationUserQueryService,graduationUserCommandService); User user = fakeUserRepository.save(User.builder() .id("202411345") diff --git a/aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java b/aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java index a27a8744..9c6387e3 100644 --- a/aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java +++ b/aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java @@ -33,18 +33,24 @@ public void init() { FakeUserRepository fakeUserRepository = new FakeUserRepository(); FakeRefreshTokenRepository fakeRefreshTokenRepository = new FakeRefreshTokenRepository(); + UserQueryService userQueryService = new UserQueryService(fakeUserRepository); + + GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService( + userQueryService, + new FakeGraduationUserRepository(), + new FakeThesisRepository(), + new FakeCertificateRepository(), + new GraduationUserExcelImpl() + ); + authService = new AuthService( - new UserQueryService(fakeUserRepository), + userQueryService, new BCryptPasswordEncoder(), TokenProvider.builder() .jwtProperties(new JwtProperties("testIssuer", "testSecretKey")) .build(), fakeRefreshTokenRepository, - new GraduationUserQueryService( - new FakeGraduationUserRepository(), - new FakeThesisRepository(), - new FakeCertificateRepository(), - new GraduationUserExcelImpl()) + graduationUserQueryService ); user = fakeUserRepository.save(User.builder() diff --git a/aics-common/src/main/java/kgu/developers/common/exception/GlobalExceptionHandler.java b/aics-common/src/main/java/kgu/developers/common/exception/GlobalExceptionHandler.java index d8d8201f..2f717caa 100644 --- a/aics-common/src/main/java/kgu/developers/common/exception/GlobalExceptionHandler.java +++ b/aics-common/src/main/java/kgu/developers/common/exception/GlobalExceptionHandler.java @@ -1,13 +1,7 @@ package kgu.developers.common.exception; -import static kgu.developers.common.exception.AdminExceptionCode.NOT_ADMIN; -import static kgu.developers.common.exception.GlobalExceptionCode.INVALID_INPUT; -import static kgu.developers.common.exception.GlobalExceptionCode.SERVER_ERROR; -import static org.springframework.http.HttpStatus.FORBIDDEN; - -import java.util.List; -import java.util.stream.Collectors; - +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.TypeMismatchException; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.MessageSourceResolvable; @@ -23,8 +17,13 @@ import org.springframework.web.method.annotation.HandlerMethodValidationException; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.stream.Collectors; + +import static kgu.developers.common.exception.AdminExceptionCode.NOT_ADMIN; +import static kgu.developers.common.exception.GlobalExceptionCode.INVALID_INPUT; +import static kgu.developers.common.exception.GlobalExceptionCode.SERVER_ERROR; +import static org.springframework.http.HttpStatus.FORBIDDEN; @Slf4j @RestControllerAdvice diff --git a/aics-domain/src/main/java/kgu/developers/domain/certificate/application/command/CertificateCommandService.java b/aics-domain/src/main/java/kgu/developers/domain/certificate/application/command/CertificateCommandService.java index 357750d1..79202c37 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/certificate/application/command/CertificateCommandService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/certificate/application/command/CertificateCommandService.java @@ -1,17 +1,24 @@ package kgu.developers.domain.certificate.application.command; -import kgu.developers.domain.certificate.exception.CertificateNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - import kgu.developers.domain.certificate.domain.Certificate; import kgu.developers.domain.certificate.domain.CertificateRepository; +import kgu.developers.domain.certificate.exception.CertificateInvalidGraduationTypeException; +import kgu.developers.domain.certificate.exception.CertificateNotFoundException; +import kgu.developers.domain.certificate.exception.CertificateNotInSubmissionPeriodException; import kgu.developers.domain.file.application.command.FileCommandService; import kgu.developers.domain.file.domain.FileDomain; import kgu.developers.domain.file.infrastructure.repository.FileStorageService; +import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService; +import kgu.developers.domain.graduationUser.domain.GraduationType; +import kgu.developers.domain.graduationUser.domain.GraduationUser; import kgu.developers.domain.schedule.application.query.ScheduleQueryService; +import kgu.developers.domain.schedule.domain.Schedule; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; @Service @Transactional @@ -21,11 +28,25 @@ public class CertificateCommandService { private final FileStorageService fileStorageService; private final FileCommandService fileCommandService; private final ScheduleQueryService scheduleQueryService; + private final GraduationUserQueryService graduationUserQueryService; public Long submitCertificate(MultipartFile file, Long scheduleId) { + Schedule schedule = scheduleQueryService.getScheduleManagement(scheduleId); + + GraduationUser graduationUser = graduationUserQueryService.me(); + + if(graduationUser.getGraduationType() != GraduationType.CERTIFICATE) { + throw new CertificateInvalidGraduationTypeException(); + } + + LocalDateTime referenceTime = LocalDateTime.now(); + + if(!schedule.isInProgress(referenceTime)) { + throw new CertificateNotInSubmissionPeriodException(); + } + String storedPath = fileStorageService.store(file, FileDomain.CERTIFICATE); Long fileId = fileCommandService.saveFile(file, storedPath).getId(); - scheduleQueryService.checkExistsOrThrow(scheduleId); Certificate certificate = Certificate.create(scheduleId, fileId); return certificateRepository.save(certificate); diff --git a/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateDomainExceptionCode.java b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateDomainExceptionCode.java index 36153bd9..577c306f 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateDomainExceptionCode.java +++ b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateDomainExceptionCode.java @@ -5,12 +5,16 @@ import lombok.Getter; import org.springframework.http.HttpStatus; +import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.NOT_FOUND; @Getter @AllArgsConstructor public enum CertificateDomainExceptionCode implements ExceptionCode { - CERTIFICATE_NOT_FOUND(NOT_FOUND, "해당 자격증을 찾을 수 없습니다."); + CERTIFICATE_NOT_FOUND(NOT_FOUND, "해당 자격증을 찾을 수 없습니다."), + CERTIFICATE_NOT_IN_SUBMISSION_PERIOD_EXCEPTION(BAD_REQUEST, "현재 자격증 제출 기간이 아닙니다."), + CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION(BAD_REQUEST, "선택하신 제출 방식이 자격증이 아닙니다."), + ; private final HttpStatus status; private final String message; diff --git a/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateInvalidGraduationTypeException.java b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateInvalidGraduationTypeException.java new file mode 100644 index 00000000..af28a9b3 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateInvalidGraduationTypeException.java @@ -0,0 +1,11 @@ +package kgu.developers.domain.certificate.exception; + +import kgu.developers.common.exception.CustomException; + +import static kgu.developers.domain.certificate.exception.CertificateDomainExceptionCode.CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION; + +public class CertificateInvalidGraduationTypeException extends CustomException { + public CertificateInvalidGraduationTypeException() { + super(CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateNotInSubmissionPeriodException.java b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateNotInSubmissionPeriodException.java new file mode 100644 index 00000000..78f63c55 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateNotInSubmissionPeriodException.java @@ -0,0 +1,11 @@ +package kgu.developers.domain.certificate.exception; + +import kgu.developers.common.exception.CustomException; + +import static kgu.developers.domain.certificate.exception.CertificateDomainExceptionCode.CERTIFICATE_NOT_IN_SUBMISSION_PERIOD_EXCEPTION; + +public class CertificateNotInSubmissionPeriodException extends CustomException { + public CertificateNotInSubmissionPeriodException() { + super(CERTIFICATE_NOT_IN_SUBMISSION_PERIOD_EXCEPTION); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.java b/aics-domain/src/main/java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.java index 90e5c5c2..77cbd1d0 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.java @@ -9,6 +9,7 @@ import kgu.developers.domain.graduationUser.exception.GraduationUserNotFoundException; import kgu.developers.domain.graduationUser.infrastructure.excel.GraduationUserExcelRow; import kgu.developers.domain.thesis.domain.ThesisRepository; +import kgu.developers.domain.user.application.query.UserQueryService; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -20,6 +21,7 @@ @RequiredArgsConstructor @Transactional(readOnly = true) public class GraduationUserQueryService { + private final UserQueryService userQueryService; private final GraduationUserRepository graduationUserRepository; private final ThesisRepository thesisRepository; private final CertificateRepository certificateRepository; @@ -108,4 +110,10 @@ public GraduationUser getByUserId(String userId) { return graduationUserRepository.findByUserIdAndDeletedAtIsNull(userId) .orElseThrow(GraduationUserNotFoundException::new); } + + public GraduationUser me() { + String userId = userQueryService.getMyId(); + return graduationUserRepository.findByUserIdAndDeletedAtIsNull(userId) + .orElseThrow(GraduationUserNotFoundException::new); + } } diff --git a/aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java b/aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java index a920660b..72af233f 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java @@ -24,6 +24,7 @@ public class ScheduleQueryService { APPROVED, OTHER ); + public List getAllScheduleManagements() { return scheduleRepository.findAll().stream() @@ -36,14 +37,9 @@ public Schedule getScheduleManagement(Long id) { .findById(id) .orElseThrow(ScheduleNotFoundException::new); } + public Schedule getBySubmissionType(SubmissionType submissionType) { return scheduleRepository.findBySubmissionType(submissionType) .orElseThrow(ScheduleNotFoundException::new); } - - public void checkExistsOrThrow(Long id) { - if (!scheduleRepository.existsById(id)) { - throw new ScheduleNotFoundException(); - } - } } diff --git a/aics-domain/src/main/java/kgu/developers/domain/schedule/domain/Schedule.java b/aics-domain/src/main/java/kgu/developers/domain/schedule/domain/Schedule.java index fef1cf72..1ab87eb9 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/schedule/domain/Schedule.java +++ b/aics-domain/src/main/java/kgu/developers/domain/schedule/domain/Schedule.java @@ -41,6 +41,11 @@ public ScheduleStatus determineStatusAt(LocalDateTime referenceTime) { } return ScheduleStatus.IN_PROGRESS; } + + public boolean isInProgress(LocalDateTime referenceTime) { + return determineStatusAt(referenceTime) == ScheduleStatus.IN_PROGRESS; + } + public void updateSubmissionType(SubmissionType submissionType) { this.submissionType = submissionType; } diff --git a/aics-domain/src/main/java/kgu/developers/domain/thesis/application/command/ThesisCommandService.java b/aics-domain/src/main/java/kgu/developers/domain/thesis/application/command/ThesisCommandService.java index f2074e48..2d949f6c 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/thesis/application/command/ThesisCommandService.java +++ b/aics-domain/src/main/java/kgu/developers/domain/thesis/application/command/ThesisCommandService.java @@ -4,14 +4,22 @@ import kgu.developers.domain.file.application.command.FileCommandService; import kgu.developers.domain.file.domain.FileDomain; import kgu.developers.domain.file.infrastructure.repository.FileStorageService; +import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService; +import kgu.developers.domain.graduationUser.domain.GraduationType; +import kgu.developers.domain.graduationUser.domain.GraduationUser; import kgu.developers.domain.schedule.application.query.ScheduleQueryService; +import kgu.developers.domain.schedule.domain.Schedule; import kgu.developers.domain.thesis.domain.Thesis; import kgu.developers.domain.thesis.domain.ThesisRepository; +import kgu.developers.domain.thesis.exception.ThesisInvalidGraduationTypeException; import kgu.developers.domain.thesis.exception.ThesisNotFoundException; +import kgu.developers.domain.thesis.exception.ThesisNotInSubmissionPeriodException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.time.LocalDateTime; + @Service @Transactional @RequiredArgsConstructor @@ -20,11 +28,24 @@ public class ThesisCommandService { private final FileStorageService fileStorageService; private final FileCommandService fileCommandService; private final ScheduleQueryService scheduleQueryService; + private final GraduationUserQueryService graduationUserQueryService; public Long submitThesis(MultipartFile file, Long scheduleId) { + Schedule schedule = scheduleQueryService.getScheduleManagement(scheduleId); + LocalDateTime referenceTime = LocalDateTime.now(); + + GraduationUser graduationUser = graduationUserQueryService.me(); + + if(graduationUser.getGraduationType() != GraduationType.THESIS) { + throw new ThesisInvalidGraduationTypeException(); + } + + if(!schedule.isInProgress(referenceTime)) { + throw new ThesisNotInSubmissionPeriodException(); + } + String storedPath = fileStorageService.store(file, FileDomain.THESIS); Long fileId = fileCommandService.saveFile(file, storedPath).getId(); - scheduleQueryService.checkExistsOrThrow(scheduleId); Thesis thesis = Thesis.create(scheduleId, fileId); return thesisRepository.save(thesis); diff --git a/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisDomainExceptionCode.java b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisDomainExceptionCode.java index b0af5288..0742b628 100644 --- a/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisDomainExceptionCode.java +++ b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisDomainExceptionCode.java @@ -5,12 +5,15 @@ import lombok.Getter; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.NOT_FOUND; +import static org.springframework.http.HttpStatus.BAD_REQUEST; @Getter @AllArgsConstructor public enum ThesisDomainExceptionCode implements ExceptionCode { - THESIS_NOT_FOUND(NOT_FOUND, "해당 논문을 찾을 수 없습니다."); + THESIS_NOT_FOUND(BAD_REQUEST, "해당 논문을 찾을 수 없습니다."), + THESIS_NOT_IN_SUBMISSION_PERIOD_EXCEPTION(BAD_REQUEST, "현재 논문 제출 기간이 아닙니다."), + THESIS_INVALID_GRADUATION_TYPE_EXCEPTION(BAD_REQUEST, "선택하신 제출 방식이 논문이 아닙니다."), + ; private final HttpStatus status; private final String message; diff --git a/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisInvalidGraduationTypeException.java b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisInvalidGraduationTypeException.java new file mode 100644 index 00000000..b265e767 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisInvalidGraduationTypeException.java @@ -0,0 +1,11 @@ +package kgu.developers.domain.thesis.exception; + +import kgu.developers.common.exception.CustomException; + +import static kgu.developers.domain.thesis.exception.ThesisDomainExceptionCode.THESIS_INVALID_GRADUATION_TYPE_EXCEPTION; + +public class ThesisInvalidGraduationTypeException extends CustomException { + public ThesisInvalidGraduationTypeException() { + super(THESIS_INVALID_GRADUATION_TYPE_EXCEPTION); + } +} diff --git a/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisNotInSubmissionPeriodException.java b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisNotInSubmissionPeriodException.java new file mode 100644 index 00000000..76c759d7 --- /dev/null +++ b/aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisNotInSubmissionPeriodException.java @@ -0,0 +1,11 @@ +package kgu.developers.domain.thesis.exception; + +import kgu.developers.common.exception.CustomException; + +import static kgu.developers.domain.thesis.exception.ThesisDomainExceptionCode.THESIS_NOT_IN_SUBMISSION_PERIOD_EXCEPTION; + +public class ThesisNotInSubmissionPeriodException extends CustomException { + public ThesisNotInSubmissionPeriodException() { + super(THESIS_NOT_IN_SUBMISSION_PERIOD_EXCEPTION); + } +} diff --git a/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserCommandServiceTest.java b/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserCommandServiceTest.java index 430e310d..50ce2ad0 100644 --- a/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserCommandServiceTest.java +++ b/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserCommandServiceTest.java @@ -134,20 +134,28 @@ public void updateCertificate_Success() { } @Test - @DisplayName("updateMidThesis은 주어진 타입에 따라 GraduationUser의 논문ID를 저장한다.") + @DisplayName("updateThesis은 주어진 타입에 따라 GraduationUser의 논문ID를 저장한다.") public void updateThesis_Success() { //given - Long thesisId = 1L; - Schedule schedule = Schedule.builder() + Long midThesisId = 1L; + Long finalThesisId = 2L; + Schedule midSchedule = Schedule.builder() + .id(1L) + .submissionType(SubmissionType.MIDTHESIS) + .build(); + + Schedule finalSchedule = Schedule.builder() .id(1L) .submissionType(SubmissionType.FINALTHESIS) .build(); //when - graduationUserCommandService.updateThesis(graduationUser, thesisId, schedule); + graduationUserCommandService.updateThesis(graduationUser, midThesisId, midSchedule); + graduationUserCommandService.updateThesis(graduationUser, finalThesisId, finalSchedule); //then - assertEquals(graduationUser.getFinalThesisId(),thesisId); + assertEquals(graduationUser.getMidThesisId(), midThesisId); + assertEquals(graduationUser.getFinalThesisId(), finalThesisId); } } diff --git a/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserQueryServiceTest.java b/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserQueryServiceTest.java index 8ec1510b..17797323 100644 --- a/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserQueryServiceTest.java +++ b/aics-domain/src/testFixtures/java/graduationUser/application/GraduationUserQueryServiceTest.java @@ -2,35 +2,46 @@ import kgu.developers.common.response.PaginatedListResponse; import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService; +import kgu.developers.domain.graduationUser.domain.GraduationType; import kgu.developers.domain.graduationUser.domain.GraduationUser; -import kgu.developers.domain.graduationUser.domain.GraduationUserExcel; import kgu.developers.domain.graduationUser.infrastructure.excel.GraduationUserExcelImpl; +import kgu.developers.domain.user.application.query.UserQueryService; +import kgu.developers.domain.user.domain.User; import mock.repository.FakeCertificateRepository; import mock.repository.FakeGraduationUserRepository; import mock.repository.FakeThesisRepository; +import mock.repository.FakeUserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.data.domain.PageRequest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import java.time.LocalDate; +import static kgu.developers.domain.user.domain.Major.CSE; import static org.junit.jupiter.api.Assertions.assertEquals; public class GraduationUserQueryServiceTest { private GraduationUserQueryService graduationUserQueryService; private static final Long TARGET_GRADUATION_USER_ID = 1L; private static final String TARGET_STUDENT_ID = "202211444"; - + FakeGraduationUserRepository fakeGraduationUserRepository; @BeforeEach public void init() { - FakeGraduationUserRepository fakeGraduationUserRepository = new FakeGraduationUserRepository(); + fakeGraduationUserRepository = new FakeGraduationUserRepository(); + FakeUserRepository fakeUserRepository = new FakeUserRepository(); + UserQueryService userQueryService = new UserQueryService(fakeUserRepository); graduationUserQueryService = new GraduationUserQueryService( - fakeGraduationUserRepository, - new FakeThesisRepository(), - new FakeCertificateRepository(), - new GraduationUserExcelImpl()); + userQueryService, + fakeGraduationUserRepository, + new FakeThesisRepository(), + new FakeCertificateRepository(), + new GraduationUserExcelImpl()); fakeGraduationUserRepository.save(GraduationUser.create( "202211444", "홍길동", "김교수", true, "컴퓨터공학과", LocalDate.of(2024, 2, 20) @@ -51,6 +62,21 @@ public void init() { fakeGraduationUserRepository.save(GraduationUser.create( "202214567", "정수진", "이교수", false, "인공지능학과", LocalDate.of(2024, 2, 20) )); + + fakeUserRepository.save(User.builder() + .id("202211444") + .password("password1234") + .name("홍길동") + .email("test1@kyonggi.ac.kr") + .phone("010-1234-5679") + .major(CSE) + .build()); + + UserDetails user = userQueryService.getUserById("202211444"); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication( + new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities()) + ); } @Test @@ -95,4 +121,33 @@ public void getByUserId_Success() { assertEquals(TARGET_STUDENT_ID, graduationUser.getUserId()); } + + @Test + @DisplayName("getGraduationTypeByUserId는 해당 학번의 졸업 대상자의 졸업 방식을 반환한다.") + public void getGraduationTypeByUserId_Success() { + //given + GraduationUser graduationUser = fakeGraduationUserRepository.findByUserIdAndDeletedAtIsNull(TARGET_STUDENT_ID).orElse(null); + graduationUser.updateGraduationType(GraduationType.THESIS); + fakeGraduationUserRepository.save(graduationUser); + + //when + GraduationType graduationType = graduationUserQueryService.getGraduationTypeByUserId(TARGET_STUDENT_ID); + + //then + assertEquals(GraduationType.THESIS, graduationType); + + } + + @Test + @DisplayName("me는 현재 로그인 되어 있는 졸업 대상자를 조회한다.") + public void Success() { + //given + + //when + GraduationUser result = graduationUserQueryService.me(); + + //then + assertEquals(TARGET_GRADUATION_USER_ID, result.getId()); + + } } diff --git a/aics-domain/src/testFixtures/java/schedule/application/ScheduleQueryServiceTest.java b/aics-domain/src/testFixtures/java/schedule/application/ScheduleQueryServiceTest.java index 6877b749..c0f499c6 100644 --- a/aics-domain/src/testFixtures/java/schedule/application/ScheduleQueryServiceTest.java +++ b/aics-domain/src/testFixtures/java/schedule/application/ScheduleQueryServiceTest.java @@ -9,12 +9,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - import java.time.LocalDateTime; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + public class ScheduleQueryServiceTest { private ScheduleQueryService scheduleQueryService; private FakeScheduleRepository fakeScheduleRepository; @@ -64,11 +64,21 @@ void getScheduleManagement_Success(){ } @Test - @DisplayName("getScheduleManagement는 존재하지 않는 ID면 예외를 던집니다.") + @DisplayName("getScheduleManagement는 존재하지 않는 ID면 예외를 던진다.") void getScheduleManagement_NotFound() { assertThrows(ScheduleNotFoundException.class, () -> scheduleQueryService.getScheduleManagement(99L)); } + @Test + @DisplayName("getBySubmissionType은 제출 방식을 가지고 일정을 조회한다.") + public void Success() { + //given + + //when + Schedule schedule = scheduleQueryService.getBySubmissionType(SubmissionType.SUBMITTED); + //then + assertEquals(SubmissionType.SUBMITTED, schedule.getSubmissionType()); + } }