Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ public boolean isClassicsPassed() {
return Boolean.TRUE.equals(this.isClassicsCertPassed);
}

public void updateEnglish(boolean passed) {
isEnglishCertPassed = passed;
}

public static GraduationCheckCertResult empty() {
return new GraduationCheckCertResult(
null,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package kr.allcll.backend.domain.graduation.check.result;

import jakarta.validation.Valid;
import kr.allcll.backend.domain.graduation.check.result.dto.CompletedCoursesResponse;
import kr.allcll.backend.domain.graduation.check.result.dto.GraduationCheckResponse;
import kr.allcll.backend.domain.graduation.check.result.dto.UpdateEnglishCertRequest;
import kr.allcll.backend.support.web.Auth;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
Expand Down Expand Up @@ -37,4 +41,13 @@ public ResponseEntity<CompletedCoursesResponse> getAllCompletedCourses(@Auth Lon
CompletedCoursesResponse response = graduationCheckService.getAllCompletedCourses(userId);
return ResponseEntity.ok(response);
}

@PatchMapping("/api/graduation/check/certifications/english")
public ResponseEntity<Void> updateEnglishCertPass(
@Auth Long userId,
@Valid @RequestBody UpdateEnglishCertRequest updateEnglishCertRequest
) {
graduationCheckService.updateEnglishCertPass(userId, updateEnglishCertRequest);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package kr.allcll.backend.domain.graduation.check.result;

import java.util.List;
import kr.allcll.backend.domain.graduation.check.cert.GraduationCheckCertResult;
import kr.allcll.backend.domain.graduation.check.cert.GraduationCheckCertResultRepository;
import kr.allcll.backend.domain.graduation.check.excel.CompletedCourse;
import kr.allcll.backend.domain.graduation.check.excel.CompletedCourseDto;
import kr.allcll.backend.domain.graduation.check.excel.CompletedCoursePersistenceService;
Expand All @@ -9,23 +11,28 @@
import kr.allcll.backend.domain.graduation.check.result.dto.CheckResult;
import kr.allcll.backend.domain.graduation.check.result.dto.CompletedCoursesResponse;
import kr.allcll.backend.domain.graduation.check.result.dto.GraduationCheckResponse;
import kr.allcll.backend.domain.graduation.check.result.dto.UpdateEnglishCertRequest;
import kr.allcll.backend.support.exception.AllcllErrorCode;
import kr.allcll.backend.support.exception.AllcllException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class GraduationCheckService {

private final GradeExcelParser gradeExcelParser;
private final GraduationChecker graduationChecker;
private final GraduationCheckRepository graduationCheckRepository;
private final GraduationCheckCertResultRepository graduationCheckCertResultRepository;
private final GraduationCheckResponseMapper graduationCheckResponseMapper;
private final CompletedCoursePersistenceService completedCoursePersistenceService;
private final GraduationCheckPersistenceService graduationCheckPersistenceService;

@Transactional
public void checkGraduationRequirements(Long userId, MultipartFile gradeExcel) {
validateExcelFile(gradeExcel);

Expand Down Expand Up @@ -63,4 +70,12 @@ public CompletedCoursesResponse getAllCompletedCourses(Long userId) {
CompletedCourses completedCourses = new CompletedCourses(userCompletedCourses);
return CompletedCoursesResponse.from(completedCourses);
}

@Transactional
public void updateEnglishCertPass(Long userId, UpdateEnglishCertRequest updateEnglishCertRequest) {
GraduationCheckCertResult graduationResult = graduationCheckCertResultRepository.findByUserId(userId)
.orElseThrow(() -> new AllcllException(AllcllErrorCode.GRADUATION_CERT_NOT_FOUND));
graduationResult.updateEnglish(updateEnglishCertRequest.isPassed());
graduationResult.reCalculate();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kr.allcll.backend.domain.graduation.check.result.dto;

import jakarta.validation.constraints.NotNull;

public record UpdateEnglishCertRequest(
@NotNull
Boolean isPassed
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,29 @@
import static org.assertj.core.api.Assertions.tuple;

import java.util.List;
import kr.allcll.backend.domain.graduation.certification.GraduationCertRuleType;
import kr.allcll.backend.domain.graduation.check.cert.GraduationCheckCertResult;
import kr.allcll.backend.domain.graduation.check.cert.GraduationCheckCertResultRepository;
import kr.allcll.backend.domain.graduation.certification.CodingTargetType;
import kr.allcll.backend.domain.graduation.check.excel.CompletedCourseDto;
import kr.allcll.backend.domain.graduation.check.excel.CompletedCoursePersistenceService;
import kr.allcll.backend.domain.graduation.check.result.dto.CompletedCoursesResponse;
import kr.allcll.backend.domain.graduation.check.result.dto.UpdateEnglishCertRequest;
import kr.allcll.backend.domain.graduation.department.GraduationDepartmentInfo;
import kr.allcll.backend.domain.user.User;
import kr.allcll.backend.domain.user.UserRepository;
import kr.allcll.backend.fixture.GraduationCheckCertResultFixture;
import kr.allcll.backend.fixture.GraduationDepartmentInfoFixture;
import kr.allcll.backend.fixture.UserFixture;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.transaction.annotation.Transactional;

@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@Transactional
class GraduationCheckServiceTest {

@Autowired
Expand All @@ -31,6 +38,9 @@ class GraduationCheckServiceTest {
@Autowired
private UserRepository userRepository;

@Autowired
private GraduationCheckCertResultRepository graduationCheckCertResultRepository;

@Test
@DisplayName("빈환값의 개수와 내용을 확인한다.")
void checkAllEarnedCoursesContents() {
Expand Down Expand Up @@ -70,4 +80,58 @@ void checkAllEarnedCoursesContents() {
tuple("654321", "과목명B", false)
);
}

@Test
@DisplayName("영어 인증을 true로 수정하면 passedCount와 만족 여부를 재계산한다.")
void updateEnglishCertPass_true_recalculatesResult() {
// given
GraduationDepartmentInfo graduationDepartmentInfo = GraduationDepartmentInfoFixture
.createDepartmentInfo(2021, CodingTargetType.CODING_MAJOR);
User user = userRepository.save(UserFixture.singleMajorUser(2021, graduationDepartmentInfo));
GraduationCheckCertResult certResult = GraduationCheckCertResultFixture.createCertResult(
user,
GraduationCertRuleType.BOTH_REQUIRED,
false,
false,
true
);
graduationCheckCertResultRepository.save(certResult);

// when
graduationCheckService.updateEnglishCertPass(user.getId(), new UpdateEnglishCertRequest(true));
GraduationCheckCertResult updated = graduationCheckCertResultRepository.findByUserId(user.getId()).orElseThrow();

// then
assertThat(updated.getIsEnglishCertPassed()).isTrue();
assertThat(updated.getPassedCount()).isEqualTo(2);
assertThat(updated.getRequiredPassCount()).isEqualTo(2);
assertThat(updated.getIsSatisfied()).isTrue();
}

@Test
@DisplayName("영어 인증을 false로 수정하면 passedCount와 만족 여부를 재계산한다.")
void updateEnglishCertPass_false_recalculatesResult() {
// given
GraduationDepartmentInfo graduationDepartmentInfo = GraduationDepartmentInfoFixture
.createDepartmentInfo(2021, CodingTargetType.CODING_MAJOR);
User user = userRepository.save(UserFixture.singleMajorUser(2021, graduationDepartmentInfo));
GraduationCheckCertResult certResult = GraduationCheckCertResultFixture.createCertResult(
user,
GraduationCertRuleType.BOTH_REQUIRED,
true,
false,
true
);
graduationCheckCertResultRepository.save(certResult);

// when
graduationCheckService.updateEnglishCertPass(user.getId(), new UpdateEnglishCertRequest(false));
GraduationCheckCertResult updated = graduationCheckCertResultRepository.findByUserId(user.getId()).orElseThrow();

// then
assertThat(updated.getIsEnglishCertPassed()).isFalse();
assertThat(updated.getPassedCount()).isEqualTo(1);
assertThat(updated.getRequiredPassCount()).isEqualTo(2);
assertThat(updated.getIsSatisfied()).isFalse();
}
}
Loading