Skip to content

Commit 680bca6

Browse files
authored
fix/KD-64 논문/자격증 제출 시 유효성 검사 추가 (#315)
* refactor: GraduationUserQueryService에 me 메서드를 추가해 코드 중복 최소화 * fix: 기존 선택한 졸업 방식과의 일치, 일정이 진행중인지 여부를 검증하는 로직 추가 * refactor: 로깅용 코드 제거 * fix: 테스트 코드 수정 * fix: 코드래빗 리뷰 반영 * test: GraudationUserQueryService의 테스트 코드 작성 * test: 추가적인 테스트 코드 작성
1 parent 9bbccbe commit 680bca6

File tree

21 files changed

+250
-74
lines changed

21 files changed

+250
-74
lines changed

aics-admin/src/testFixtures/java/graduationUser/application/GraduationUserAdminFacadeTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import kgu.developers.domain.thesis.application.command.ThesisCommandService;
2929
import kgu.developers.domain.thesis.application.query.ThesisQueryService;
3030
import kgu.developers.domain.thesis.domain.Thesis;
31+
import kgu.developers.domain.user.application.query.UserQueryService;
3132
import kgu.developers.domain.user.domain.User;
3233
import mock.repository.FakeCertificateRepository;
3334
import mock.repository.FakeFileRepository;
@@ -71,8 +72,10 @@ public void init() {
7172
fakeThesisRepository = new FakeThesisRepository();
7273
fakeCertificateRepository = new FakeCertificateRepository();
7374

75+
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
76+
7477
GraduationUserExcel graduationUserExcel = new GraduationUserExcelImpl();
75-
GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(fakeGraduationUserRepository, fakeThesisRepository, fakeCertificateRepository, graduationUserExcel);
78+
GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(userQueryService, fakeGraduationUserRepository, fakeThesisRepository, fakeCertificateRepository, graduationUserExcel);
7679

7780
FakeFileRepository fakeFileRepository = new FakeFileRepository();
7881
FakeScheduleRepository fakeScheduleRepository = new FakeScheduleRepository();
@@ -89,14 +92,16 @@ public void init() {
8992
fakeThesisRepository,
9093
fileStorageService,
9194
fileCommandService,
92-
scheduleQueryService
95+
scheduleQueryService,
96+
graduationUserQueryService
9397
);
9498

9599
CertificateCommandService certificateCommandService = new CertificateCommandService(
96100
fakeCertificateRepository,
97101
fileStorageService,
98102
fileCommandService,
99-
scheduleQueryService
103+
scheduleQueryService,
104+
graduationUserQueryService
100105
);
101106

102107
fakeThesisRepository.save(

aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import kgu.developers.domain.graduationUser.application.command.GraduationUserCommandService;
55
import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService;
66
import kgu.developers.domain.graduationUser.domain.GraduationUser;
7-
import kgu.developers.domain.user.application.query.UserQueryService;
87
import lombok.RequiredArgsConstructor;
98
import org.springframework.stereotype.Component;
109
import org.springframework.web.multipart.MultipartFile;
@@ -14,16 +13,13 @@
1413
public class CertificateFacade {
1514

1615
private final CertificateCommandService certificateCommandService;
17-
private final UserQueryService userQueryService;
1816
private final GraduationUserQueryService graduationUserQueryService;
1917
private final GraduationUserCommandService graduationUserCommandService;
2018

2119
public Long submitCertificate(MultipartFile file, Long scheduleId) {
2220
Long certificateId = certificateCommandService.submitCertificate(file,scheduleId);
23-
String userId = userQueryService.getMyId();
24-
GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId);
21+
GraduationUser graduationUser = graduationUserQueryService.me();
2522
graduationUserCommandService.updateCertificate(graduationUser, certificateId);
2623
return certificateId;
2724
}
28-
2925
}

aics-api/src/main/java/kgu/developers/api/graduationUser/application/GraduationUserFacade.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService;
66
import kgu.developers.domain.graduationUser.domain.GraduationType;
77
import kgu.developers.domain.graduationUser.domain.GraduationUser;
8-
import kgu.developers.domain.user.application.query.UserQueryService;
98
import lombok.RequiredArgsConstructor;
109
import org.springframework.stereotype.Component;
1110

@@ -14,25 +13,19 @@
1413
public class GraduationUserFacade {
1514
private final GraduationUserQueryService graduationUserQueryService;
1615
private final GraduationUserCommandService graduationUserCommandService;
17-
private final UserQueryService userQueryService;
1816

1917
public void updateGraduationType(GraduationType type) {
20-
String userId = userQueryService.getMyId();
21-
GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId);
22-
graduationUser.validateAccessPermission(userQueryService.getMyId());
18+
GraduationUser graduationUser = graduationUserQueryService.me();
2319
graduationUserCommandService.updateGraduationType(graduationUser,type);
2420
}
2521

2622
public void updateGraduationUserEmail(String email) {
27-
String userId = userQueryService.getMyId();
28-
GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId);
29-
graduationUser.validateAccessPermission(userQueryService.getMyId());
23+
GraduationUser graduationUser = graduationUserQueryService.me();
3024
graduationUserCommandService.updateGraduationUserEmail(graduationUser,email);
3125
}
3226

3327
public MyGraduationUserResponse getMyGraduationUser() {
34-
String userId = userQueryService.getMyId();
35-
GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId);
28+
GraduationUser graduationUser = graduationUserQueryService.me();
3629
return MyGraduationUserResponse.from(graduationUser);
3730
}
3831
}

aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import kgu.developers.domain.schedule.application.query.ScheduleQueryService;
77
import kgu.developers.domain.schedule.domain.Schedule;
88
import kgu.developers.domain.thesis.application.command.ThesisCommandService;
9-
import kgu.developers.domain.user.application.query.UserQueryService;
109
import lombok.RequiredArgsConstructor;
1110
import org.springframework.stereotype.Component;
1211
import org.springframework.web.multipart.MultipartFile;
@@ -16,15 +15,13 @@
1615
public class ThesisFacade {
1716

1817
private final ThesisCommandService thesisCommandService;
19-
private final UserQueryService userQueryService;
2018
private final GraduationUserQueryService graduationUserQueryService;
2119
private final ScheduleQueryService scheduleQueryService;
2220
private final GraduationUserCommandService graduationUserCommandService;
2321

2422
public Long submitThesis(MultipartFile file, Long scheduleId) {
2523
Long thesisId = thesisCommandService.submitThesis(file,scheduleId);
26-
String userId = userQueryService.getMyId();
27-
GraduationUser graduationUser = graduationUserQueryService.getByUserId(userId);
24+
GraduationUser graduationUser = graduationUserQueryService.me();
2825

2926
Schedule schedule = scheduleQueryService.getScheduleManagement(scheduleId);
3027

aics-api/src/testFixtures/java/graduationUser/application/GraduationUserFacadeTest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,18 @@ public class GraduationUserFacadeTest {
3333
public void init() {
3434
fakeGraduationUserRepository = new FakeGraduationUserRepository();
3535
FakeUserRepository fakeUserRepository = new FakeUserRepository();
36+
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
3637

37-
GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(fakeGraduationUserRepository,new FakeThesisRepository(), new FakeCertificateRepository(), new GraduationUserExcelImpl());
38-
GraduationUserCommandService graduationUserCommandService = new GraduationUserCommandService(fakeGraduationUserRepository);
38+
GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(
39+
userQueryService,
40+
fakeGraduationUserRepository,
41+
new FakeThesisRepository(),
42+
new FakeCertificateRepository(),
43+
new GraduationUserExcelImpl());
3944

40-
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
45+
GraduationUserCommandService graduationUserCommandService = new GraduationUserCommandService(fakeGraduationUserRepository);
4146
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
42-
graduationuserFacade = new GraduationUserFacade(graduationUserQueryService,graduationUserCommandService,userQueryService);
47+
graduationuserFacade = new GraduationUserFacade(graduationUserQueryService,graduationUserCommandService);
4348

4449
User user = fakeUserRepository.save(User.builder()
4550
.id("202411345")

aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,24 @@ public void init() {
3333
FakeUserRepository fakeUserRepository = new FakeUserRepository();
3434
FakeRefreshTokenRepository fakeRefreshTokenRepository = new FakeRefreshTokenRepository();
3535

36+
UserQueryService userQueryService = new UserQueryService(fakeUserRepository);
37+
38+
GraduationUserQueryService graduationUserQueryService = new GraduationUserQueryService(
39+
userQueryService,
40+
new FakeGraduationUserRepository(),
41+
new FakeThesisRepository(),
42+
new FakeCertificateRepository(),
43+
new GraduationUserExcelImpl()
44+
);
45+
3646
authService = new AuthService(
37-
new UserQueryService(fakeUserRepository),
47+
userQueryService,
3848
new BCryptPasswordEncoder(),
3949
TokenProvider.builder()
4050
.jwtProperties(new JwtProperties("testIssuer", "testSecretKey"))
4151
.build(),
4252
fakeRefreshTokenRepository,
43-
new GraduationUserQueryService(
44-
new FakeGraduationUserRepository(),
45-
new FakeThesisRepository(),
46-
new FakeCertificateRepository(),
47-
new GraduationUserExcelImpl())
53+
graduationUserQueryService
4854
);
4955

5056
user = fakeUserRepository.save(User.builder()

aics-common/src/main/java/kgu/developers/common/exception/GlobalExceptionHandler.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package kgu.developers.common.exception;
22

3-
import static kgu.developers.common.exception.AdminExceptionCode.NOT_ADMIN;
4-
import static kgu.developers.common.exception.GlobalExceptionCode.INVALID_INPUT;
5-
import static kgu.developers.common.exception.GlobalExceptionCode.SERVER_ERROR;
6-
import static org.springframework.http.HttpStatus.FORBIDDEN;
7-
8-
import java.util.List;
9-
import java.util.stream.Collectors;
10-
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
115
import org.springframework.beans.TypeMismatchException;
126
import org.springframework.context.ApplicationEventPublisher;
137
import org.springframework.context.MessageSourceResolvable;
@@ -23,8 +17,13 @@
2317
import org.springframework.web.method.annotation.HandlerMethodValidationException;
2418
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
2519

26-
import lombok.RequiredArgsConstructor;
27-
import lombok.extern.slf4j.Slf4j;
20+
import java.util.List;
21+
import java.util.stream.Collectors;
22+
23+
import static kgu.developers.common.exception.AdminExceptionCode.NOT_ADMIN;
24+
import static kgu.developers.common.exception.GlobalExceptionCode.INVALID_INPUT;
25+
import static kgu.developers.common.exception.GlobalExceptionCode.SERVER_ERROR;
26+
import static org.springframework.http.HttpStatus.FORBIDDEN;
2827

2928
@Slf4j
3029
@RestControllerAdvice

aics-domain/src/main/java/kgu/developers/domain/certificate/application/command/CertificateCommandService.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package kgu.developers.domain.certificate.application.command;
22

3-
import kgu.developers.domain.certificate.exception.CertificateNotFoundException;
4-
import org.springframework.stereotype.Service;
5-
import org.springframework.transaction.annotation.Transactional;
6-
import org.springframework.web.multipart.MultipartFile;
7-
83
import kgu.developers.domain.certificate.domain.Certificate;
94
import kgu.developers.domain.certificate.domain.CertificateRepository;
5+
import kgu.developers.domain.certificate.exception.CertificateInvalidGraduationTypeException;
6+
import kgu.developers.domain.certificate.exception.CertificateNotFoundException;
7+
import kgu.developers.domain.certificate.exception.CertificateNotInSubmissionPeriodException;
108
import kgu.developers.domain.file.application.command.FileCommandService;
119
import kgu.developers.domain.file.domain.FileDomain;
1210
import kgu.developers.domain.file.infrastructure.repository.FileStorageService;
11+
import kgu.developers.domain.graduationUser.application.query.GraduationUserQueryService;
12+
import kgu.developers.domain.graduationUser.domain.GraduationType;
13+
import kgu.developers.domain.graduationUser.domain.GraduationUser;
1314
import kgu.developers.domain.schedule.application.query.ScheduleQueryService;
15+
import kgu.developers.domain.schedule.domain.Schedule;
1416
import lombok.RequiredArgsConstructor;
17+
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Transactional;
19+
import org.springframework.web.multipart.MultipartFile;
20+
21+
import java.time.LocalDateTime;
1522

1623
@Service
1724
@Transactional
@@ -21,11 +28,25 @@ public class CertificateCommandService {
2128
private final FileStorageService fileStorageService;
2229
private final FileCommandService fileCommandService;
2330
private final ScheduleQueryService scheduleQueryService;
31+
private final GraduationUserQueryService graduationUserQueryService;
2432

2533
public Long submitCertificate(MultipartFile file, Long scheduleId) {
34+
Schedule schedule = scheduleQueryService.getScheduleManagement(scheduleId);
35+
36+
GraduationUser graduationUser = graduationUserQueryService.me();
37+
38+
if(graduationUser.getGraduationType() != GraduationType.CERTIFICATE) {
39+
throw new CertificateInvalidGraduationTypeException();
40+
}
41+
42+
LocalDateTime referenceTime = LocalDateTime.now();
43+
44+
if(!schedule.isInProgress(referenceTime)) {
45+
throw new CertificateNotInSubmissionPeriodException();
46+
}
47+
2648
String storedPath = fileStorageService.store(file, FileDomain.CERTIFICATE);
2749
Long fileId = fileCommandService.saveFile(file, storedPath).getId();
28-
scheduleQueryService.checkExistsOrThrow(scheduleId);
2950

3051
Certificate certificate = Certificate.create(scheduleId, fileId);
3152
return certificateRepository.save(certificate);

aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateDomainExceptionCode.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
import lombok.Getter;
66
import org.springframework.http.HttpStatus;
77

8+
import static org.springframework.http.HttpStatus.BAD_REQUEST;
89
import static org.springframework.http.HttpStatus.NOT_FOUND;
910

1011
@Getter
1112
@AllArgsConstructor
1213
public enum CertificateDomainExceptionCode implements ExceptionCode {
13-
CERTIFICATE_NOT_FOUND(NOT_FOUND, "해당 자격증을 찾을 수 없습니다.");
14+
CERTIFICATE_NOT_FOUND(NOT_FOUND, "해당 자격증을 찾을 수 없습니다."),
15+
CERTIFICATE_NOT_IN_SUBMISSION_PERIOD_EXCEPTION(BAD_REQUEST, "현재 자격증 제출 기간이 아닙니다."),
16+
CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION(BAD_REQUEST, "선택하신 제출 방식이 자격증이 아닙니다."),
17+
;
1418

1519
private final HttpStatus status;
1620
private final String message;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package kgu.developers.domain.certificate.exception;
2+
3+
import kgu.developers.common.exception.CustomException;
4+
5+
import static kgu.developers.domain.certificate.exception.CertificateDomainExceptionCode.CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION;
6+
7+
public class CertificateInvalidGraduationTypeException extends CustomException {
8+
public CertificateInvalidGraduationTypeException() {
9+
super(CERTIFICATE_INVALID_GRADUATION_TYPE_EXCEPTION);
10+
}
11+
}

0 commit comments

Comments
 (0)