Skip to content

Commit

Permalink
feat: [DEV-29] CalculateDetailGraduationUseCaseResolver 구현 (#252)
Browse files Browse the repository at this point in the history
* feat: CalculateDetailGraduationUseCases 구현

* feat: CalculateDetailGraduationUseCaseResolver 구현

* test: SingleCalculateDetailGraduationUseCaseResolverTest 테스트 오류 수정

* refactor: SingleCalculateDetailGraduationUseCaseResolver 의존성 주입 수정
  • Loading branch information
5uhwann authored Apr 24, 2024
1 parent 834c517 commit e495969
Show file tree
Hide file tree
Showing 18 changed files with 308 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.plzgraduate.myongjigraduatebe.graduation.api;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;

public interface CalculateDetailGraduationUseCaseResolver {

CalculateDetailGraduationUseCase resolveCalculateDetailGraduationUseCase(GraduationCategory graduationCategory);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.plzgraduate.myongjigraduatebe.graduation.api;

import java.util.List;

import org.springframework.stereotype.Component;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;

import lombok.RequiredArgsConstructor;

@Component()
@RequiredArgsConstructor
public class SingleCalculateDetailGraduationUseCaseResolver implements CalculateDetailGraduationUseCaseResolver {

private final List<CalculateDetailGraduationUseCase> calculateDetailGraduationUseCases;

@Override
public CalculateDetailGraduationUseCase resolveCalculateDetailGraduationUseCase(
GraduationCategory graduationCategory) {
return calculateDetailGraduationUseCases.stream()
.filter(calculateDetailGraduationUseCase -> calculateDetailGraduationUseCase.supports(graduationCategory))
.findFirst()
.orElseThrow(() -> new RuntimeException("No calculate detail graduation case found"));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.COMMON_CULTURE;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCommonCultureGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculateCommonCultureGraduationService implements CalculateCommonCultureGraduationUseCase {

@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == COMMON_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCoreCultureGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculateCoreCultureGraduationService
implements CalculateCoreCultureGraduationUseCase {

@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == CORE_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_BASIC_ACADEMICAL_CULTURE;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualBasicAcademicalCultureDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculateDualBasicAcademicalCultureDetailGraduationUseService implements
CalculateDualBasicAcademicalCultureDetailGraduationUseCase {
@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == DUAL_BASIC_ACADEMICAL_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_MAJOR;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDualMajorDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculateDualMajorDetailGraduationService implements CalculateDualMajorDetailGraduationUseCase {
@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == DUAL_MAJOR;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculatePrimaryBasicAcademicalCultureDetailGraduationService
implements CalculateDetailGraduationUseCase {
@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == PRIMARY_BASIC_ACADEMICAL_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_MAJOR;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculatePrimaryMajorDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculatePrimaryMajorDetailGraduationService implements CalculatePrimaryMajorDetailGraduationUseCase {
@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == PRIMARY_MAJOR;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*;

import org.springframework.stereotype.Service;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateSubMajorDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

@Service
public class CalculateSubMajorDetailGraduationService implements CalculateSubMajorDetailGraduationUseCase {
@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == SUB_MAJOR;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculateCommonCultureGraduationUseCase extends CalculateDetailGraduationUseCase{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculateCoreCultureGraduationUseCase extends CalculateDetailGraduationUseCase {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

public interface CalculateDetailGraduationUseCase {

boolean supports(GraduationCategory graduationCategory);

DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculateDualBasicAcademicalCultureDetailGraduationUseCase extends CalculateDetailGraduationUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculateDualMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculatePrimaryBasicAcademicalCultureDetailGraduationUseCase
extends CalculateDetailGraduationUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculatePrimaryMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.usecase;

public interface CalculateSubMajorDetailGraduationUseCase extends CalculateDetailGraduationUseCase {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.plzgraduate.myongjigraduatebe.graduation.api;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;

@SpringBootTest
@ActiveProfiles("test")
class SingleCalculateDetailGraduationUseCaseResolverTest {

@Autowired
private SingleCalculateDetailGraduationUseCaseResolver singleCalculateDetailGraduationUseCaseResolver;

@DisplayName("졸업 카테고리를 계산할 수 있는 CalculateDetailGraduationUseCaseResolver 반환한다.")
@ValueSource(strings =
{"COMMON_CULTURE", "CORE_CULTURE", "PRIMARY_MAJOR", "DUAL_MAJOR", "SUB_MAJOR",
"PRIMARY_BASIC_ACADEMICAL_CULTURE", "DUAL_BASIC_ACADEMICAL_CULTURE"
})
@ParameterizedTest
void resolveCalculateDetailGraduationUseCase(String graduationCategoryName) {
//given
GraduationCategory graduationCategory = GraduationCategory.valueOf(graduationCategoryName);

// when
CalculateDetailGraduationUseCase calculateDetailGraduationUseCase = singleCalculateDetailGraduationUseCaseResolver.resolveCalculateDetailGraduationUseCase(
graduationCategory);

//then
assertThat(calculateDetailGraduationUseCase.supports(graduationCategory)).isEqualTo(true);
}
}

0 comments on commit e495969

Please sign in to comment.