diff --git a/build.gradle b/build.gradle index f2f2ffad..5743937e 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ dependencies { implementation "com.google.guava:guava:32.1.3-jre" implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" implementation "com.querydsl:querydsl-apt:${queryDslVersion}" - //implementation 'org.flywaydb:flyway-core:6.4.2' +// implementation 'org.flywaydb:flyway-core:6.4.2' implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' implementation 'io.sentry:sentry-logback:1.7.30' @@ -56,6 +56,8 @@ dependencies { testImplementation 'org.testcontainers:testcontainers:1.19.0' testImplementation 'org.testcontainers:mysql:1.19.0' testImplementation 'org.testcontainers:junit-jupiter:1.13.0' + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditApiPresentation.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditApiPresentation.java new file mode 100644 index 00000000..28691b65 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditApiPresentation.java @@ -0,0 +1,18 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.api; + +import java.util.List; + +import com.plzgraduate.myongjigraduatebe.completedcredit.api.dto.CompletedCreditResponse; +import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "CompletdCredit") +public interface FindCompletedCreditApiPresentation { + + @Operation(summary = "기이수 학점 조회", description = "유저의 기이수 학점 조회 API") + @Parameter(name = "userId", description = "로그인한 유저의 PK값 - 자동 적용") + List getCompletedCredits(@LoginUser Long userId); +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java new file mode 100644 index 00000000..7531d17f --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsController.java @@ -0,0 +1,29 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.api; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.plzgraduate.myongjigraduatebe.completedcredit.api.dto.CompletedCreditResponse; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.FindCompletedCreditUseCase; +import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; +import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter; + +import lombok.RequiredArgsConstructor; + +@WebAdapter +@RequestMapping(value = "/api/v1/graduations/credits") +@RequiredArgsConstructor +public class FindCompletedCreditsController implements FindCompletedCreditApiPresentation{ + + private final FindCompletedCreditUseCase findCompletedCreditUseCase; + + @GetMapping() + public List getCompletedCredits(@LoginUser Long userId) { + return findCompletedCreditUseCase.findCompletedCredits(userId).stream() + .map(CompletedCreditResponse::from) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/dto/CompletedCreditResponse.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/dto/CompletedCreditResponse.java new file mode 100644 index 00000000..0d898703 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/dto/CompletedCreditResponse.java @@ -0,0 +1,34 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.api.dto; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CompletedCreditResponse { + + private String category; + private int totalCredit; + private double takenCredit; + private boolean completed; + + @Builder + private CompletedCreditResponse(String category, int totalCredit, double takenCredit, boolean completed) { + this.category = category; + this.totalCredit = totalCredit; + this.takenCredit = takenCredit; + this.completed = completed; + } + + public static CompletedCreditResponse from(CompletedCredit completedCredit) { + return CompletedCreditResponse.builder() + .category(completedCredit.getGraduationCategory().name()) + .totalCredit(completedCredit.getTotalCredit()) + .takenCredit(completedCredit.getTakenCredit()) + .completed(completedCredit.getTakenCredit() >= completedCredit.getTotalCredit()) + .build(); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/FindCompletedCreditPort.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/FindCompletedCreditPort.java new file mode 100644 index 00000000..7c0f6ed3 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/FindCompletedCreditPort.java @@ -0,0 +1,11 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.port; + +import java.util.List; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +public interface FindCompletedCreditPort { + + List findCompletedCredit(User user); +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/GenerateOrModifyCompletedCreditPort.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/GenerateOrModifyCompletedCreditPort.java new file mode 100644 index 00000000..f06c785b --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/port/GenerateOrModifyCompletedCreditPort.java @@ -0,0 +1,11 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.port; + +import java.util.List; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +public interface GenerateOrModifyCompletedCreditPort { + + void generateOrModifyCompletedCredits(User user, List completedCredits); +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditService.java new file mode 100644 index 00000000..5ab64627 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditService.java @@ -0,0 +1,29 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; + +import java.util.List; + +import org.springframework.transaction.annotation.Transactional; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.FindCompletedCreditUseCase; +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; +import com.plzgraduate.myongjigraduatebe.user.application.usecase.find.FindUserUseCase; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +@Transactional(readOnly = true) +class FindCompletedCreditService implements FindCompletedCreditUseCase { + + private final FindUserUseCase findUserUseCase; + private final FindCompletedCreditPort findCompletedCreditPort; + + @Override + public List findCompletedCredits(Long userId) { + User user = findUserUseCase.findUserById(userId); + return findCompletedCreditPort.findCompletedCredit(user); + } +} 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 new file mode 100644 index 00000000..bbd7e619 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java @@ -0,0 +1,130 @@ +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; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.transaction.annotation.Transactional; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.GenerateOrModifyCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.GenerateOrModifyCompletedCreditUseCase; +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.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; + +import lombok.RequiredArgsConstructor; + +@UseCase +@Transactional +@RequiredArgsConstructor +class GenerateOrModifyCompletedCreditService implements GenerateOrModifyCompletedCreditUseCase { + + private final FindCompletedCreditPort findCompletedCreditPort; + private final GenerateOrModifyCompletedCreditPort generateOrModifyCompletedCreditPort; + + private final CalculateGraduationUseCase calculateGraduationUseCase; + + @Override + public void generateOrModifyCompletedCredit(User user) { + List completedCredits = findCompletedCreditPort.findCompletedCredit(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())) + .findFirst() + )); + return resultMap.keySet().stream() + .map(detailGraduationResult -> createCompletedCreditModel(detailGraduationResult, + resultMap.get(detailGraduationResult))) + .collect(Collectors.toList()); + } + + private CompletedCredit createCompletedCreditModel(DetailGraduationResult detailGraduationResult, + Optional completedCredit) { + return CompletedCredit.builder() + .id(completedCredit.map(CompletedCredit::getId).orElse(null)) + .totalCredit(detailGraduationResult.getTotalCredit()) + .takenCredit(detailGraduationResult.getTakenCredit()) + .graduationCategory(detailGraduationResult.getGraduationCategory()) + .build(); + } + + private CompletedCredit createOrUpdateChapelCompletedCreditModel(List completedCredits, + GraduationResult graduationResult) { + Optional chapelCompletedCredit = findCompletedCreditByCategory(completedCredits, CHAPEL); + return chapelCompletedCredit.map( + completedCredit -> updateCompletedCredit(completedCredit, GRADUATION_COUNT / 2, + graduationResult.getChapelResult().getTakenChapelCredit())) + .orElseGet(() -> CompletedCredit.createChapelCompletedCreditModel(graduationResult.getChapelResult())); + } + + private CompletedCredit createOrUpdateNormalCultureCompletedCreditModel(List completedCredits, + GraduationResult graduationResult) { + 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 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() == 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/application/usecase/FindCompletedCreditUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/usecase/FindCompletedCreditUseCase.java new file mode 100644 index 00000000..8ad96508 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/usecase/FindCompletedCreditUseCase.java @@ -0,0 +1,11 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase; + +import java.util.List; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; + +public interface FindCompletedCreditUseCase { + + List findCompletedCredits(Long userId); + +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/usecase/GenerateOrModifyCompletedCreditUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/usecase/GenerateOrModifyCompletedCreditUseCase.java new file mode 100644 index 00000000..7fa6905a --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/usecase/GenerateOrModifyCompletedCreditUseCase.java @@ -0,0 +1,8 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase; + +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +public interface GenerateOrModifyCompletedCreditUseCase { + + void generateOrModifyCompletedCredit(User user); +} 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 new file mode 100644 index 00000000..60ccb25a --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/domain/model/CompletedCredit.java @@ -0,0 +1,65 @@ +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; + +@Getter +public class CompletedCredit { + + private final Long id; + private final GraduationCategory graduationCategory; + private int totalCredit; + private double takenCredit; + + @Builder + 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 new file mode 100644 index 00000000..8e09162f --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java @@ -0,0 +1,30 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence; + +import java.util.List; +import java.util.stream.Collectors; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper.CompletedCreditPersistenceMapper; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository.CompletedCreditRepository; +import com.plzgraduate.myongjigraduatebe.core.meta.PersistenceAdapter; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.mapper.UserMapper; + +import lombok.RequiredArgsConstructor; + +@PersistenceAdapter +@RequiredArgsConstructor +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() + .map(completedCreditPersistenceMapper::mapToDomainModel) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapter.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapter.java new file mode 100644 index 00000000..5f15d0da --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapter.java @@ -0,0 +1,31 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence; + +import java.util.List; +import java.util.stream.Collectors; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.GenerateOrModifyCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper.CompletedCreditPersistenceMapper; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository.CompletedCreditRepository; +import com.plzgraduate.myongjigraduatebe.core.meta.PersistenceAdapter; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +import lombok.RequiredArgsConstructor; + +@PersistenceAdapter +@RequiredArgsConstructor +public class GenerateOrModifyCompletedCreditsAdapter implements GenerateOrModifyCompletedCreditPort { + + private final CompletedCreditPersistenceMapper completedCreditPersistenceMapper; + private final CompletedCreditRepository completedCreditRepository; + + @Override + public void generateOrModifyCompletedCredits(User user, List completedCredits) { + List completedCreditJpaEntities = completedCredits.stream() + .map(completedCredit -> completedCreditPersistenceMapper.mapToJpaEntity(user, completedCredit)) + .collect(Collectors.toList()); + + completedCreditRepository.saveAll(completedCreditJpaEntities); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/entity/CompletedCreditJpaEntity.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/entity/CompletedCreditJpaEntity.java new file mode 100644 index 00000000..e7661ba7 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/entity/CompletedCreditJpaEntity.java @@ -0,0 +1,52 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "completed_credit") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CompletedCreditJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserJpaEntity userJpaEntity; + + @Enumerated(value = EnumType.STRING) + private GraduationCategory graduationCategory; + + private int totalCredit; + + private double takenCredit; + + @Builder + private CompletedCreditJpaEntity(Long id, UserJpaEntity userJpaEntity, GraduationCategory graduationCategory, + int totalCredit, double takenCredit) { + this.id = id; + this.userJpaEntity = userJpaEntity; + this.graduationCategory = graduationCategory; + this.totalCredit = totalCredit; + this.takenCredit = takenCredit; + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapper.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapper.java new file mode 100644 index 00000000..97e801d3 --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapper.java @@ -0,0 +1,31 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper; + +import org.springframework.stereotype.Component; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; + +@Component +public class CompletedCreditPersistenceMapper { + + public CompletedCredit mapToDomainModel(CompletedCreditJpaEntity completedCreditJpaEntity) { + return CompletedCredit.builder() + .id(completedCreditJpaEntity.getId()) + .graduationCategory(completedCreditJpaEntity.getGraduationCategory()) + .totalCredit(completedCreditJpaEntity.getTotalCredit()) + .takenCredit(completedCreditJpaEntity.getTakenCredit()).build(); + } + + public CompletedCreditJpaEntity mapToJpaEntity(User user, CompletedCredit completedCredit) { + return CompletedCreditJpaEntity.builder() + .id(completedCredit.getId()) + .graduationCategory(completedCredit.getGraduationCategory()) + .userJpaEntity(UserJpaEntity.builder() + .id(user.getId()) + .build()) + .totalCredit(completedCredit.getTotalCredit()) + .takenCredit(completedCredit.getTakenCredit()).build(); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepository.java b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepository.java new file mode 100644 index 00000000..91b88b2e --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepository.java @@ -0,0 +1,14 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; + +public interface CompletedCreditRepository extends JpaRepository { + + List findAllByUserJpaEntity(UserJpaEntity userJpaEntity); + +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationApiPresentation.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationApiPresentation.java deleted file mode 100644 index 2528ed57..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationApiPresentation.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.api; - -import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.GraduationResponse; - -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "CalculateGraduation", description = "유저의 졸업 결과를 계산하는 API") -public interface CalculateGraduationApiPresentation { - - @Parameter(name = "userId", description = "로그인한 유저의 PK값") - GraduationResponse calculate(@LoginUser Long userId); -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationController.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationController.java deleted file mode 100644 index 2b7d24ce..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.api; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; -import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.GraduationResponse; -import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateGraduationUseCase; - -import lombok.RequiredArgsConstructor; - -@WebAdapter -@RequestMapping("/api/v1/graduation") -@RequiredArgsConstructor -public class CalculateGraduationController implements CalculateGraduationApiPresentation { - - private final CalculateGraduationUseCase calculateGraduationUseCase; - - @GetMapping("/result") - public GraduationResponse calculate(@LoginUser Long userId) { - return calculateGraduationUseCase.calculateGraduation(userId); - } -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/GraduationResponse.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/GraduationResponse.java deleted file mode 100644 index 24d0c2ba..00000000 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/GraduationResponse.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.api.dto.response; - -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; - -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; -import lombok.Getter; - -@Getter -public class GraduationResponse { - - private final BasicInfoResponse basicInfo; - private final ChapelResultResponse chapelResult; - private final DetailGraduationResultResponse commonCulture; - private final DetailGraduationResultResponse coreCulture; - private final DetailGraduationResultResponse basicAcademicalCulture; - private final DetailGraduationResultResponse major; - @Schema(name = "subMajor", nullable = true) - private final DetailGraduationResultResponse subMajor; - //TODO: 복수전공 response 추가 - private final RestResultResponse normalCulture; - private final RestResultResponse freeElective; - @Schema(name = "graduated", example = "false") - private final boolean graduated; - - @Builder - private GraduationResponse(BasicInfoResponse basicInfo, ChapelResultResponse chapelResult, - DetailGraduationResultResponse commonCulture, DetailGraduationResultResponse coreCulture, - DetailGraduationResultResponse basicAcademicalCulture, DetailGraduationResultResponse major, - DetailGraduationResultResponse subMajor, RestResultResponse normalCulture, RestResultResponse freeElective, - boolean graduated) { - this.basicInfo = basicInfo; - this.chapelResult = chapelResult; - this.commonCulture = commonCulture; - this.coreCulture = coreCulture; - this.basicAcademicalCulture = basicAcademicalCulture; - this.major = major; - this.subMajor = subMajor; - this.normalCulture = normalCulture; - this.freeElective = freeElective; - this.graduated = graduated; - } - - public static GraduationResponse of(User user, GraduationResult graduationResult) { - return GraduationResponse.builder() - .basicInfo(BasicInfoResponse.of(user, graduationResult)) - .chapelResult(ChapelResultResponse.from(graduationResult.getChapelResult())) - .commonCulture(findDetailGraduationResultResponse(graduationResult, COMMON_CULTURE)) - .coreCulture(findDetailGraduationResultResponse(graduationResult, CORE_CULTURE)) - .basicAcademicalCulture(findDetailGraduationResultResponse(graduationResult, BASIC_ACADEMICAL_CULTURE)) - .major(findDetailGraduationResultResponse(graduationResult, MAJOR)) - .subMajor(findDetailGraduationResultResponse(graduationResult, SUB_MAJOR)) - .normalCulture( - RestResultResponse.fromNormalCultureResult(graduationResult.getNormalCultureGraduationResult())) - .freeElective(RestResultResponse.fromFreeElectiveResult(graduationResult.getFreeElectiveGraduationResult())) - .graduated(graduationResult.isGraduated()) - .build(); - } - - private static DetailGraduationResultResponse findDetailGraduationResultResponse(GraduationResult graduationResult, - GraduationCategory graduationCategory) { - return graduationResult.getDetailGraduationResults().stream() - .filter(detailGraduationResult -> detailGraduationResult.getCategoryName() - .equals(graduationCategory.getName())) - .map(DetailGraduationResultResponse::from) - .findFirst() - .orElse(null); - } -} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/MajorInfoResponse.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/MajorInfoResponse.java index 556098cd..0514e477 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/MajorInfoResponse.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/api/dto/response/MajorInfoResponse.java @@ -27,9 +27,9 @@ private MajorInfoResponse(String primaryMajor, String doubleMajor, String subMaj public static MajorInfoResponse from(User user) { return MajorInfoResponse.builder() - .primaryMajor(user.getMajor()) - .subMajor(user.getSubMajor()) + .primaryMajor(user.getPrimaryMajor()) .doubleMajor(null) //TODO: 복수전공 추가 + .subMajor(user.getSubMajor()) .build(); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java index a315ce6d..545213d5 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/service/CalculateGraduationService.java @@ -7,9 +7,9 @@ import org.springframework.transaction.annotation.Transactional; import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.GraduationResponse; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateGraduationUseCase; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DefaultGraduationRequirementType; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; @@ -29,11 +29,9 @@ import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCulture; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CoreCulture; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.MajorLecture; -import com.plzgraduate.myongjigraduatebe.takenlecture.application.port.FindTakenLecturePort; +import com.plzgraduate.myongjigraduatebe.takenlecture.application.usecase.find.FindTakenLectureUseCase; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory; -import com.plzgraduate.myongjigraduatebe.user.application.usecase.find.FindUserUseCase; import com.plzgraduate.myongjigraduatebe.user.domain.model.College; -import com.plzgraduate.myongjigraduatebe.user.domain.model.GraduationRequirementType; import com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory; import com.plzgraduate.myongjigraduatebe.user.domain.model.User; @@ -42,36 +40,31 @@ @UseCase @Transactional(readOnly = true) @RequiredArgsConstructor +//TODO: 로직 분리 후 테스트 코드 작성 class CalculateGraduationService implements CalculateGraduationUseCase { - private final FindUserUseCase findUserUseCase; - - private final FindTakenLecturePort findTakenLecturePort; private final FindCommonCulturePort findCommonCulturePort; private final FindCoreCulturePort findCoreCulturePort; private final FindBasicAcademicalCulturePort findBasicAcademicalCulturePort; private final FindMajorPort findMajorPort; + private final FindTakenLectureUseCase findTakenLectureUseCase; @Override - public GraduationResponse calculateGraduation(Long userId) { - User user = findUserUseCase.findUserById(userId); + public GraduationResult calculateGraduation(User user) { GraduationRequirement graduationRequirement = determineGraduationRequirement(user); - TakenLectureInventory takenLectureInventory = TakenLectureInventory.from( - findTakenLecturePort.findTakenLectureSetByUser(user)); + TakenLectureInventory takenLectureInventory = findTakenLectureUseCase.findTakenLectures(user.getId()); ChapelResult chapelResult = generateChapelResult(takenLectureInventory); List detailGraduationResults = generateDetailGraduationResults(user, takenLectureInventory, graduationRequirement); - GraduationResult graduationResult = generateGraduationResult(chapelResult, detailGraduationResults, + return generateGraduationResult(chapelResult, detailGraduationResults, takenLectureInventory, graduationRequirement); - - return GraduationResponse.of(user, graduationResult); } private GraduationRequirement determineGraduationRequirement(User user) { - College userCollage = College.findBelongingCollege(user); - GraduationRequirementType defaultGraduationRequirement = GraduationRequirementType.determineGraduationRequirement( + College userCollage = College.findBelongingCollege(user.getPrimaryMajor()); + DefaultGraduationRequirementType defaultGraduationRequirement = DefaultGraduationRequirementType.determineGraduationRequirement( userCollage, user); return defaultGraduationRequirement.convertToProfitGraduationRequirement(user); } @@ -95,9 +88,9 @@ private List generateDetailGraduationResults(User user, user, takenLectureInventory, graduationRequirement) )); - // TODO: Additional Major check - DetailGraduationResult if (user.getStudentCategory() == StudentCategory.SUB_MAJOR) { - detailGraduationResults.add(generateSubMajorDetailGraduationResult(user, takenLectureInventory)); + detailGraduationResults.add( + generateSubMajorDetailGraduationResult(user, takenLectureInventory, graduationRequirement)); } return detailGraduationResults; @@ -133,7 +126,7 @@ private DetailGraduationResult generteBasicAcademicalDetailGraduationResult(User private GraduationManager determineBasicAcademicalCultureGraduationManager( User user) { GraduationManager basicAcademicalCultureGraduationManager; - switch (College.findBelongingCollege(user)) { + switch (College.findBelongingCollege(user.getPrimaryMajor())) { case BUSINESS: basicAcademicalCultureGraduationManager = new BusinessBasicAcademicalManager(); break; @@ -149,19 +142,18 @@ private GraduationManager determineBasicAcademica private DetailGraduationResult generateMajorDetailGraduationResult(User user, TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { - Set graduationMajorLectures = findMajorPort.findMajor(user.getMajor()); + Set graduationMajorLectures = findMajorPort.findMajor(user.getPrimaryMajor()); GraduationManager majorGraduationManager = new MajorManager(); return majorGraduationManager.createDetailGraduationResult(user, - takenLectureInventory, graduationMajorLectures, graduationRequirement.getMajorCredit()); + takenLectureInventory, graduationMajorLectures, graduationRequirement.getPrimaryMajorCredit()); } private DetailGraduationResult generateSubMajorDetailGraduationResult(User user, - TakenLectureInventory takenLectureInventory) { - int requireSubMajorCredit = 21; + TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) { Set graduationSubMajorLectures = findMajorPort.findMajor(user.getSubMajor()); GraduationManager subMajorManager = new SubMajorManager(); return subMajorManager.createDetailGraduationResult(user, takenLectureInventory, graduationSubMajorLectures, - requireSubMajorCredit); + graduationRequirement.getSubMajorCredit()); } private GraduationResult generateGraduationResult(ChapelResult chapelResult, diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateGraduationUseCase.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateGraduationUseCase.java index 20fb227d..b5b9c8dc 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateGraduationUseCase.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/application/usecase/CalculateGraduationUseCase.java @@ -1,8 +1,9 @@ package com.plzgraduate.myongjigraduatebe.graduation.application.usecase; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.GraduationResponse; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; public interface CalculateGraduationUseCase { - GraduationResponse calculateGraduation(Long userId); + GraduationResult calculateGraduation(User user); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/ChapelResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/ChapelResult.java index ca91f7bb..cc9d9b6d 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/ChapelResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/ChapelResult.java @@ -9,7 +9,7 @@ public class ChapelResult { private static final String CHAPEL_LECTURE_CODE = "KMA02101"; - private static final int GRADUATION_COUNT = 4; + public static final int GRADUATION_COUNT = 4; private final int takenCount; private boolean isCompleted; diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementType.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java similarity index 59% rename from src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementType.java rename to src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java index d060db9c..bab6fc03 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementType.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DefaultGraduationRequirementType.java @@ -1,16 +1,19 @@ -package com.plzgraduate.myongjigraduatebe.user.domain.model; +package com.plzgraduate.myongjigraduatebe.graduation.domain.model; import java.util.Arrays; import java.util.NoSuchElementException; -import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; +import com.plzgraduate.myongjigraduatebe.user.domain.model.College; +import com.plzgraduate.myongjigraduatebe.user.domain.model.EnglishLevel; +import com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor -public enum GraduationRequirementType { +public enum DefaultGraduationRequirementType { // 단과대명|전공학점|공통교양학점|핵심교양학점|학문기초교양학점|일반교양학점|자유선택학점|전체학점|적용시작입학년도|적용마감입학년도 HUMANITIES_16_17("인문대", 63, 15, 12, 12, 10, 16, 128, 16, 17), SOCIAL_SCIENCE_16_17("사회과학대", 63, 15, 12, 12, 10, 16, 128, 16, 17), @@ -34,10 +37,10 @@ public enum GraduationRequirementType { private final int startEntryYear; private final int endEntryYear; - public static GraduationRequirementType determineGraduationRequirement(College college, User user) { - return Arrays.stream(GraduationRequirementType.values()) + public static DefaultGraduationRequirementType determineGraduationRequirement(College college, User user) { + return Arrays.stream(DefaultGraduationRequirementType.values()) .filter(gr -> gr.getCollageName().equals(college.getName())) - .filter(gr -> gr.getStartEntryYear() <= user.getEntryYear()&& gr.getEndEntryYear() >= user.getEntryYear()) + .filter(gr -> gr.getStartEntryYear() <= user.getEntryYear() && gr.getEndEntryYear() >= user.getEntryYear()) .findFirst() .orElseThrow(() -> new NoSuchElementException("일치하는 졸업 요건이 존재하지 않습니다.")); } @@ -45,7 +48,9 @@ public static GraduationRequirementType determineGraduationRequirement(College c public GraduationRequirement convertToProfitGraduationRequirement(User user) { GraduationRequirement graduationRequirement = GraduationRequirement.builder() .totalCredit(this.totalCredit) - .majorCredit(this.majorLectureCredit) + .primaryMajorCredit(this.majorLectureCredit) + .dualMajorCredit(0) + .subMajorCredit(0) .basicAcademicalCredit(this.basicAcademicalLectureCredit) .commonCultureCredit(this.commonCultureCredit) .coreCultureCredit(this.coreCultureCredit) @@ -53,8 +58,7 @@ public GraduationRequirement convertToProfitGraduationRequirement(User user) { .freeElectiveCredit(this.freeElectiveLectureCredit).build(); checkIsEnglishFreeUserAndTransferCredit(user, graduationRequirement); - //TODO: Additional Major에 따른 졸업요건 변화 체크 후 졸업 요건 학점 변화 적용 - checkIsSubMajorUserAndTransferCredit(user, graduationRequirement); + checkIsMultiMajorUserAndTransferCredit(user, graduationRequirement); return graduationRequirement; } @@ -64,9 +68,18 @@ private void checkIsEnglishFreeUserAndTransferCredit(User user, GraduationRequir } } - private void checkIsSubMajorUserAndTransferCredit(User user, GraduationRequirement graduationRequirement) { + private void checkIsMultiMajorUserAndTransferCredit(User user, GraduationRequirement graduationRequirement) { + if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) { + DualMajorGraduationRequirementType originMajorGraduationRequirementType = DualMajorGraduationRequirementType.findBelongingDualMajorGraduationRequirementType( + College.findBelongingCollege(user.getPrimaryMajor()).getName()); + DualMajorGraduationRequirementType dualMajorGraduationRequirementType = DualMajorGraduationRequirementType.findBelongingDualMajorGraduationRequirementType( + College.findBelongingCollege(user.getDualMajor()).getName()); + + graduationRequirement.modifyCreditForDualMajor(originMajorGraduationRequirementType.getOriginMajorCredit(), + dualMajorGraduationRequirementType.getDualMajorCredit()); + } if (user.getStudentCategory() == StudentCategory.SUB_MAJOR) { - graduationRequirement.deleteFreeElectiveCredit(); + graduationRequirement.modifyCreditForSubMajor(); } } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java index 156135db..feb7c323 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailCategoryResult.java @@ -75,7 +75,7 @@ private void addTakenLectures(Set taken) { private void calculateLeftCredit() { int leftCredit = takenCredits - totalCredits; if (leftCredit > 0) { - if (detailCategoryName.equals(MAJOR.getName())) { + if (detailCategoryName.equals(PRIMARY_MAJOR.getName())) { freeElectiveLeftCredit = leftCredit; takenCredits -= leftCredit; return; diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailGraduationResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailGraduationResult.java index 5a0c881a..d42c4bd0 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailGraduationResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DetailGraduationResult.java @@ -8,16 +8,16 @@ @Getter public class DetailGraduationResult { - private final String categoryName; + private final GraduationCategory graduationCategory; private final boolean isCompleted; private final int totalCredit; private double takenCredit; private final List detailCategory; @Builder - private DetailGraduationResult(String categoryName, boolean isCompleted, int totalCredit, int takenCredit, + private DetailGraduationResult(GraduationCategory graduationCategory, boolean isCompleted, int totalCredit, int takenCredit, List detailCategory) { - this.categoryName = categoryName; + this.graduationCategory = graduationCategory; this.isCompleted = isCompleted; this.totalCredit = totalCredit; this.takenCredit = takenCredit; @@ -27,7 +27,7 @@ private DetailGraduationResult(String categoryName, boolean isCompleted, int tot public static DetailGraduationResult create(GraduationCategory graduationCategory, int totalCredit, List detailCategoryResults) { return DetailGraduationResult.builder() - .categoryName(graduationCategory.getName()) + .graduationCategory(graduationCategory) .isCompleted(checkIsCompleted(detailCategoryResults)) .totalCredit(totalCredit) .takenCredit(calculateTakenCredit(detailCategoryResults)) diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java new file mode 100644 index 00000000..7b3f944a --- /dev/null +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/DualMajorGraduationRequirementType.java @@ -0,0 +1,28 @@ +package com.plzgraduate.myongjigraduatebe.graduation.domain.model; + +import java.util.Arrays; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum DualMajorGraduationRequirementType { + + HUMANITIES("인문대", 36, 36), + SOCIAL_SCIENCE("사회과학대", 36, 36), + BUSINESS("경영대", 45, 45), + LAW("법대", 36, 36), + ICT("ICT융합대", 42, 42); + + private final String name; + private final int originMajorCredit; + private final int dualMajorCredit; + + public static DualMajorGraduationRequirementType findBelongingDualMajorGraduationRequirementType(String name) { + return Arrays.stream(DualMajorGraduationRequirementType.values()) + .filter(dualMajorGraduationRequirementType -> dualMajorGraduationRequirementType.getName().equals(name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("소속 단과대가 존재하지 않습니다.")); + } +} diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java index 866ad752..f70f3150 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationCategory.java @@ -13,11 +13,14 @@ public enum GraduationCategory { COMMON_CULTURE("공통교양"), CORE_CULTURE("핵심교양"), - BASIC_ACADEMICAL_CULTURE("학문기초교양"), - MAJOR("전공"), + PRIMARY_MAJOR("주전공"), + DUAL_MAJOR("복수전공"), SUB_MAJOR("부전공"), + PRIMARY_BASIC_ACADEMICAL_CULTURE("주 학문기초교양"), + DUAL_BASIC_ACADEMICAL_CULTURE("복수 학문기초교양"), NORMAL_CULTURE("일반교양"), - FREE_ELECTIVE("자유선택"); + FREE_ELECTIVE("자유선택"), + CHAPEL("채플"); private final String name; diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java index ac248d29..ad752d3f 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirement.java @@ -9,8 +9,9 @@ public class GraduationRequirement { private final int totalCredit; - private final int majorCredit; - private final int subMajorCredit; + private int primaryMajorCredit; + private int dualMajorCredit; + private int subMajorCredit; private final int basicAcademicalCredit; private int commonCultureCredit; private final int coreCultureCredit; @@ -18,10 +19,11 @@ public class GraduationRequirement { private int freeElectiveCredit; @Builder - private GraduationRequirement(int totalCredit, int majorCredit, int subMajorCredit, int basicAcademicalCredit, + private GraduationRequirement(int totalCredit, int primaryMajorCredit, int dualMajorCredit, int subMajorCredit, int basicAcademicalCredit, int commonCultureCredit, int coreCultureCredit, int normalCultureCredit, int freeElectiveCredit) { this.totalCredit = totalCredit; - this.majorCredit = majorCredit; + this.primaryMajorCredit = primaryMajorCredit; + this.dualMajorCredit = dualMajorCredit; this.subMajorCredit = subMajorCredit; this.basicAcademicalCredit = basicAcademicalCredit; this.commonCultureCredit = commonCultureCredit; @@ -35,7 +37,12 @@ public void transferEnglishCreditCommonToNormal() { normalCultureCredit += ENGLISH.getTotalCredit(); } - public void deleteFreeElectiveCredit() { + public void modifyCreditForSubMajor() { + subMajorCredit = 21; freeElectiveCredit = 0; } + + public void modifyCreditForDualMajor(int primaryMajorCredit, int dualMajorCredit) { + //TODO: 복수 전공의 정확한 졸업요건 체크 후 로직 작성 + } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java index 0cb13836..bdf67c56 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResult.java @@ -81,7 +81,7 @@ private void addUpTakenCredit() { private void addUpChapelTakenCreditToCommonCulture() { this.detailGraduationResults.stream() - .filter(detailGraduationResult -> detailGraduationResult.getCategoryName().equals(COMMON_CULTURE.getName())) + .filter(detailGraduationResult -> detailGraduationResult.getGraduationCategory() ==COMMON_CULTURE) .forEach( detailGraduationResult -> detailGraduationResult.addCredit(this.chapelResult.getTakenChapelCredit())); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManager.java index d57bde53..f5eaa56e 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManager.java @@ -1,6 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture; -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.BASIC_ACADEMICAL_CULTURE; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE; import java.util.HashSet; import java.util.List; @@ -54,10 +54,10 @@ public DetailGraduationResult createDetailGraduationResult(User user, takenLectureInventory.handleFinishedTakenLectures(removedTakenLecture); DetailCategoryResult detailCategoryResult = DetailCategoryResult.create( - BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); + PRIMARY_BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); detailCategoryResult.calculate(taken, basicAcademicalLectures); - return DetailGraduationResult.create(BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, + return DetailGraduationResult.create(PRIMARY_BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, List.of(detailCategoryResult)); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManager.java index 8c5070fe..1b0c050d 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManager.java @@ -1,6 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture; -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.BASIC_ACADEMICAL_CULTURE; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE; import java.util.HashSet; import java.util.List; @@ -43,10 +43,10 @@ public DetailGraduationResult createDetailGraduationResult(User user, takenLectureInventory.handleFinishedTakenLectures(removedTakenLecture); DetailCategoryResult detailCategoryResult = DetailCategoryResult.create( - BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); + PRIMARY_BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); detailCategoryResult.calculate(taken, basicAcademicalLectures); - return DetailGraduationResult.create(BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, + return DetailGraduationResult.create(PRIMARY_BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, List.of(detailCategoryResult)); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManager.java index 3ac3b7c2..5b8c8f6e 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManager.java @@ -1,6 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture; -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.BASIC_ACADEMICAL_CULTURE; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE; import java.util.HashSet; import java.util.List; @@ -54,10 +54,10 @@ public DetailGraduationResult createDetailGraduationResult(User user, takenLectureInventory.handleFinishedTakenLectures(removedTakenLecture); DetailCategoryResult detailCategoryResult = DetailCategoryResult.create( - BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); + PRIMARY_BASIC_ACADEMICAL_CULTURE.getName(), true, basicAcademicalCredit); detailCategoryResult.calculate(taken, basicAcademicalLectures); - return DetailGraduationResult.create(BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, + return DetailGraduationResult.create(PRIMARY_BASIC_ACADEMICAL_CULTURE, basicAcademicalCredit, List.of(detailCategoryResult)); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureDetailCategoryManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureDetailCategoryManager.java index c710ba57..76f2928f 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureDetailCategoryManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureDetailCategoryManager.java @@ -61,7 +61,7 @@ private Set categorizeCommonCultures(Set graduationLecture private void calculateFreeElectiveLeftCredit(User user, Set taken, DetailCategoryResult commonCultureDetailCategoryResult) { - if (ICT_DEPARTMENTS.contains(user.getMajor()) && (taken.contains(과학과기술_예외_과목))) { + if (ICT_DEPARTMENTS.contains(user.getPrimaryMajor()) && (taken.contains(과학과기술_예외_과목))) { taken.remove(과학과기술_예외_과목); int exceptionLectureCredit = 3; commonCultureDetailCategoryResult.addFreeElectiveLeftCredit(exceptionLectureCredit); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java index c9f253ad..90060f7d 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/MajorManager.java @@ -1,6 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.major; -import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.MAJOR; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_MAJOR; import java.util.List; import java.util.Set; @@ -50,7 +50,7 @@ public DetailGraduationResult createDetailGraduationResult(User user, DetailCategoryResult electiveDetailCategoryResult = electiveMajorManager.createDetailCategoryResult( takenLectureInventory, electiveLectures, electiveMajorTotalCredit); - return DetailGraduationResult.create(MAJOR, graduationResultTotalCredit, + return DetailGraduationResult.create(PRIMARY_MAJOR, graduationResultTotalCredit, List.of(mandantoryDetailCategoryResult, electiveDetailCategoryResult)); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java index d7b17c68..2b4f0308 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatory.java @@ -50,7 +50,7 @@ public enum OptionalMandatory { public static OptionalMandatory from(User user) { return Arrays.stream(OptionalMandatory.values()) .filter(optionalMandatory -> Objects.equals(optionalMandatory.getDepartment(), - user.getMajor())) + user.getPrimaryMajor())) .findFirst() .orElseThrow(() -> new IllegalArgumentException("해당 전공선택필수를 찾을 수 없습니다.")); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java index 0452c01c..2beb3188 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/OptionalMandatoryHandler.java @@ -22,13 +22,13 @@ public class OptionalMandatoryHandler implements MajorExceptionHandler { private int removedMandatoryTotalCredit = 0; public boolean isSupport(User user) { - if (user.getMajor().equals(MANAGEMENT_INFORMATION) && user.getEntryYear() >= CLASS_OF_19) { + if (user.getPrimaryMajor().equals(MANAGEMENT_INFORMATION) && user.getEntryYear() >= CLASS_OF_19) { return true; } - if (user.getMajor().equals(ADMINISTRATIONS) && user.getEntryYear() >= CLASS_OF_17) { + if (user.getPrimaryMajor().equals(ADMINISTRATIONS) && user.getEntryYear() >= CLASS_OF_17) { return true; } - return List.of(BUSINESS, INTERNATIONAL_TRADE).contains(user.getMajor()); + return List.of(BUSINESS, INTERNATIONAL_TRADE).contains(user.getPrimaryMajor()); } @Override diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java index 12829a83..00c2d1b5 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/major/exception/ReplaceMandatoryMajorHandler.java @@ -23,7 +23,7 @@ public class ReplaceMandatoryMajorHandler implements MajorExceptionHandler { @Override public boolean isSupport(User user) { - return user.getMajor().equals("철학과") && user.getEntryYear() <= 21; + return user.getPrimaryMajor().equals("철학과") && user.getEntryYear() <= 21; } @Override diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java index 1e42da2b..674066e3 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindBasicAcademicalCulturePersistenceAdapter.java @@ -22,7 +22,7 @@ public class FindBasicAcademicalCulturePersistenceAdapter implements FindBasicAc @Override public Set findBasicAcademicalCulture(User user) { - College userCollege = College.findBelongingCollege(user); + College userCollege = College.findBelongingCollege(user.getPrimaryMajor()); return basicAcademicalCultureRepository.findAllByCollege(userCollege.getName()).stream() .map(lectureMapper::mapToBasicAcademicalCultureLectureModel) .collect(Collectors.toSet()); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextService.java index 025ac025..10c83fac 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextService.java @@ -1,14 +1,14 @@ package com.plzgraduate.myongjigraduatebe.parsing.application.service; -import static com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory.CHANGE_MAJOR; -import static com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory.NORMAL; -import static com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory.SUB_MAJOR; +import static com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory.ASSOCIATED_MAJOR; +import static com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory.DOUBLE_SUB; import java.util.List; import java.util.stream.Collectors; import org.springframework.transaction.annotation.Transactional; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.GenerateOrModifyCompletedCreditUseCase; import com.plzgraduate.myongjigraduatebe.core.exception.InvalidPdfException; import com.plzgraduate.myongjigraduatebe.core.exception.PdfParsingException; import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; @@ -37,17 +37,20 @@ class ParsingTextService implements ParsingTextUseCase { private final SaveTakenLectureFromParsingTextUseCase saveTakenLectureFromParsingTextUseCase; private final DeleteTakenLectureByUserUseCase deleteTakenLectureByUserUseCase; + private final GenerateOrModifyCompletedCreditUseCase generateOrModifyCompletedCreditUseCase; + @Override public void enrollParsingText(Long userId, String parsingText) { User user = findUserUseCase.findUserById(userId); try { validateParsingText(parsingText); ParsingInformation parsingInformation = ParsingInformation.parsing(parsingText); - checkIfNormal(parsingInformation); + checkUnSupportedUser(parsingInformation); validateStudentNumber(user, parsingInformation); updateUser(user, parsingInformation); deleteTakenLecturesIfAlreadyEnrolled(user); saveTakenLectures(user, parsingInformation); + generateOrModifyCompletedCreditUseCase.generateOrModifyCompletedCredit(user); } catch (InvalidPdfException | IllegalArgumentException e) { throw e; } catch (Exception e) { @@ -61,16 +64,15 @@ private void deleteTakenLecturesIfAlreadyEnrolled(User user) { private void saveTakenLectures(User user, ParsingInformation parsingInformation) { List parsingTakenLectureDtoList = parsingInformation.getTakenLectureInformation(); - List saveTakenLectureCommand = getSaveTakenLectureCommand(user, - parsingTakenLectureDtoList); + List saveTakenLectureCommand = getSaveTakenLectureCommand(parsingTakenLectureDtoList); saveTakenLectureFromParsingTextUseCase.saveTakenLectures(user, saveTakenLectureCommand); } private void updateUser(User user, ParsingInformation parsingInformation) { UpdateStudentInformationCommand updateStudentInfoCommand = UpdateStudentInformationCommand.of(user, parsingInformation.getStudentName(), parsingInformation.getMajor(), - parsingInformation.getAssociatedMajor(), parsingInformation.getSubMajor(), - parsingInformation.getStudentCategory()); + parsingInformation.getChangeMajor(), parsingInformation.getDualMajor(), + parsingInformation.getSubMajor(), parsingInformation.getStudentCategory()); updateStudentInformationUseCase.updateUser(updateStudentInfoCommand); } @@ -86,7 +88,7 @@ private void validateStudentNumber(User user, ParsingInformation parsingInformat } } - private List getSaveTakenLectureCommand(User user, + private List getSaveTakenLectureCommand( List parsingTakenLectureDtoList) { return parsingTakenLectureDtoList.stream() .map(parsingTakenLectureDto -> @@ -98,12 +100,10 @@ private List getSaveTakenLectureCommand(User user, .collect(Collectors.toList()); } - private void checkIfNormal(ParsingInformation parsingInformation) { - //TODO: 복수전공 파싱 통과 추가 - if (!(parsingInformation.getStudentCategory() == NORMAL - || parsingInformation.getStudentCategory() == CHANGE_MAJOR - || parsingInformation.getStudentCategory() == SUB_MAJOR)) { - throw new IllegalArgumentException("복수전공, 연계전공은 참여가 어렵습니다. 빠른 시일 내에 업데이트하도록 하겠습니다."); + private void checkUnSupportedUser(ParsingInformation parsingInformation) { + if (parsingInformation.getStudentCategory() == ASSOCIATED_MAJOR + || parsingInformation.getStudentCategory() == DOUBLE_SUB) { + throw new IllegalArgumentException("연계전공, 복수+부전공은 참여가 어렵습니다. 빠른 시일 내에 업데이트하도록 하겠습니다."); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformation.java b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformation.java index 11eb6f5e..9e1e138c 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformation.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformation.java @@ -17,17 +17,19 @@ public class ParsingInformation { private final String major; private final String changeMajor; private final String subMajor; + private final String dualMajor; private final String associatedMajor; private final StudentCategory studentCategory; private final List takenLectureInformation; @Builder - public ParsingInformation(String studentName, String studentNumber, String major, String changeMajor, String subMajor, + public ParsingInformation(String studentName, String studentNumber, String major, String changeMajor, String subMajor, String dualMajor, String associatedMajor, StudentCategory studentCategory, List takenLectureInformation) { this.studentName = studentName; this.studentNumber = studentNumber; this.major = major; this.changeMajor = changeMajor; + this.dualMajor = dualMajor; this.subMajor = subMajor; this.associatedMajor = associatedMajor; this.studentCategory = studentCategory; @@ -41,6 +43,7 @@ public static ParsingInformation parsing(String parsingText) { .studentName(parseStudentName(splitText)) .studentNumber(parseStudentNumber(splitText)) .major(parseMajor(splitText)) + .dualMajor(parsingStudentCategoryDto.getDualMajor()) .changeMajor(parsingStudentCategoryDto.getChangeMajor()) .subMajor(parsingStudentCategoryDto.getSubMajor()) .associatedMajor(parsingStudentCategoryDto.getAssociatedMajor()) @@ -72,6 +75,7 @@ private static String parseMajor(String[] splitText) { private static ParsingStudentCategoryDto parseStudentCategory(String[] splitText) { String changeMajor = null; + String dualMajor = null; String subMajor = null; String associatedMajor = null; StudentCategory studentCategory; @@ -94,14 +98,14 @@ private static ParsingStudentCategoryDto parseStudentCategory(String[] splitText subMajor = part.substring("부전공 - ".length()); } else if (part.startsWith("복수전공 - ")) { categories.add("복수전공"); - subMajor = part.substring("복수전공 - ".length()); + dualMajor = part.substring("복수전공 - ".length()); } else if (part.startsWith("연계전공 - ")) { categories.add("연계전공"); associatedMajor = part.substring("연계전공 - ".length()); } } studentCategory = StudentCategory.from(categories); - return ParsingStudentCategoryDto.of(changeMajor, subMajor, associatedMajor, studentCategory); + return ParsingStudentCategoryDto.of(changeMajor, subMajor, dualMajor, associatedMajor, studentCategory); } private static List parseTakenLectureInformation(String[] splitText) { diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingStudentCategoryDto.java b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingStudentCategoryDto.java index b9159364..db086160 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingStudentCategoryDto.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingStudentCategoryDto.java @@ -8,21 +8,26 @@ @Getter class ParsingStudentCategoryDto { private final String changeMajor; + private final String dualMajor; private final String subMajor; private final String associatedMajor; private final StudentCategory studentCategory; @Builder - private ParsingStudentCategoryDto(String changeMajor, String subMajor, String associatedMajor, StudentCategory studentCategory) { + private ParsingStudentCategoryDto(String changeMajor, String dualMajor, String subMajor, String associatedMajor, + StudentCategory studentCategory) { this.changeMajor = changeMajor; + this.dualMajor = dualMajor; this.subMajor = subMajor; this.associatedMajor = associatedMajor; this.studentCategory = studentCategory; } - public static ParsingStudentCategoryDto of(String changeMajor, String subMajor, String associatedMajor, StudentCategory studentCategory) { + public static ParsingStudentCategoryDto of(String changeMajor, String subMajor, String dualMajor, + String associatedMajor, StudentCategory studentCategory) { return ParsingStudentCategoryDto.builder() .changeMajor(changeMajor) + .dualMajor(dualMajor) .subMajor(subMajor) .associatedMajor(associatedMajor) .studentCategory(studentCategory) diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/mapper/ParsingTextHistoryMapper.java b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/mapper/ParsingTextHistoryMapper.java index 0583ee8a..a88846ac 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/mapper/ParsingTextHistoryMapper.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/mapper/ParsingTextHistoryMapper.java @@ -30,7 +30,7 @@ public UserJpaEntity mapToUserJpaEntity(User user) { .englishLevel(user.getEnglishLevel()) .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) - .major(user.getMajor()) + .major(user.getPrimaryMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .createdAt(user.getCreatedAt()) diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/application/service/save/SaveTakenLectureFromParsingTextService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/application/service/save/SaveTakenLectureFromParsingTextService.java index 6ac719aa..b4456c5e 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/application/service/save/SaveTakenLectureFromParsingTextService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/application/service/save/SaveTakenLectureFromParsingTextService.java @@ -36,8 +36,8 @@ public void saveTakenLectures(User user, List takenLect private List makeTakenLectures(User user, List takenLectureInformationList, Map lectureMap) { - return takenLectureInformationList.stream().map( - takenLectureInformation -> { + return takenLectureInformationList.stream() + .map(takenLectureInformation -> { Lecture lecture = getLectureFromLectureMap(lectureMap, takenLectureInformation); return TakenLecture.of(user, lecture, takenLectureInformation.getYear(), takenLectureInformation.getSemester()); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapper.java b/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapper.java index 5ec48452..951274f3 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapper.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapper.java @@ -45,7 +45,7 @@ private User mapToUserDomainEntity(UserJpaEntity user) { .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) .englishLevel(user.getEnglishLevel()) - .major(user.getMajor()) + .primaryMajor(user.getMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .createdAt(user.getCreatedAt()) @@ -63,7 +63,7 @@ public UserJpaEntity mapToUserJpaEntity(User user) { .englishLevel(user.getEnglishLevel()) .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) - .major(user.getMajor()) + .major(user.getPrimaryMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .createdAt(user.getCreatedAt()) diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/dto/response/UserInformationResponse.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/dto/response/UserInformationResponse.java index 38e5717c..e9ad715b 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/dto/response/UserInformationResponse.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/dto/response/UserInformationResponse.java @@ -27,6 +27,6 @@ public static UserInformationResponse from(User user) { return UserInformationResponse.builder() .studentNumber(user.getStudentNumber()) .studentName(user.getName()) - .major(user.getMajor()).build(); + .major(user.getPrimaryMajor()).build(); } } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationService.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationService.java index ad3fa010..45027754 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationService.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationService.java @@ -15,12 +15,14 @@ @RequiredArgsConstructor class UpdateStudentInformationService implements UpdateStudentInformationUseCase { private final UpdateUserPort updateUserPort; + @Override public void updateUser(UpdateStudentInformationCommand updateStudentInformationCommand) { User user = updateStudentInformationCommand.getUser(); user.updateStudentInformation(updateStudentInformationCommand.getName(), updateStudentInformationCommand.getMajor(), updateStudentInformationCommand.getChangeMajor(), + updateStudentInformationCommand.getDualMajor(), updateStudentInformationCommand.getSubMajor(), updateStudentInformationCommand.getStudentCategory() ); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/usecase/update/UpdateStudentInformationCommand.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/usecase/update/UpdateStudentInformationCommand.java index 394ab9cc..15a7463f 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/usecase/update/UpdateStudentInformationCommand.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/application/usecase/update/UpdateStudentInformationCommand.java @@ -18,28 +18,32 @@ public class UpdateStudentInformationCommand { private String changeMajor; + private String dualMajor; + private String subMajor; private StudentCategory studentCategory; @Builder - private UpdateStudentInformationCommand(User user, String name, String major, String changeMajor, + private UpdateStudentInformationCommand(User user, String name, String major, String changeMajor, String dualMajor, String subMajor, StudentCategory studentCategory) { this.user = user; this.name = name; this.major = major; this.changeMajor = changeMajor; + this.dualMajor = dualMajor; this.subMajor = subMajor; this.studentCategory = studentCategory; } - public static UpdateStudentInformationCommand of(User user, String name, String major, String changeMajor, String subMajor, - StudentCategory studentCategory) { + public static UpdateStudentInformationCommand of(User user, String name, String major, String changeMajor, + String dualMajor, String subMajor, StudentCategory studentCategory) { return UpdateStudentInformationCommand.builder() .user(user) .name(name) .major(major) .changeMajor(changeMajor) + .dualMajor(dualMajor) .subMajor(subMajor) .studentCategory(studentCategory) .build(); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/College.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/College.java index b0b86c7d..4d00c680 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/College.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/College.java @@ -20,9 +20,9 @@ public enum College { private final String name; private final List holdingMajors; - public static College findBelongingCollege(User user) { + public static College findBelongingCollege(String major) { return Arrays.stream(College.values()) - .filter(college -> college.getHoldingMajors().contains(user.getMajor())) + .filter(college -> college.getHoldingMajors().contains(major)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("소속 단과대가 존재하지 않습니다.")); } diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/StudentCategory.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/StudentCategory.java index adc3bf6c..11c35874 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/StudentCategory.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/StudentCategory.java @@ -15,7 +15,7 @@ public enum StudentCategory { NORMAL(List.of()), CHANGE_MAJOR(List.of("전과")), SUB_MAJOR(List.of("부전공")), - DOUBLE_MAJOR(List.of("복수전공")), + DUAL_MAJOR(List.of("복수전공")), ASSOCIATED_MAJOR(List.of("연계전공")), DOUBLE_SUB(List.of("복수전공", "부전공")); diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java index 6271384e..4249ea92 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/domain/model/User.java @@ -18,16 +18,17 @@ public class User { private String name; private final String studentNumber; private final int entryYear; - private String major; + private String primaryMajor; private String changeMajor; private String subMajor; + private String dualMajor; private StudentCategory studentCategory; private final Instant createdAt; private Instant updatedAt; @Builder private User(Long id, String authId, String password, EnglishLevel englishLevel, String name, String studentNumber, - int entryYear, String major, String changeMajor, String subMajor, StudentCategory studentCategory, + int entryYear, String primaryMajor, String changeMajor, String subMajor, String dualMajor, StudentCategory studentCategory, Instant createdAt, Instant updatedAt) { this.id = id; this.authId = authId; @@ -36,9 +37,10 @@ private User(Long id, String authId, String password, EnglishLevel englishLevel, this.name = name; this.studentNumber = studentNumber; this.entryYear = entryYear; - this.major = major; + this.primaryMajor = primaryMajor; this.changeMajor = changeMajor; this.subMajor = subMajor; + this.dualMajor = dualMajor; this.studentCategory = studentCategory; this.createdAt = createdAt; this.updatedAt = updatedAt; @@ -56,11 +58,12 @@ public static User create(String authId, String password, EnglishLevel englishLe .build(); } - public void updateStudentInformation(String name, String major, String changeMajor, String subMajor, + public void updateStudentInformation(String name, String major, String changeMajor, String subMajor, String dualMajor, StudentCategory studentCategory) { this.name = name; - this.major = major; + this.primaryMajor = major; this.changeMajor = changeMajor; + this.dualMajor = dualMajor; this.subMajor = subMajor; this.studentCategory = studentCategory; } @@ -70,7 +73,7 @@ public boolean checkBeforeEntryYear(int entryYear) { } public boolean checkMajor(String major) { - return this.major.equals(major); + return this.primaryMajor.equals(major); } public boolean compareStudentNumber(String studentNumber) { diff --git a/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java b/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java index fa498ee0..24f78d39 100644 --- a/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java +++ b/src/main/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapper.java @@ -18,7 +18,7 @@ public User mapToDomainEntity(UserJpaEntity user) { .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) .englishLevel(user.getEnglishLevel()) - .major(user.getMajor()) + .primaryMajor(user.getMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .createdAt(user.getCreatedAt()) @@ -36,7 +36,7 @@ public UserJpaEntity mapToJpaEntity(User user) { .englishLevel(user.getEnglishLevel()) .studentNumber(user.getStudentNumber()) .entryYear(user.getEntryYear()) - .major(user.getMajor()) + .major(user.getPrimaryMajor()) .subMajor(user.getSubMajor()) .studentCategory(user.getStudentCategory()) .createdAt(user.getCreatedAt()) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java new file mode 100644 index 00000000..987f3d9d --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/api/FindCompletedCreditsControllerTest.java @@ -0,0 +1,54 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.api; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.support.WebAdaptorTestSupport; +import com.plzgraduate.myongjigraduatebe.support.WithMockAuthenticationUser; + +class FindCompletedCreditsControllerTest extends WebAdaptorTestSupport { + + @WithMockAuthenticationUser + @DisplayName("유저의 이수 학점을 조회한다.") + @Test + void findCompletedCredits() throws Exception { + //given + List completedCredits = List.of( + CompletedCredit.builder() + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(10) + .takenCredit(10) + .build(), + CompletedCredit.builder() + .graduationCategory(GraduationCategory.CORE_CULTURE) + .totalCredit(10) + .takenCredit(5) + .build()); + given(findCompletedCreditUseCase.findCompletedCredits(1L)).willReturn(completedCredits); + + //when //then + mockMvc.perform(get("/api/v1/graduations/credits")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()").value(completedCredits.size())) + .andExpect(jsonPath("$[0].category").value(GraduationCategory.COMMON_CULTURE.name())) + .andExpect(jsonPath("$[0].totalCredit").value(10)) + .andExpect(jsonPath("$[0].takenCredit").value(10)) + .andExpect(jsonPath("$[0].completed").value(true)) + .andExpect(jsonPath("$[1].category").value(GraduationCategory.CORE_CULTURE.name())) + .andExpect(jsonPath("$[1].totalCredit").value(10)) + .andExpect(jsonPath("$[1].takenCredit").value(5)) + .andExpect(jsonPath("$[1].completed").value(false)); + + } +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditServiceTest.java new file mode 100644 index 00000000..6ca941ee --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/FindCompletedCreditServiceTest.java @@ -0,0 +1,53 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.given; + +import java.math.BigDecimal; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.user.application.usecase.find.FindUserUseCase; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +@ExtendWith(MockitoExtension.class) +class FindCompletedCreditServiceTest { + + @Mock + private FindUserUseCase findUserUseCase; + @Mock + private FindCompletedCreditPort findCompletedCreditPort; + @InjectMocks + private FindCompletedCreditService findCompletedCreditService; + + @DisplayName("유저의 기이수 학점을 조회한다.") + @Test + void findCompletedCredits() { + //given + User user = User.builder() + .id(1L).build(); + given(findUserUseCase.findUserById(1L)).willReturn(user); + given(findCompletedCreditPort.findCompletedCredit(user)).willReturn(List.of( + CompletedCredit.builder().build(), + CompletedCredit.builder().build(), + CompletedCredit.builder().build() + )); + + //when + List result = findCompletedCreditService.findCompletedCredits(1L); + + //then + assertThat(result).hasSize(3); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditServiceTest.java new file mode 100644 index 00000000..87d5f1dc --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditServiceTest.java @@ -0,0 +1,124 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; + +import static org.assertj.core.groups.Tuple.tuple; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; + +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.GenerateOrModifyCompletedCreditPort; +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +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.FreeElectiveGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.NormalCultureGraduationResult; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; + +@ExtendWith(MockitoExtension.class) +class GenerateOrModifyCompletedCreditServiceTest { + + @Mock + private FindCompletedCreditPort findCompletedCreditPort; + @Mock + private GenerateOrModifyCompletedCreditPort generateOrModifyCompletedCreditPort; + @Mock + private CalculateGraduationUseCase calculateGraduationUseCase; + @InjectMocks + private GenerateOrModifyCompletedCreditService generateOrModifyCompletedCreditService; + + @DisplayName("새로운 기이수 학점을 저장한다.") + @Test + void generateOrModifyCompletedCreditPort() { + //given + User user = User.builder() + .id(1L).build(); + given(findCompletedCreditPort.findCompletedCredit(user)).willReturn(List.of()); + + int eachDetailGraduationResultTotalCredit = 10; + int eachDetailGraduationResultTakenCredit = 5; + + List detailGraduationResults = createDetailGraduationResults( + eachDetailGraduationResultTotalCredit, eachDetailGraduationResultTakenCredit); + + GraduationResult graduationResult = GraduationResult.builder() + .detailGraduationResults(detailGraduationResults) + .chapelResult( + ChapelResult.builder() + .takenCount(3) + .build()) + .normalCultureGraduationResult( + NormalCultureGraduationResult.builder() + .totalCredit(eachDetailGraduationResultTotalCredit) + .takenCredit(eachDetailGraduationResultTakenCredit) + .build()) + .freeElectiveGraduationResult( + FreeElectiveGraduationResult.builder() + .totalCredit(eachDetailGraduationResultTotalCredit) + .takenCredit(eachDetailGraduationResultTakenCredit) + .build()) + .build(); + given(calculateGraduationUseCase.calculateGraduation(user)).willReturn(graduationResult); + ArgumentCaptor> completedCreditArgumentCaptor = ArgumentCaptor.forClass(List.class); + ArgumentCaptor userArgumentCaptor = ArgumentCaptor.forClass(User.class); + + //when + generateOrModifyCompletedCreditService.generateOrModifyCompletedCredit(user); + + //then + then(generateOrModifyCompletedCreditPort).should() + .generateOrModifyCompletedCredits(userArgumentCaptor.capture(), completedCreditArgumentCaptor.capture()); + List savedCompletedCredits = completedCreditArgumentCaptor.getValue(); + Assertions.assertThat(savedCompletedCredits).hasSize(detailGraduationResults.size() + 3) + .extracting("graduationCategory", "totalCredit", "takenCredit") + .containsOnly( + tuple(GraduationCategory.COMMON_CULTURE, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit), + tuple(GraduationCategory.CORE_CULTURE, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit), + tuple(GraduationCategory.PRIMARY_MAJOR, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit), + tuple(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit), + tuple(GraduationCategory.CHAPEL, 2, 1.5), + tuple(GraduationCategory.NORMAL_CULTURE, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit), + tuple(GraduationCategory.FREE_ELECTIVE, eachDetailGraduationResultTotalCredit, + (double)eachDetailGraduationResultTakenCredit)); + + } + + private List createDetailGraduationResults(int totalCredit, int takenCredit) { + return List.of(DetailGraduationResult.builder() + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(totalCredit) + .takenCredit(takenCredit).build(), + DetailGraduationResult.builder() + .graduationCategory(GraduationCategory.CORE_CULTURE) + .totalCredit(totalCredit) + .takenCredit(takenCredit) + .build(), + DetailGraduationResult.builder() + .graduationCategory(GraduationCategory.PRIMARY_MAJOR) + .totalCredit(totalCredit) + .takenCredit(takenCredit) + .build(), + DetailGraduationResult.builder() + .graduationCategory(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE) + .totalCredit(totalCredit) + .takenCredit(takenCredit) + .build()); + } +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapterTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapterTest.java new file mode 100644 index 00000000..df52a445 --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/GenerateOrModifyCompletedCreditsAdapterTest.java @@ -0,0 +1,62 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository.CompletedCreditRepository; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.support.PersistenceTestSupport; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.repository.UserRepository; + +class GenerateOrModifyCompletedCreditsAdapterTest extends PersistenceTestSupport { + + @Autowired + private UserRepository userRepository; + @Autowired + private CompletedCreditRepository completedCreditRepository; + @Autowired + private GenerateOrModifyCompletedCreditsAdapter generateOrModifyCompletedCreditsAdapter; + + @DisplayName("이수 학점을 저장 혹은 업데이트한다.") + @Test + void saveOrModifyCompletedCredits() { + //given + UserJpaEntity userJpaEntity = userRepository.save( UserJpaEntity.builder() + .authId("test") + .password("test") + .studentNumber("60191111").build()); + User user = User.builder() + .id(userJpaEntity.getId()) + .build(); + + List completedCredits = List.of(CompletedCredit.builder() + .id(1L) + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(10) + .takenCredit(5).build(), + CompletedCredit.builder() + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(10) + .takenCredit(5).build()); + + //when + generateOrModifyCompletedCreditsAdapter.generateOrModifyCompletedCredits(user, completedCredits); + + //then + List foundCompletedCredits = completedCreditRepository.findAllByUserJpaEntity( + userJpaEntity); + assertThat(foundCompletedCredits).hasSize(completedCredits.size()) + .extracting("userJpaEntity.id") + .contains(user.getId()); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapperTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapperTest.java new file mode 100644 index 00000000..1b47daee --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/mapper/CompletedCreditPersistenceMapperTest.java @@ -0,0 +1,65 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper; + +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.COMMON_CULTURE; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; + +class CompletedCreditPersistenceMapperTest { + + private final CompletedCreditPersistenceMapper completedCreditPersistenceMapper = new CompletedCreditPersistenceMapper(); + + @DisplayName("CompletedCredit jpa entity를 domain model로 매핑한다.") + @Test + void mapToDomainModel() { + //given + CompletedCreditJpaEntity completedCreditJpaEntity = CompletedCreditJpaEntity.builder() + .id(1L) + .userJpaEntity(UserJpaEntity.builder() + .id(1L) + .build()) + .graduationCategory(COMMON_CULTURE) + .totalCredit(10) + .takenCredit(5).build(); + + //when + CompletedCredit completedCredit = completedCreditPersistenceMapper.mapToDomainModel(completedCreditJpaEntity); + + //then + assertThat(completedCredit.getGraduationCategory()).isEqualTo(completedCreditJpaEntity.getGraduationCategory()); + assertThat(completedCredit.getTotalCredit()).isEqualTo(completedCreditJpaEntity.getTotalCredit()); + assertThat(completedCredit.getTakenCredit()).isEqualTo(completedCreditJpaEntity.getTakenCredit()); + } + + @DisplayName("CompletedCredit 도메인 모델을 JpaEntity로 매핑한다.") + @Test + void mapToJpaEntity() { + //given + User user = User.builder() + .id(1L) + .build(); + CompletedCredit completedCredit = CompletedCredit.builder() + .id(1L) + .graduationCategory(COMMON_CULTURE) + .totalCredit(10) + .takenCredit(5).build(); + + //when + CompletedCreditJpaEntity completedCreditJpaEntity = completedCreditPersistenceMapper.mapToJpaEntity(user, + completedCredit); + + //then + assertThat(completedCreditJpaEntity.getId()).isEqualTo(completedCredit.getId()); + assertThat(completedCreditJpaEntity.getUserJpaEntity().getId()).isEqualTo(user.getId()); + assertThat(completedCreditJpaEntity.getGraduationCategory()).isEqualTo(completedCredit.getGraduationCategory()); + assertThat(completedCreditJpaEntity.getTotalCredit()).isEqualTo(completedCredit.getTotalCredit()); + assertThat(completedCreditJpaEntity.getTakenCredit()).isEqualTo(completedCredit.getTakenCredit()); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepositoryTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepositoryTest.java new file mode 100644 index 00000000..1f301ca9 --- /dev/null +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/repository/CompletedCreditRepositoryTest.java @@ -0,0 +1,58 @@ +package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository; + +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; +import com.plzgraduate.myongjigraduatebe.support.PersistenceTestSupport; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; +import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.repository.UserRepository; + +class CompletedCreditRepositoryTest extends PersistenceTestSupport { + + @Autowired + private UserRepository userRepository; + @Autowired + private CompletedCreditRepository completedCreditRepository; + + @DisplayName("유저의 이수 학점을 조회 한다.") + @Test + void findAllByUserJpaEntity() { + //given + UserJpaEntity userJpaEntity = UserJpaEntity.builder() + .authId("test1234") + .password("test") + .studentNumber("60191112").build(); + userRepository.save(userJpaEntity); + + CompletedCreditJpaEntity commonCultureCompletedCreditJpaEntity = CompletedCreditJpaEntity.builder() + .userJpaEntity(userJpaEntity) + .graduationCategory(GraduationCategory.COMMON_CULTURE) + .totalCredit(10) + .takenCredit(10).build(); + + CompletedCreditJpaEntity coreCultureCompletedCreditJpaEntity = CompletedCreditJpaEntity.builder() + .userJpaEntity(userJpaEntity) + .graduationCategory(GraduationCategory.CORE_CULTURE) + .totalCredit(10) + .takenCredit(10).build(); + + completedCreditRepository.saveAll( + List.of(commonCultureCompletedCreditJpaEntity, coreCultureCompletedCreditJpaEntity)); + + //when + List foundCompletedCredits = completedCreditRepository.findAllByUserJpaEntity( + userJpaEntity); + + //then + Assertions.assertThat(foundCompletedCredits).hasSize(2) + .extracting("userJpaEntity.authId") + .contains(userJpaEntity.getAuthId()); + } + +} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/fixture/UserFixture.java b/src/test/java/com/plzgraduate/myongjigraduatebe/fixture/UserFixture.java index 96c1fcfd..5690e82a 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/fixture/UserFixture.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/fixture/UserFixture.java @@ -121,7 +121,7 @@ public static User createUser(String authId, String password, EnglishLevel engli .name(name) .studentNumber(studentNumber) .entryYear(entryYear) - .major(major) + .primaryMajor(major) .subMajor(subMajor) .studentCategory(studentCategory) .build(); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationControllerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationControllerTest.java deleted file mode 100644 index 15b28421..00000000 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/api/CalculateGraduationControllerTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.plzgraduate.myongjigraduatebe.graduation.api; - -import static org.mockito.BDDMockito.given; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.BasicInfoResponse; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.ChapelResultResponse; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.DetailGraduationResultResponse; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.GraduationResponse; -import com.plzgraduate.myongjigraduatebe.graduation.api.dto.response.RestResultResponse; -import com.plzgraduate.myongjigraduatebe.support.WebAdaptorTestSupport; -import com.plzgraduate.myongjigraduatebe.support.WithMockAuthenticationUser; - -class CalculateGraduationControllerTest extends WebAdaptorTestSupport { - - @WithMockAuthenticationUser - @DisplayName("유저의 졸업 결과를 계산한다.") - @Test - void calculate() throws Exception { - ///given - Long userId = 1L; - GraduationResponse response = GraduationResponse.builder() - .basicInfo(BasicInfoResponse.builder().build()) - .chapelResult(ChapelResultResponse.builder().build()) - .commonCulture(DetailGraduationResultResponse.builder().build()) - .coreCulture(DetailGraduationResultResponse.builder().build()) - .basicAcademicalCulture(DetailGraduationResultResponse.builder().build()) - .major(DetailGraduationResultResponse.builder().build()) - .normalCulture(RestResultResponse.builder().build()) - .freeElective(RestResultResponse.builder().build()) - .graduated(true).build(); - given(calculateGraduationUseCase.calculateGraduation(userId)).willReturn(response); - - //when //then - mockMvc.perform( - get("/api/v1/graduation/result") - .with(csrf())) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.basicInfo").exists()) - .andExpect(jsonPath("$.chapelResult").exists()) - .andExpect(jsonPath("$.commonCulture").exists()) - .andExpect(jsonPath("$.coreCulture").exists()) - .andExpect(jsonPath("$.basicAcademicalCulture").exists()) - .andExpect(jsonPath("$.major").exists()) - .andExpect(jsonPath("$.normalCulture").exists()) - .andExpect(jsonPath("$.freeElective").exists()) - .andExpect(jsonPath("$.graduated").isBoolean()); - } -} diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/FreeElectiveGraduationResultTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/FreeElectiveGraduationResultTest.java index 709b13d8..3e28a8c3 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/FreeElectiveGraduationResultTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/FreeElectiveGraduationResultTest.java @@ -40,7 +40,7 @@ void createFreeElectiveGraduationResult() { TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); DetailGraduationResult detailGraduationResult = DetailGraduationResult.builder() - .categoryName(FREE_ELECTIVE.getName()) + .graduationCategory(FREE_ELECTIVE) .detailCategory(List.of( DetailCategoryResult.builder() .detailCategoryName(CHRISTIAN_A.getName()) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java index 0c52436d..cdf1f5c8 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationRequirementTest.java @@ -28,7 +28,7 @@ void transferEnglishCategoryCredit() { .isEqualTo(beforeTransferNormalCultureCredit + ENGLISH.getTotalCredit()); } - @DisplayName("자유선택 졸업 학점을 0점으로 한다.") + @DisplayName("자유선택 졸업 학점을 부전공 졸업학점으로 조정한다.") @Test void deleteFreeElectiveCredit() { //given @@ -36,10 +36,11 @@ void deleteFreeElectiveCredit() { .freeElectiveCredit(10).build(); //when - graduationRequirement.deleteFreeElectiveCredit(); + graduationRequirement.modifyCreditForSubMajor(); //then assertThat(graduationRequirement.getFreeElectiveCredit()).isZero(); + assertThat(graduationRequirement.getSubMajorCredit()).isEqualTo(21); } } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java index 4ce63d99..18e9cfce 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/GraduationResultTest.java @@ -84,7 +84,7 @@ void checkCompletedGraduated() { .isCompleted(true).build(); List detailGraduationResults = List.of(DetailGraduationResult.builder() .isCompleted(true) - .categoryName(COMMON_CULTURE.getName()) + .graduationCategory(COMMON_CULTURE) .totalCredit(detailCategoryTotalCredit) .takenCredit(detailCategoryTakenCredit).build()); NormalCultureGraduationResult normalCultureGraduationResult = NormalCultureGraduationResult.builder() @@ -139,7 +139,7 @@ static Stream graduationResultFields() { ChapelResult.builder().isCompleted(true).build(), List.of(DetailGraduationResult.builder() .isCompleted(true) - .categoryName(COMMON_CULTURE.getName()).build()), + .graduationCategory(COMMON_CULTURE).build()), NormalCultureGraduationResult.builder().isCompleted(true).build(), FreeElectiveGraduationResult.builder().isCompleted(false).build() ), @@ -147,7 +147,7 @@ static Stream graduationResultFields() { ChapelResult.builder().isCompleted(true).build(), List.of(DetailGraduationResult.builder() .isCompleted(true) - .categoryName(COMMON_CULTURE.getName()).build()), + .graduationCategory(COMMON_CULTURE).build()), NormalCultureGraduationResult.builder().isCompleted(false).build(), FreeElectiveGraduationResult.builder().isCompleted(true).build() ), @@ -155,7 +155,7 @@ static Stream graduationResultFields() { ChapelResult.builder().isCompleted(true).build(), List.of(DetailGraduationResult.builder() .isCompleted(false) - .categoryName(COMMON_CULTURE.getName()).build()), + .graduationCategory(COMMON_CULTURE).build()), NormalCultureGraduationResult.builder().isCompleted(true).build(), FreeElectiveGraduationResult.builder().isCompleted(true).build() ), @@ -163,7 +163,7 @@ static Stream graduationResultFields() { ChapelResult.builder().isCompleted(false).build(), List.of(DetailGraduationResult.builder() .isCompleted(true) - .categoryName(COMMON_CULTURE.getName()).build()), + .graduationCategory(COMMON_CULTURE).build()), NormalCultureGraduationResult.builder().isCompleted(true).build(), FreeElectiveGraduationResult.builder().isCompleted(true).build() ) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/NormalCultureGraduationResultTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/NormalCultureGraduationResultTest.java index 12b71acf..d7627193 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/NormalCultureGraduationResultTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/model/NormalCultureGraduationResultTest.java @@ -39,7 +39,7 @@ void createNormalCultureGraduationResult() { TakenLectureInventory takenLectureInventory = TakenLectureInventory.from(takenLectures); DetailGraduationResult detailGraduationResult = DetailGraduationResult.builder() - .categoryName(COMMON_CULTURE.getName()) + .graduationCategory(COMMON_CULTURE) .detailCategory(List.of( DetailCategoryResult.builder() .detailCategoryName(CHRISTIAN_A.getName()) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManagerTest.java index 59f2251e..150aa36e 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/BusinessBasicAcademicalManagerTest.java @@ -1,5 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; import static org.assertj.core.api.Assertions.assertThat; import java.util.HashSet; @@ -54,12 +55,12 @@ class 경영학과_학문기초교양 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", true, 6, 6); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(PRIMARY_BASIC_ACADEMICAL_CULTURE, true, 6, 6); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", true, 6, 6); + .contains("주 학문기초교양", true, 6, 6); assertThat(detailCategoryResult.getTakenLectures()).hasSize(2); assertThat(detailCategoryResult.getHaveToLectures()).isEmpty(); @@ -87,12 +88,12 @@ class 경영학과_학문기초교양 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", false, 6, 3.0); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(PRIMARY_BASIC_ACADEMICAL_CULTURE, false, 6, 3.0); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", false, 6, 3); + .contains("주 학문기초교양", false, 6, 3); assertThat(detailCategoryResult.getTakenLectures()).hasSize(1); assertThat(detailCategoryResult.getHaveToLectures()).hasSize(1); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManagerTest.java index 8d8ae6d9..451d22de 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/DefaultBasicAcademicalManagerTest.java @@ -15,6 +15,7 @@ import com.plzgraduate.myongjigraduatebe.fixture.UserFixture; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.Semester; @@ -32,7 +33,7 @@ class 인문대_학문기초교양 { Map mockLectureMap = LectureFixture.getMockLectureMap(); Set basicAcademicalLectures = BasicAcademicalLectureFixture.인문대_학문기초교양(); - @DisplayName("학문기초교양을 추가해서 들어도 12학점을 초과하지 않으며 통과한다.") + @DisplayName("학문기초교양을 추가해서 들어도 12학점을 초과하지 않으면 통과한다.") @Test void 영문학과_12학점_이상() { //given @@ -54,12 +55,12 @@ class 인문대_학문기초교양 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", true, 12, 12); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE, true, 12, 12); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", true, 12, 12); + .contains("주 학문기초교양", true, 12, 12); assertThat(detailCategoryResult.getTakenLectures()).hasSize(5); assertThat(detailCategoryResult.getHaveToLectures()).isEmpty(); @@ -85,12 +86,12 @@ class 인문대_학문기초교양 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", false, 12, 9.0); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE, false, 12, 9.0); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", false, 12, 9); + .contains("주 학문기초교양", false, 12, 9); assertThat(detailCategoryResult.getTakenLectures()).hasSize(3); assertThat(detailCategoryResult.getHaveToLectures()).hasSize(10); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManagerTest.java index 18fe4b5b..e2a69378 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/basicacademicalculture/SocialScienceBasicAcademicManagerTest.java @@ -15,6 +15,7 @@ import com.plzgraduate.myongjigraduatebe.fixture.UserFixture; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailCategoryResult; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.Semester; @@ -53,12 +54,12 @@ class 이십삼년도_이후_교과목_포함 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", true, 12, 12); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE, true, 12, 12); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", true, 12, 12); + .contains("주 학문기초교양", true, 12, 12); assertThat(detailCategoryResult.getTakenLectures()).hasSize(4); assertThat(detailCategoryResult.getHaveToLectures()).isEmpty(); @@ -85,12 +86,12 @@ class 이십삼년도_이후_교과목_포함 { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains("학문기초교양", false, 12, 6.0); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE, 12, 6.0); assertThat(detailCategoryResult) .extracting("detailCategoryName", "isCompleted", "totalCredits", "takenCredits") - .contains("학문기초교양", false, 12, 6); + .contains("주 학문기초교양", false, 12, 6); assertThat(detailCategoryResult.getTakenLectures()).hasSize(2); assertThat(detailCategoryResult.getHaveToLectures()).hasSize(17); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/commonculture/CommonCultureGraduationManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/commonculture/CommonCultureGraduationManagerTest.java index 30c52c8a..f1e93f58 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/commonculture/CommonCultureGraduationManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/commonculture/CommonCultureGraduationManagerTest.java @@ -1,6 +1,7 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.commonculture; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; import static org.assertj.core.api.Assertions.*; import java.util.HashSet; @@ -14,6 +15,7 @@ import com.plzgraduate.myongjigraduatebe.fixture.CommonCultureFixture; import com.plzgraduate.myongjigraduatebe.fixture.LectureFixture; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCulture; import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture; @@ -56,8 +58,8 @@ void generateCompletedDetailGraduationResult(User user, Set gradu //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted") - .contains("공통교양", true); + .extracting("graduationCategory", "isCompleted") + .contains(COMMON_CULTURE, true); } @DisplayName("모든 공통교양 세부 카테고리가 이수 완료가 아닐 경우 이수 미 완료 공통교양 전체 졸업 결과를 생성한다.") @@ -78,8 +80,8 @@ void generateUnCompletedDetailGraduationResult(User user, Set gra //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted") - .contains("공통교양", false); + .extracting("graduationCategory", "isCompleted") + .contains(COMMON_CULTURE, false); } } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureGraduationManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureGraduationManagerTest.java index 6c6f5b08..bd8e3df8 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureGraduationManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/coreculture/CoreCultureGraduationManagerTest.java @@ -1,5 +1,6 @@ package com.plzgraduate.myongjigraduatebe.graduation.domain.service.coreculture; +import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.CORE_CULTURE; import static org.assertj.core.api.Assertions.assertThat; import java.util.HashSet; @@ -67,8 +68,8 @@ void generateCompletedDetailGraduationResult() { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted") - .contains("핵심교양", true); + .extracting("graduationCategory", "isCompleted") + .contains(CORE_CULTURE, true); } @DisplayName("모든 핵심교양 세부 카테고리가 이수 완료가 아닐 경우 이수 미 완료 핵심교양 전체 졸업 결과를 생성한다.") @@ -98,8 +99,8 @@ void generateUnCompletedDetailGraduationResult() { //then assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted") - .contains("핵심교양", false); + .extracting("graduationCategory", "isCompleted") + .contains(CORE_CULTURE, false); } } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/submajor/SubMajorManagerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/submajor/SubMajorManagerTest.java index a0a95452..f660182b 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/submajor/SubMajorManagerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/graduation/domain/service/submajor/SubMajorManagerTest.java @@ -54,8 +54,8 @@ void createDetailGraduationResult() { .contains( tuple("전공선택", true, true, subMajorGraduationCredit, majorCredit * takenLecturesCount)); assertThat(detailGraduationResult) - .extracting("categoryName", "isCompleted", "totalCredit", "takenCredit") - .contains(SUB_MAJOR.getName(), true, subMajorGraduationCredit, (double)majorCredit * takenLecturesCount); + .extracting("graduationCategory", "isCompleted", "totalCredit", "takenCredit") + .contains(SUB_MAJOR, true, subMajorGraduationCredit, (double)majorCredit * takenLecturesCount); } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindMajorPersistenceAdapterTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindMajorPersistenceAdapterTest.java index c9a2ac44..3484aa44 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindMajorPersistenceAdapterTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/lecture/infrastructure/adapter/persistence/FindMajorPersistenceAdapterTest.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import com.plzgraduate.myongjigraduatebe.fixture.UserFixture; -import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.FindMajorPersistenceAdapter; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.entity.LectureJpaEntity; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.entity.MajorLectureJpaEntity; import com.plzgraduate.myongjigraduatebe.lecture.infrastructure.adapter.persistence.repository.LectureRepository; @@ -43,7 +42,7 @@ void findMajor() { MajorLectureJpaEntity majorLectureJpaEntityA = MajorLectureJpaEntity.builder() .lectureJpaEntity(lectureJpaEntityA) - .major(user.getMajor()).build(); + .major(user.getPrimaryMajor()).build(); MajorLectureJpaEntity majorLectureJpaEntityB = MajorLectureJpaEntity.builder() .lectureJpaEntity(lectureJpaEntityA) @@ -51,12 +50,12 @@ void findMajor() { majorLectureRepository.saveAll(List.of(majorLectureJpaEntityA, majorLectureJpaEntityB)); //when - Set majors = majorPersistenceAdapter.findMajor(user.getMajor()); + Set majors = majorPersistenceAdapter.findMajor(user.getPrimaryMajor()); //then assertThat(majors).hasSize(1) .extracting("major") - .contains(user.getMajor()); + .contains(user.getPrimaryMajor()); } } diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextHistoryServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextHistoryServiceTest.java index 6e50b594..63495dfd 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextHistoryServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextHistoryServiceTest.java @@ -78,7 +78,7 @@ private User createUser(Long id, String authId, String password, EnglishLevel en .studentNumber(studentNumber) .entryYear(entryYear) .englishLevel(englishLevel) - .major(major) + .primaryMajor(major) .subMajor(subMajor) .studentCategory(studentCategory) .build(); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextServiceTest.java index d51083a6..293ca9bc 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/application/service/ParsingTextServiceTest.java @@ -14,6 +14,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.GenerateOrModifyCompletedCreditUseCase; import com.plzgraduate.myongjigraduatebe.core.exception.InvalidPdfException; import com.plzgraduate.myongjigraduatebe.core.exception.PdfParsingException; import com.plzgraduate.myongjigraduatebe.takenlecture.application.usecase.delete.DeleteTakenLectureByUserUseCase; @@ -35,6 +36,8 @@ class ParsingTextServiceTest{ private SaveTakenLectureFromParsingTextUseCase saveTakenLectureFromParsingTextUseCase; @Mock private DeleteTakenLectureByUserUseCase deleteTakenLectureByUserUseCase; + @Mock + private GenerateOrModifyCompletedCreditUseCase generateOrModifyCompletedCreditUseCase; @InjectMocks private ParsingTextService parsingTextService; @@ -61,6 +64,7 @@ class ParsingTextServiceTest{ then(updateStudentInformationUseCase).should().updateUser(any(UpdateStudentInformationCommand.class)); then(deleteTakenLectureByUserUseCase).should().deleteAllTakenLecturesByUser(any(User.class)); then(saveTakenLectureFromParsingTextUseCase).should().saveTakenLectures(any(User.class), any()); + then(generateOrModifyCompletedCreditUseCase).should().generateOrModifyCompletedCredit(any(User.class)); } @DisplayName("PDF 파싱 텍스트가 빈 문자열로 오면 InvalidPdfException을 반환한다.") @@ -162,7 +166,7 @@ private User createUser(String studentNumber) { .studentNumber(studentNumber) .entryYear(18) .englishLevel(EnglishLevel.ENG12) - .major("융합소프트웨어학부") + .primaryMajor("융합소프트웨어학부") .subMajor(null) .studentCategory(StudentCategory.NORMAL) .build(); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformationTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformationTest.java index 09d27f12..8e3d6a39 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformationTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/domain/ParsingInformationTest.java @@ -31,9 +31,9 @@ void createParsingInformation() { .contains("이아현", "60191000", "경영학과", null, null, StudentCategory.NORMAL); } - @DisplayName("복수전공을 할 경우 StudentCategory는 DOUBLE MAJOR이다.") + @DisplayName("복수전공을 할 경우 StudentCategory는 DUAL MAJOR이다.") @Test - void test() { + void 복수전공생_확인() { //given String parsingText = "출력일자 : 2022/11/14|1/1" + "|사회과학대학 정치외교학과, 복수전공 - 경제학과, 이인구(60161000), 현학적 - 재학, 이수 - 7, 입학 - 신입학(2015/03/02)" @@ -47,9 +47,8 @@ void test() { ParsingInformation parsingInformation = ParsingInformation.parsing(parsingText); //then assertThat(parsingInformation) - .extracting("studentName", "studentNumber", "major", "subMajor", "associatedMajor", "studentCategory") - .contains("이인구", "60161000", "정치외교학과", "경제학과", null, StudentCategory.DOUBLE_MAJOR); - + .extracting("studentName", "studentNumber", "major", "dualMajor", "associatedMajor", "studentCategory") + .contains("이인구", "60161000", "정치외교학과", "경제학과", null, StudentCategory.DUAL_MAJOR); } @DisplayName("전과을 할 경우 StudentCategory는 CHANGE_MAJOR이다.") diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/ParsingTextHistoryAdapterTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/ParsingTextHistoryAdapterTest.java index cb447e33..e668d1df 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/ParsingTextHistoryAdapterTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/parsing/infrastructure/adapter/persistence/ParsingTextHistoryAdapterTest.java @@ -4,20 +4,18 @@ import java.util.Optional; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.plzgraduate.myongjigraduatebe.parsing.infrastructure.adapter.persistence.ParsingTextHistoryAdapter; -import com.plzgraduate.myongjigraduatebe.parsing.infrastructure.adapter.persistence.entity.ParsingTextHistoryJpaEntity; -import com.plzgraduate.myongjigraduatebe.parsing.infrastructure.adapter.persistence.repository.ParsingTextRepository; import com.plzgraduate.myongjigraduatebe.parsing.domain.ParsingResult; import com.plzgraduate.myongjigraduatebe.parsing.domain.ParsingTextHistory; +import com.plzgraduate.myongjigraduatebe.parsing.infrastructure.adapter.persistence.entity.ParsingTextHistoryJpaEntity; +import com.plzgraduate.myongjigraduatebe.parsing.infrastructure.adapter.persistence.repository.ParsingTextRepository; import com.plzgraduate.myongjigraduatebe.support.PersistenceTestSupport; +import com.plzgraduate.myongjigraduatebe.user.domain.model.User; import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.entity.UserJpaEntity; import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.repository.UserRepository; -import com.plzgraduate.myongjigraduatebe.user.domain.model.User; class ParsingTextHistoryAdapterTest extends PersistenceTestSupport { @@ -30,34 +28,24 @@ class ParsingTextHistoryAdapterTest extends PersistenceTestSupport { @Autowired private UserRepository userRepository; - @AfterEach - void afterEach() { - this.entityManager - .createNativeQuery("ALTER TABLE parsing_text_history AUTO_INCREMENT = 1") - .executeUpdate(); - } - @DisplayName("ParsingTextHistory를 저장한다.") @Test void saveParsingTextHistory() { //given + UserJpaEntity userJpaEntity = userRepository.save(UserJpaEntity.builder() + .authId("authId") + .password("password!") + .studentNumber("60181666") + .build()); User user = User.builder() - .id(1L) + .id(userJpaEntity.getId()) .build(); - ParsingTextHistory parsingTextHistory = ParsingTextHistory.builder() .user(user) .parsingText("text") .parsingResult(ParsingResult.SUCCESS) .build(); - userRepository.save(UserJpaEntity.builder() - .id(1L) - .authId("authId") - .password("password!") - .studentNumber("60181666") - .build()); - //when parsingTextHistoryAdapter.saveParsingTextHistory(parsingTextHistory); @@ -74,8 +62,13 @@ void saveParsingTextHistory() { @Test void deleteUserParsingTextHistory() { //given + UserJpaEntity userJpaEntity = userRepository.save(UserJpaEntity.builder() + .studentNumber("test") + .authId("test") + .password("test") + .build()); User user = User.builder() - .id(1L) + .id(userJpaEntity.getId()) .authId("test") .password("test") .studentNumber("test") @@ -85,12 +78,6 @@ void deleteUserParsingTextHistory() { .parsingText("text") .parsingResult(ParsingResult.SUCCESS) .build(); - userRepository.save(UserJpaEntity.builder() - .id(1L) - .studentNumber("test") - .authId("test") - .password("test") - .build()); parsingTextHistoryAdapter.saveParsingTextHistory(parsingTextHistory); //when diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/support/WebAdaptorTestSupport.java b/src/test/java/com/plzgraduate/myongjigraduatebe/support/WebAdaptorTestSupport.java index 9d4207db..66ba82b3 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/support/WebAdaptorTestSupport.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/support/WebAdaptorTestSupport.java @@ -12,16 +12,18 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; + import com.fasterxml.jackson.databind.ObjectMapper; import com.plzgraduate.myongjigraduatebe.auth.api.signin.SignInController; import com.plzgraduate.myongjigraduatebe.auth.api.token.TokenController; import com.plzgraduate.myongjigraduatebe.auth.application.usecase.signin.SignInUseCase; import com.plzgraduate.myongjigraduatebe.auth.application.usecase.token.TokenUseCase; import com.plzgraduate.myongjigraduatebe.auth.security.TokenProvider; +import com.plzgraduate.myongjigraduatebe.completedcredit.api.FindCompletedCreditsController; +import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.FindCompletedCreditUseCase; import com.plzgraduate.myongjigraduatebe.core.config.JpaAuditingConfig; import com.plzgraduate.myongjigraduatebe.core.config.QuerydslConfig; import com.plzgraduate.myongjigraduatebe.core.config.SecurityConfig; -import com.plzgraduate.myongjigraduatebe.graduation.api.CalculateGraduationController; import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateGraduationUseCase; import com.plzgraduate.myongjigraduatebe.lecture.api.SearchLectureController; import com.plzgraduate.myongjigraduatebe.lecture.application.usecase.SearchLectureUseCase; @@ -56,7 +58,6 @@ @WebMvcTest(controllers = { SignInController.class, TokenController.class, - CalculateGraduationController.class, SearchLectureController.class, FindUserInformationController.class, UpdateTakenLectureController.class, @@ -65,7 +66,8 @@ FindTakenLectureController.class, ResetPasswordController.class, SignUpController.class, - FindAuthIdController.class + FindAuthIdController.class, + FindCompletedCreditsController.class }) public abstract class WebAdaptorTestSupport { @@ -129,6 +131,9 @@ public abstract class WebAdaptorTestSupport { @MockBean protected CheckStudentNumberDuplicationUseCase checkStudentNumberDuplicationUseCase; + @MockBean + protected FindCompletedCreditUseCase findCompletedCreditUseCase; + @BeforeEach void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(context) diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapperTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapperTest.java index 6d4ea28c..e3aa00b7 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapperTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/takenlecture/infrastructure/adapter/persistence/mapper/TakenLectureMapperTest.java @@ -109,7 +109,7 @@ private User createUser(Long id, String authId, String password, EnglishLevel en .studentNumber(studentNumber) .entryYear(entryYear) .englishLevel(englishLevel) - .major(major) + .primaryMajor(major) .subMajor(subMajor) .studentCategory(studentCategory) .build(); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/FindUserInformationControllerTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/FindUserInformationControllerTest.java index bf76b2d9..d17f8b24 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/FindUserInformationControllerTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/api/finduserinformation/FindUserInformationControllerTest.java @@ -29,7 +29,7 @@ void getUserInformation() throws Exception { .id(userId) .studentNumber(studentNumber) .name(studentName) - .major(major).build(); + .primaryMajor(major).build(); given(findUserInformationUseCase.findUserInformation(userId)).willReturn(user); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/find/FindUserInformationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/find/FindUserInformationServiceTest.java index 09549ebb..c17e998a 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/find/FindUserInformationServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/find/FindUserInformationServiceTest.java @@ -35,7 +35,7 @@ void findUserInformation() { .id(userId) .name(studentName) .studentNumber(studentNumber) - .major(major).build(); + .primaryMajor(major).build(); given(findUserUseCase.findUserById(userId)).willReturn(foundUser); diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationServiceTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationServiceTest.java index 275e247b..90f2dd7a 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationServiceTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/application/service/update/UpdateStudentInformationServiceTest.java @@ -22,7 +22,7 @@ class UpdateStudentInformationServiceTest { @InjectMocks private UpdateStudentInformationService updateStudentInformationService; - @DisplayName("User의 하생정보를 수정한다.") + @DisplayName("User의 학생정보를 수정한다.") @Test void updateUser() { //given @@ -34,7 +34,7 @@ void updateUser() { .major("응용소프트웨어학과") .changeMajor(null) .subMajor("경영학과") - .studentCategory(StudentCategory.DOUBLE_MAJOR) + .studentCategory(StudentCategory.DUAL_MAJOR) .build(); //then diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementTypeTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/DefaultGraduationRequirementTypeTest.java similarity index 70% rename from src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementTypeTest.java rename to src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/DefaultGraduationRequirementTypeTest.java index 6c2c4eeb..b9c9ea6c 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/GraduationRequirementTypeTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/DefaultGraduationRequirementTypeTest.java @@ -11,9 +11,10 @@ import org.junit.jupiter.params.provider.ValueSource; import com.plzgraduate.myongjigraduatebe.fixture.UserFixture; +import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DefaultGraduationRequirementType; import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement; -class GraduationRequirementTypeTest { +class DefaultGraduationRequirementTypeTest { @DisplayName("학생의 소속 단과대와 입학년도로 기본졸업요건을 결정한다.") @ParameterizedTest() @@ -25,7 +26,7 @@ void determineGraduationRequirement(int entryYear) { .entryYear(entryYear).build(); //when - GraduationRequirementType graduationRequirement = GraduationRequirementType.determineGraduationRequirement(ict, + DefaultGraduationRequirementType graduationRequirement = DefaultGraduationRequirementType.determineGraduationRequirement(ict, user); //then @@ -44,7 +45,7 @@ void determineGraduationRequirementWithIllegalUser(int entryYear) { .entryYear(entryYear).build(); //when //then - assertThatThrownBy(() -> GraduationRequirementType.determineGraduationRequirement(ict, user)) + assertThatThrownBy(() -> DefaultGraduationRequirementType.determineGraduationRequirement(ict, user)) .isInstanceOf(NoSuchElementException.class) .hasMessage("일치하는 졸업 요건이 존재하지 않습니다."); } @@ -55,18 +56,18 @@ void convertToProfitGraduationRequirementWithFreeEnglishUser() { //given User freeEnglishUser = UserFixture.경영학과_19학번_영어_면제(); College ict = College.ICT; - GraduationRequirementType graduationRequirementType = GraduationRequirementType.determineGraduationRequirement( + DefaultGraduationRequirementType defaultGraduationRequirementType = DefaultGraduationRequirementType.determineGraduationRequirement( ict, freeEnglishUser); //when - GraduationRequirement graduationRequirement = graduationRequirementType.convertToProfitGraduationRequirement( + GraduationRequirement graduationRequirement = defaultGraduationRequirementType.convertToProfitGraduationRequirement( freeEnglishUser); // then assertThat(graduationRequirement.getCommonCultureCredit()).isEqualTo( - graduationRequirementType.getCommonCultureCredit() - ENGLISH.getTotalCredit()); + defaultGraduationRequirementType.getCommonCultureCredit() - ENGLISH.getTotalCredit()); assertThat(graduationRequirement.getNormalCultureCredit()).isEqualTo( - graduationRequirementType.getNormalLectureCredit() + ENGLISH.getTotalCredit()); + defaultGraduationRequirementType.getNormalLectureCredit() + ENGLISH.getTotalCredit()); } @DisplayName("부전공 학생의 졸업요건을 결정한다.") @@ -75,11 +76,11 @@ void convertToProfitGraduationRequirementWithSubMajorUser() { //given User subMajorUser = UserFixture.경영학과_23학번_국제통상학과_부전공(); College ict = College.BUSINESS; - GraduationRequirementType graduationRequirementType = GraduationRequirementType.determineGraduationRequirement( + DefaultGraduationRequirementType defaultGraduationRequirementType = DefaultGraduationRequirementType.determineGraduationRequirement( ict, subMajorUser); //when - GraduationRequirement graduationRequirement = graduationRequirementType.convertToProfitGraduationRequirement( + GraduationRequirement graduationRequirement = defaultGraduationRequirementType.convertToProfitGraduationRequirement( subMajorUser); // then diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/UserTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/UserTest.java index e306bff6..fa9ba65f 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/UserTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/domain/model/UserTest.java @@ -27,7 +27,7 @@ void setUp() { .studentNumber("60201000") .entryYear(20) .englishLevel(EnglishLevel.ENG12) - .major("경영학과") + .primaryMajor("경영학과") .studentCategory(StudentCategory.NORMAL) .build(); } @@ -48,11 +48,11 @@ void create() { @Test void updateStudentInformation() { //given //when - user.updateStudentInformation("테스터2", "경영학과", "데이터테크놀로지학과", null, StudentCategory.CHANGE_MAJOR); + user.updateStudentInformation("테스터2", "경영학과", "데이터테크놀로지학과", null, null, StudentCategory.CHANGE_MAJOR); //then assertThat(user) - .extracting("name", "major", "changeMajor", "subMajor", "studentCategory") - .contains("테스터2", "경영학과", "데이터테크놀로지학과", null, StudentCategory.CHANGE_MAJOR); + .extracting("name", "primaryMajor", "changeMajor", "subMajor", "dualMajor","studentCategory") + .contains("테스터2", "경영학과", "데이터테크놀로지학과", null, null, StudentCategory.CHANGE_MAJOR); } @DisplayName("checkBeforeEntryYear 메서드 테스트") diff --git a/src/test/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapperTest.java b/src/test/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapperTest.java index 26f0e6ce..48c4f9e1 100644 --- a/src/test/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapperTest.java +++ b/src/test/java/com/plzgraduate/myongjigraduatebe/user/infrastructure/adapter/persistence/mapper/UserMapperTest.java @@ -31,7 +31,7 @@ void mapToDomainEntityTest() { //then assertThat(user) .extracting("id", "authId", "password", "englishLevel", "name", - "studentNumber", "entryYear", "major", "subMajor", "studentCategory") + "studentNumber", "entryYear", "primaryMajor", "subMajor", "studentCategory") .contains(1L, "mju1000", "mju1000!", EnglishLevel.ENG12, "김명지", "60211111", 21, "경영", null, StudentCategory.NORMAL); } @@ -64,7 +64,7 @@ private User createUser(String authId, String password, EnglishLevel englishLeve .studentNumber(studentNumber) .entryYear(entryYear) .englishLevel(englishLevel) - .major(major) + .primaryMajor(major) .subMajor(subMajor) .studentCategory(studentCategory) .build();