Skip to content
Merged
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 @@ -3,8 +3,12 @@
import com.example.solidconnection.admin.dto.GpaScoreResponse;
import com.example.solidconnection.admin.dto.GpaScoreSearchResponse;
import com.example.solidconnection.admin.dto.GpaScoreUpdateRequest;
import com.example.solidconnection.admin.dto.LanguageTestScoreResponse;
import com.example.solidconnection.admin.dto.LanguageTestScoreSearchResponse;
import com.example.solidconnection.admin.dto.LanguageTestScoreUpdateRequest;
import com.example.solidconnection.admin.dto.ScoreSearchCondition;
import com.example.solidconnection.admin.service.AdminGpaScoreService;
import com.example.solidconnection.admin.service.AdminLanguageTestScoreService;
import com.example.solidconnection.custom.response.PageResponse;
import com.example.solidconnection.util.PagingUtils;
import jakarta.validation.Valid;
Expand All @@ -18,6 +22,7 @@
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -28,7 +33,9 @@
public class AdminScoreController {

private final AdminGpaScoreService adminGpaScoreService;
private final AdminLanguageTestScoreService adminLanguageTestScoreService;

// todo: 추후 커스텀 페이지 객체 & argumentResolver를 적용 필요
@GetMapping("/gpas")
public ResponseEntity<PageResponse<GpaScoreSearchResponse>> searchGpaScores(
@Valid @ModelAttribute ScoreSearchCondition scoreSearchCondition,
Expand All @@ -40,12 +47,33 @@ public ResponseEntity<PageResponse<GpaScoreSearchResponse>> searchGpaScores(
return ResponseEntity.ok(PageResponse.of(page));
}

@PatchMapping("/gpas/{gpa-score-id}")
@PutMapping("/gpas/{gpa-score-id}")
public ResponseEntity<GpaScoreResponse> updateGpaScore(
@PathVariable("gpa-score-id") Long gpaScoreId,
@Valid @RequestBody GpaScoreUpdateRequest request
) {
GpaScoreResponse response = adminGpaScoreService.updateGpaScore(gpaScoreId, request);
return ResponseEntity.ok(response);
}

// todo: 추후 커스텀 페이지 객체 & argumentResolver를 적용 필요
@GetMapping("/language-tests")
public ResponseEntity<PageResponse<LanguageTestScoreSearchResponse>> searchLanguageTestScores(
@Valid @ModelAttribute ScoreSearchCondition scoreSearchCondition,
@PageableDefault(page = 1) Pageable pageable
) {
PagingUtils.validatePage(pageable.getPageNumber(), pageable.getPageSize());
Pageable internalPageable = PageRequest.of(pageable.getPageNumber() - 1, pageable.getPageSize());
Page<LanguageTestScoreSearchResponse> page = adminLanguageTestScoreService.searchLanguageTestScores(scoreSearchCondition, internalPageable);
return ResponseEntity.ok(PageResponse.of(page));
}

@PutMapping("/language-tests/{language-test-score-id}")
public ResponseEntity<LanguageTestScoreResponse> updateLanguageTestScore(
@PathVariable("language-test-score-id") Long languageTestScoreId,
@Valid @RequestBody LanguageTestScoreUpdateRequest request
) {
LanguageTestScoreResponse response = adminLanguageTestScoreService.updateLanguageTestScore(languageTestScoreId, request);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ public record GpaScoreUpdateRequest(
VerifyStatus verifyStatus,

String rejectedReason
) {
) implements ScoreUpdateRequest {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.type.LanguageTestType;

public record LanguageTestResponse(
LanguageTestType languageTestType,
String languageTestScore,
String languageTestReportUrl
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.score.domain.LanguageTestScore;
import com.example.solidconnection.type.LanguageTestType;
import com.example.solidconnection.type.VerifyStatus;

public record LanguageTestScoreResponse(
long id,
LanguageTestType languageTestType,
String languageTestScore,
VerifyStatus verifyStatus,
String rejectedReason
) {
public static LanguageTestScoreResponse from(LanguageTestScore languageTestScore) {
return new LanguageTestScoreResponse(
languageTestScore.getId(),
languageTestScore.getLanguageTest().getLanguageTestType(),
languageTestScore.getLanguageTest().getLanguageTestScore(),
languageTestScore.getVerifyStatus(),
languageTestScore.getRejectedReason()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.solidconnection.admin.dto;

public record LanguageTestScoreSearchResponse(
LanguageTestScoreStatusResponse languageTestScoreStatusResponse,
SiteUserResponse siteUserResponse
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.type.VerifyStatus;

import java.time.ZonedDateTime;

public record LanguageTestScoreStatusResponse(
long id,
LanguageTestResponse languageTestResponse,
VerifyStatus verifyStatus,
String rejectedReason,
ZonedDateTime createdAt,
ZonedDateTime updatedAt
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.custom.validation.annotation.RejectedReasonRequired;
import com.example.solidconnection.type.LanguageTestType;
import com.example.solidconnection.type.VerifyStatus;
import jakarta.validation.constraints.NotNull;

@RejectedReasonRequired
public record LanguageTestScoreUpdateRequest(

@NotNull(message = "어학 유형을 입력해주세요.")
LanguageTestType languageTestType,

@NotNull(message = "어학 점수를 입력해주세요.")
String languageTestScore,

@NotNull(message = "승인 상태를 설정해주세요.")
VerifyStatus verifyStatus,

String rejectedReason
) implements ScoreUpdateRequest {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.solidconnection.admin.dto;

import com.example.solidconnection.type.VerifyStatus;

public interface ScoreUpdateRequest {
VerifyStatus verifyStatus();
String rejectedReason();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.example.solidconnection.admin.service;

import com.example.solidconnection.admin.dto.LanguageTestScoreResponse;
import com.example.solidconnection.admin.dto.LanguageTestScoreSearchResponse;
import com.example.solidconnection.admin.dto.LanguageTestScoreUpdateRequest;
import com.example.solidconnection.admin.dto.ScoreSearchCondition;
import com.example.solidconnection.application.domain.LanguageTest;
import com.example.solidconnection.custom.exception.CustomException;
import com.example.solidconnection.score.domain.LanguageTestScore;
import com.example.solidconnection.score.repository.LanguageTestScoreRepository;
import com.example.solidconnection.type.VerifyStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.example.solidconnection.custom.exception.ErrorCode.LANGUAGE_TEST_SCORE_NOT_FOUND;

@RequiredArgsConstructor
@Service
public class AdminLanguageTestScoreService {

private final LanguageTestScoreRepository languageTestScoreRepository;

@Transactional(readOnly = true)
public Page<LanguageTestScoreSearchResponse> searchLanguageTestScores(ScoreSearchCondition scoreSearchCondition, Pageable pageable) {
return languageTestScoreRepository.searchLanguageTestScores(scoreSearchCondition, pageable);
}

@Transactional
public LanguageTestScoreResponse updateLanguageTestScore(Long languageTestScoreId, LanguageTestScoreUpdateRequest request) {
LanguageTestScore languageTestScore = languageTestScoreRepository.findById(languageTestScoreId)
.orElseThrow(() -> new CustomException(LANGUAGE_TEST_SCORE_NOT_FOUND));
languageTestScore.updateLanguageTestScore(
new LanguageTest(
request.languageTestType(),
request.languageTestScore(),
languageTestScore.getLanguageTest().getLanguageTestReportUrl()
),
request.verifyStatus(),
request.verifyStatus() == VerifyStatus.REJECTED ? request.rejectedReason() : null
);
return LanguageTestScoreResponse.from(languageTestScore);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public enum ErrorCode {
REGION_NOT_FOUND_BY_KOREAN_NAME(HttpStatus.NOT_FOUND.value(), "이름에 해당하는 지역을 찾을 수 없습니다."),
COUNTRY_NOT_FOUND_BY_KOREAN_NAME(HttpStatus.NOT_FOUND.value(), "이름에 해당하는 국가를 찾을 수 없습니다."),
GPA_SCORE_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "존재하지 않는 학점입니다."),
LANGUAGE_TEST_SCORE_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "존재하지 않는 어학성적입니다."),

// auth
USER_ALREADY_SIGN_OUT(HttpStatus.UNAUTHORIZED.value(), "로그아웃 되었습니다."),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.example.solidconnection.custom.validation.validator;

import com.example.solidconnection.admin.dto.GpaScoreUpdateRequest;
import com.example.solidconnection.admin.dto.ScoreUpdateRequest;
import com.example.solidconnection.custom.validation.annotation.RejectedReasonRequired;
import com.example.solidconnection.type.VerifyStatus;
import io.micrometer.common.util.StringUtils;
Expand All @@ -9,12 +9,12 @@

import static com.example.solidconnection.custom.exception.ErrorCode.REJECTED_REASON_REQUIRED;

public class RejectedReasonValidator implements ConstraintValidator<RejectedReasonRequired, GpaScoreUpdateRequest> {
public class RejectedReasonValidator implements ConstraintValidator<RejectedReasonRequired, ScoreUpdateRequest> {

private static final String REJECTED_REASON = "rejectedReason";

@Override
public boolean isValid(GpaScoreUpdateRequest request, ConstraintValidatorContext context) {
public boolean isValid(ScoreUpdateRequest request, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
if (isRejectedWithoutReason(request)) {
addValidationError(context, REJECTED_REASON_REQUIRED.getMessage());
Expand All @@ -23,7 +23,7 @@ public boolean isValid(GpaScoreUpdateRequest request, ConstraintValidatorContext
return true;
}

private boolean isRejectedWithoutReason(GpaScoreUpdateRequest request) {
private boolean isRejectedWithoutReason(ScoreUpdateRequest request) {
return request.verifyStatus().equals(VerifyStatus.REJECTED)
&& StringUtils.isBlank(request.rejectedReason());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,10 @@ public void setSiteUser(SiteUser siteUser) {
this.siteUser = siteUser;
siteUser.getLanguageTestScoreList().add(this);
}

public void updateLanguageTestScore(LanguageTest languageTest, VerifyStatus verifyStatus, String rejectedReason) {
this.languageTest = languageTest;
this.verifyStatus = verifyStatus;
this.rejectedReason = rejectedReason;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.solidconnection.score.repository;

import com.example.solidconnection.score.domain.LanguageTestScore;
import com.example.solidconnection.score.repository.custom.LanguageTestScoreFilterRepository;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.type.LanguageTestType;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -9,7 +10,7 @@
import java.util.Optional;

@Repository
public interface LanguageTestScoreRepository extends JpaRepository<LanguageTestScore, Long> {
public interface LanguageTestScoreRepository extends JpaRepository<LanguageTestScore, Long>, LanguageTestScoreFilterRepository {

Optional<LanguageTestScore> findLanguageTestScoreBySiteUserAndLanguageTest_LanguageTestType(SiteUser siteUser, LanguageTestType languageTestType);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.solidconnection.score.repository.custom;

import com.example.solidconnection.admin.dto.LanguageTestScoreSearchResponse;
import com.example.solidconnection.admin.dto.ScoreSearchCondition;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface LanguageTestScoreFilterRepository {

Page<LanguageTestScoreSearchResponse> searchLanguageTestScores(ScoreSearchCondition scoreSearchCondition, Pageable pageable);
}
Loading