diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java index d5f3b2bf..bbd7e619 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java @@ -1,5 +1,6 @@ package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult.GRADUATION_COUNT; import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.CHAPEL; import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.FREE_ELECTIVE; import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.NORMAL_CULTURE; @@ -19,8 +20,8 @@ import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateGraduationUseCase; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; @@ -42,29 +43,35 @@ public void generateOrModifyCompletedCredit(User user) { GraduationResult graduationResult = calculateGraduationUseCase.calculateGraduation(user); List detailGraduationResults = graduationResult.getDetailGraduationResults(); + List updatedCompletedCredits = createGeneralCompletedCreditModel(completedCredits, + detailGraduationResults); + CompletedCredit chapelCompletedCreditModel = createOrUpdateChapelCompletedCreditModel(completedCredits, + graduationResult); + CompletedCredit normalCultureCompletedCreditModel = createOrUpdateNormalCultureCompletedCreditModel( + completedCredits, graduationResult); + CompletedCredit freeElectiveCompletedCreditModel = createOrUpdateFreeElectiveCompletedCreditModel( + completedCredits, graduationResult); + + ArrayList allCompletedCreditModels = new ArrayList<>(updatedCompletedCredits); + allCompletedCreditModels.addAll( + List.of(chapelCompletedCreditModel, normalCultureCompletedCreditModel, freeElectiveCompletedCreditModel)); + generateOrModifyCompletedCreditPort.generateOrModifyCompletedCredits(user, allCompletedCreditModels); + } + + private List createGeneralCompletedCreditModel( + List completedCredits, List detailGraduationResults) { Map> resultMap = detailGraduationResults.stream() .collect(Collectors.toMap( Function.identity(), detailGraduationResult -> completedCredits.stream() - .filter(completedCredit -> completedCredit.getGraduationCategory().equals(detailGraduationResult.getGraduationCategory())) + .filter(completedCredit -> completedCredit.getGraduationCategory() + .equals(detailGraduationResult.getGraduationCategory())) .findFirst() )); - - List completedCreditModels = resultMap.keySet().stream() - .map(completedCredit -> createCompletedCreditModel(completedCredit, resultMap.get(completedCredit))) + return resultMap.keySet().stream() + .map(detailGraduationResult -> createCompletedCreditModel(detailGraduationResult, + resultMap.get(detailGraduationResult))) .collect(Collectors.toList()); - - CompletedCredit chapelCompletedCreditModel = createChapelCompletedCreditModel(completedCredits, - graduationResult); - CompletedCredit normalCultureCompletedCreditModel = createNormalCultureCompletedCreditModel(completedCredits, - graduationResult); - CompletedCredit freeElectiveCompletedCreditModel = createFreeElectiveCompletedCreditModel(completedCredits, - graduationResult); - - ArrayList allCompletedCreditModels = new ArrayList<>(completedCreditModels); - allCompletedCreditModels.addAll( - List.of(chapelCompletedCreditModel, normalCultureCompletedCreditModel, freeElectiveCompletedCreditModel)); - generateOrModifyCompletedCreditPort.generateOrModifyCompletedCredits(user, allCompletedCreditModels); } private CompletedCredit createCompletedCreditModel(DetailGraduationResult detailGraduationResult, @@ -77,51 +84,47 @@ private CompletedCredit createCompletedCreditModel(DetailGraduationResult detail .build(); } - private CompletedCredit createChapelCompletedCreditModel(List completedCredits, + private CompletedCredit createOrUpdateChapelCompletedCreditModel(List completedCredits, GraduationResult graduationResult) { - return completedCredits.stream() - .filter(completedCredit -> completedCredit.getGraduationCategory() == CHAPEL) - .map(completedCredit -> CompletedCredit.builder() - .id(completedCredit.getId()) - .totalCredit(ChapelResult.GRADUATION_COUNT / 2) - .takenCredit(graduationResult.getChapelResult().getTakenChapelCredit()) - .graduationCategory(CHAPEL).build()) - .findFirst() - .orElse(CompletedCredit.builder() - .totalCredit(ChapelResult.GRADUATION_COUNT / 2) - .takenCredit(graduationResult.getChapelResult().getTakenChapelCredit()) - .graduationCategory(CHAPEL).build()); + Optional chapelCompletedCredit = findCompletedCreditByCategory(completedCredits, CHAPEL); + return chapelCompletedCredit.map( + completedCredit -> updateCompletedCredit(completedCredit, GRADUATION_COUNT / 2, + graduationResult.getChapelResult().getTakenChapelCredit())) + .orElseGet(() -> CompletedCredit.createChapelCompletedCreditModel(graduationResult.getChapelResult())); } - private CompletedCredit createNormalCultureCompletedCreditModel(List completedCredits, + private CompletedCredit createOrUpdateNormalCultureCompletedCreditModel(List completedCredits, GraduationResult graduationResult) { - return completedCredits.stream() - .filter(completedCredit -> completedCredit.getGraduationCategory() == NORMAL_CULTURE) - .map(completedCredit -> CompletedCredit.builder() - .id(completedCredit.getId()) - .totalCredit(graduationResult.getNormalCultureGraduationResult().getTotalCredit()) - .takenCredit(graduationResult.getNormalCultureGraduationResult().getTakenCredit()) - .graduationCategory(NORMAL_CULTURE).build()) - .findFirst() - .orElse(CompletedCredit.builder() - .totalCredit(graduationResult.getNormalCultureGraduationResult().getTotalCredit()) - .takenCredit(graduationResult.getNormalCultureGraduationResult().getTakenCredit()) - .graduationCategory(NORMAL_CULTURE).build()); + Optional normalCultureCompletedCredit = findCompletedCreditByCategory(completedCredits, + NORMAL_CULTURE); + return normalCultureCompletedCredit.map(completedCredit -> updateCompletedCredit(completedCredit, + graduationResult.getNormalCultureGraduationResult().getTotalCredit(), + graduationResult.getNormalCultureGraduationResult().getTakenCredit())) + .orElseGet(() -> CompletedCredit.createNormalCultureCompletedCreditModel( + graduationResult.getNormalCultureGraduationResult())); } - private CompletedCredit createFreeElectiveCompletedCreditModel(List completedCredits, + private CompletedCredit createOrUpdateFreeElectiveCompletedCreditModel(List completedCredits, GraduationResult graduationResult) { + Optional freeElectiveCompletedCredit = findCompletedCreditByCategory(completedCredits, + FREE_ELECTIVE); + return freeElectiveCompletedCredit.map(completedCredit -> updateCompletedCredit(completedCredit, + graduationResult.getFreeElectiveGraduationResult().getTotalCredit(), + graduationResult.getFreeElectiveGraduationResult().getTakenCredit())) + .orElseGet(() -> CompletedCredit.createFreeElectiveCompletedCreditModel( + graduationResult.getFreeElectiveGraduationResult())); + } + + private Optional findCompletedCreditByCategory(List completedCredits, + GraduationCategory category) { return completedCredits.stream() - .filter(completedCredit -> completedCredit.getGraduationCategory() == FREE_ELECTIVE) - .map(completedCredit -> CompletedCredit.builder() - .id(completedCredit.getId()) - .totalCredit(graduationResult.getFreeElectiveGraduationResult().getTotalCredit()) - .takenCredit(graduationResult.getFreeElectiveGraduationResult().getTakenCredit()) - .graduationCategory(FREE_ELECTIVE).build()) - .findFirst() - .orElse(CompletedCredit.builder() - .totalCredit(graduationResult.getFreeElectiveGraduationResult().getTotalCredit()) - .takenCredit(graduationResult.getFreeElectiveGraduationResult().getTakenCredit()) - .graduationCategory(FREE_ELECTIVE).build()); + .filter(completedCredit -> completedCredit.getGraduationCategory() == category) + .findFirst(); + } + + private CompletedCredit updateCompletedCredit(CompletedCredit completedCredit, + int totalCredit, double takenCredit) { + completedCredit.updateCredit(totalCredit, takenCredit); + return completedCredit; } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/domain/model/CompletedCredit.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/domain/model/CompletedCredit.java index 1c0ff5e6..60ccb25a 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/domain/model/CompletedCredit.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/domain/model/CompletedCredit.java @@ -1,6 +1,12 @@ package com.plzgraduate.myongjigraduatebe.completedcredit.domain.model; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.FreeElectiveGraduationResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.NormalCultureGraduationResult; import lombok.Builder; import lombok.Getter; @@ -10,15 +16,50 @@ public class CompletedCredit { private final Long id; private final GraduationCategory graduationCategory; - private final int totalCredit; - private final double takenCredit; + private int totalCredit; + private double takenCredit; @Builder - private CompletedCredit(Long id, GraduationCategory graduationCategory, int totalCredit, + private CompletedCredit(Long id, GraduationCategory graduationCategory, int totalCredit, double takenCredit) { this.id = id; this.graduationCategory = graduationCategory; this.totalCredit = totalCredit; this.takenCredit = takenCredit; } + + public static CompletedCredit from(DetailGraduationResult detailGraduationResults) { + return CompletedCredit.builder() + .graduationCategory(detailGraduationResults.getGraduationCategory()) + .totalCredit(detailGraduationResults.getTotalCredit()) + .takenCredit(detailGraduationResults.getTakenCredit()).build(); + } + + public static CompletedCredit createChapelCompletedCreditModel(ChapelResult chapelResult) { + return CompletedCredit.builder() + .graduationCategory(CHAPEL) + .totalCredit(ChapelResult.GRADUATION_COUNT / 2) + .takenCredit(chapelResult.getTakenChapelCredit()).build(); + } + + public static CompletedCredit createNormalCultureCompletedCreditModel( + NormalCultureGraduationResult normalCultureGraduationResult) { + return CompletedCredit.builder() + .graduationCategory(NORMAL_CULTURE) + .totalCredit(normalCultureGraduationResult.getTotalCredit()) + .takenCredit(normalCultureGraduationResult.getTakenCredit()).build(); + } + + public static CompletedCredit createFreeElectiveCompletedCreditModel( + FreeElectiveGraduationResult freeElectiveGraduationResult) { + return CompletedCredit.builder() + .graduationCategory(FREE_ELECTIVE) + .totalCredit(freeElectiveGraduationResult.getTotalCredit()) + .takenCredit(freeElectiveGraduationResult.getTakenCredit()).build(); + } + + public void updateCredit(int totalCredit, double takenCredit) { + this.totalCredit = totalCredit; + this.takenCredit = takenCredit; + } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java index b1df18f9..8e09162f 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java @@ -20,6 +20,7 @@ public class FindCompletedCreditAdapter implements FindCompletedCreditPort { private final UserMapper userMapper; private final CompletedCreditPersistenceMapper completedCreditPersistenceMapper; private final CompletedCreditRepository completedCreditRepository; + @Override public List findCompletedCredit(User user) { return completedCreditRepository.findAllByUserJpaEntity(userMapper.mapToJpaEntity(user)).stream()