diff --git a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java index 892597e90..801cbf10c 100644 --- a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java +++ b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java @@ -32,10 +32,10 @@ public ResponseEntity apply( @AuthorizedUser SiteUser siteUser, @Valid @RequestBody ApplyRequest applyRequest ) { - boolean result = applicationSubmissionService.apply(siteUser, applyRequest); + ApplicationSubmissionResponse applicationSubmissionResponse = applicationSubmissionService.apply(siteUser, applyRequest); return ResponseEntity .status(HttpStatus.OK) - .body(new ApplicationSubmissionResponse(result)); + .body(applicationSubmissionResponse); } @GetMapping diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 61dc5159e..6caa75331 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -46,7 +46,7 @@ public class Application { @Column(length = 100) private String nicknameForApply; - @Column(columnDefinition = "int not null default 0") + @Column(columnDefinition = "int not null default 1") private Integer updateCount; @Column(length = 50, nullable = false) @@ -76,7 +76,7 @@ public Application( this.gpa = gpa; this.languageTest = languageTest; this.term = term; - this.updateCount = 0; + this.updateCount = 1; this.verifyStatus = PENDING; } @@ -115,7 +115,7 @@ public Application( this.gpa = gpa; this.languageTest = languageTest; this.term = term; - this.updateCount = 0; + this.updateCount = 1; this.firstChoiceUniversity = firstChoiceUniversity; this.secondChoiceUniversity = secondChoiceUniversity; this.thirdChoiceUniversity = thirdChoiceUniversity; diff --git a/src/main/java/com/example/solidconnection/application/dto/ApplicationSubmissionResponse.java b/src/main/java/com/example/solidconnection/application/dto/ApplicationSubmissionResponse.java index 4f353733b..e90994c37 100644 --- a/src/main/java/com/example/solidconnection/application/dto/ApplicationSubmissionResponse.java +++ b/src/main/java/com/example/solidconnection/application/dto/ApplicationSubmissionResponse.java @@ -1,5 +1,11 @@ package com.example.solidconnection.application.dto; +import com.example.solidconnection.application.domain.Application; + public record ApplicationSubmissionResponse( - boolean isSuccess) { + int applyCount +) { + public static ApplicationSubmissionResponse from(Application application) { + return new ApplicationSubmissionResponse(application.getUpdateCount()); + } } diff --git a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java index dfc455146..432e93aff 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java @@ -1,6 +1,7 @@ package com.example.solidconnection.application.service; import com.example.solidconnection.application.domain.Application; +import com.example.solidconnection.application.dto.ApplicationSubmissionResponse; import com.example.solidconnection.application.dto.ApplyRequest; import com.example.solidconnection.application.dto.UniversityChoiceRequest; import com.example.solidconnection.application.repository.ApplicationRepository; @@ -49,15 +50,10 @@ public class ApplicationSubmissionService { key = {"applications:all"}, cacheManager = "customCacheManager" ) - public boolean apply(SiteUser siteUser, ApplyRequest applyRequest) { + public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest applyRequest) { UniversityChoiceRequest universityChoiceRequest = applyRequest.universityChoiceRequest(); - - Long gpaScoreId = applyRequest.gpaScoreId(); - Long languageTestScoreId = applyRequest.languageTestScoreId(); - GpaScore gpaScore = getValidGpaScore(siteUser, gpaScoreId); - LanguageTestScore languageTestScore = getValidLanguageTestScore(siteUser, languageTestScoreId); - - Optional application = applicationRepository.findBySiteUserAndTerm(siteUser, term); + GpaScore gpaScore = getValidGpaScore(siteUser, applyRequest.gpaScoreId()); + LanguageTestScore languageTestScore = getValidLanguageTestScore(siteUser, applyRequest.languageTestScoreId()); UniversityInfoForApply firstChoiceUniversity = universityInfoForApplyRepository .getUniversityInfoForApplyByIdAndTerm(universityChoiceRequest.firstChoiceUniversityId(), term); @@ -68,22 +64,19 @@ public boolean apply(SiteUser siteUser, ApplyRequest applyRequest) { .map(id -> universityInfoForApplyRepository.getUniversityInfoForApplyByIdAndTerm(id, term)) .orElse(null); - if (application.isEmpty()) { - Application newApplication = new Application(siteUser, gpaScore.getGpa(), languageTestScore.getLanguageTest(), - term, firstChoiceUniversity, secondChoiceUniversity, thirdChoiceUniversity, getRandomNickname()); - newApplication.setVerifyStatus(VerifyStatus.APPROVED); - applicationRepository.save(newApplication); - } else { - Application before = application.get(); - validateUpdateLimitNotExceed(before); - before.setIsDeleteTrue(); // 기존 이력 soft delete 수행한다. - - Application newApplication = new Application(siteUser, gpaScore.getGpa(), languageTestScore.getLanguageTest(), - term, before.getUpdateCount() + 1, firstChoiceUniversity, secondChoiceUniversity, thirdChoiceUniversity, getRandomNickname()); - newApplication.setVerifyStatus(VerifyStatus.APPROVED); - applicationRepository.save(newApplication); - } - return true; + Optional existingApplication = applicationRepository.findBySiteUserAndTerm(siteUser, term); + int updateCount = existingApplication + .map(application -> { + validateUpdateLimitNotExceed(application); + application.setIsDeleteTrue(); + return application.getUpdateCount() + 1; + }) + .orElse(1); + Application newApplication = new Application(siteUser, gpaScore.getGpa(), languageTestScore.getLanguageTest(), + term, updateCount, firstChoiceUniversity, secondChoiceUniversity, thirdChoiceUniversity, getRandomNickname()); + newApplication.setVerifyStatus(VerifyStatus.APPROVED); + applicationRepository.save(newApplication); + return ApplicationSubmissionResponse.from(newApplication); } private GpaScore getValidGpaScore(SiteUser siteUser, Long gpaScoreId) { diff --git a/src/main/resources/db/migration/V10__change_update_count_default_value.sql b/src/main/resources/db/migration/V10__change_update_count_default_value.sql new file mode 100644 index 000000000..20327b96e --- /dev/null +++ b/src/main/resources/db/migration/V10__change_update_count_default_value.sql @@ -0,0 +1,2 @@ +ALTER TABLE application + ALTER COLUMN update_count SET DEFAULT 1; diff --git a/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java b/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java index ffd3818ce..f4f442840 100644 --- a/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java +++ b/src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java @@ -3,6 +3,7 @@ import com.example.solidconnection.application.domain.Application; import com.example.solidconnection.application.domain.Gpa; import com.example.solidconnection.application.domain.LanguageTest; +import com.example.solidconnection.application.dto.ApplicationSubmissionResponse; import com.example.solidconnection.application.dto.ApplyRequest; import com.example.solidconnection.application.dto.UniversityChoiceRequest; import com.example.solidconnection.application.repository.ApplicationRepository; @@ -21,7 +22,6 @@ import static com.example.solidconnection.application.service.ApplicationSubmissionService.APPLICATION_UPDATE_COUNT_LIMIT; import static com.example.solidconnection.custom.exception.ErrorCode.APPLY_UPDATE_LIMIT_EXCEED; -import static com.example.solidconnection.custom.exception.ErrorCode.CANT_APPLY_FOR_SAME_UNIVERSITY; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_GPA_SCORE_STATUS; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_LANGUAGE_TEST_SCORE_STATUS; import static org.assertj.core.api.Assertions.assertThat; @@ -56,17 +56,16 @@ class ApplicationSubmissionServiceTest extends BaseIntegrationTest { ApplyRequest request = new ApplyRequest(gpaScore.getId(), languageTestScore.getId(), universityChoiceRequest); // when - boolean result = applicationSubmissionService.apply(테스트유저_1, request); + ApplicationSubmissionResponse response = applicationSubmissionService.apply(테스트유저_1, request); // then Application savedApplication = applicationRepository.findBySiteUserAndTerm(테스트유저_1, term).orElseThrow(); assertAll( - () -> assertThat(result).isTrue(), + () -> assertThat(response.applyCount()).isEqualTo(savedApplication.getUpdateCount()), () -> assertThat(savedApplication.getGpa()).isEqualTo(gpaScore.getGpa()), () -> assertThat(savedApplication.getLanguageTest()).isEqualTo(languageTestScore.getLanguageTest()), () -> assertThat(savedApplication.getVerifyStatus()).isEqualTo(VerifyStatus.APPROVED), () -> assertThat(savedApplication.getNicknameForApply()).isNotNull(), - () -> assertThat(savedApplication.getUpdateCount()).isZero(), () -> assertThat(savedApplication.getTerm()).isEqualTo(term), () -> assertThat(savedApplication.isDelete()).isFalse(), () -> assertThat(savedApplication.getFirstChoiceUniversity().getId()).isEqualTo(괌대학_A_지원_정보.getId()), @@ -128,7 +127,7 @@ class ApplicationSubmissionServiceTest extends BaseIntegrationTest { ); ApplyRequest request = new ApplyRequest(gpaScore.getId(), languageTestScore.getId(), universityChoiceRequest); - for (int i = 0; i < APPLICATION_UPDATE_COUNT_LIMIT + 1; i++) { + for (int i = 0; i < APPLICATION_UPDATE_COUNT_LIMIT; i++) { applicationSubmissionService.apply(테스트유저_1, request); }