diff --git a/src/main/java/se/ton/t210/controller/EvaluationItemController.java b/src/main/java/se/ton/t210/controller/EvaluationItemController.java index e35788e..a794d38 100644 --- a/src/main/java/se/ton/t210/controller/EvaluationItemController.java +++ b/src/main/java/se/ton/t210/controller/EvaluationItemController.java @@ -19,12 +19,6 @@ public EvaluationItemController(EvaluationItemService evaluationItemService) { this.evaluationItemService = evaluationItemService; } - @GetMapping("/api/evaluation/score") - public ResponseEntity evaluationScore(Long evaluationItemId, int memberInputScore) { - final int evaluationScore = evaluationItemService.calculateEvaluationScore(evaluationItemId, memberInputScore); - return ResponseEntity.ok(new ScoreResponse(evaluationScore)); - } - @GetMapping("/api/evaluation/items") public ResponseEntity> items(ApplicationType applicationType) { final List responses = evaluationItemService.items(applicationType); diff --git a/src/main/java/se/ton/t210/controller/ScoreController.java b/src/main/java/se/ton/t210/controller/ScoreController.java index efbf456..5af784f 100644 --- a/src/main/java/se/ton/t210/controller/ScoreController.java +++ b/src/main/java/se/ton/t210/controller/ScoreController.java @@ -27,6 +27,12 @@ public ResponseEntity recordCount() { return ResponseEntity.ok(countResponse); } + @GetMapping("/api/score") + public ResponseEntity evaluationScore(Long evaluationItemId, int score) { + final ScoreResponse response = scoreService.evaluationScore(evaluationItemId, score); + return ResponseEntity.ok(response); + } + @GetMapping("/api/score/me") public ResponseEntity myScore() { final Member member = new Member(1l, "name", "email", "password", Gender.MALE, ApplicationType.FireOfficerFemale); @@ -34,6 +40,13 @@ public ResponseEntity myScore() { return ResponseEntity.ok(scoreResponse); } + @PostMapping("/api/score/me") + public ResponseEntity updateScore(List request) { + final Member member = new Member(1l, "name", "email", "password", Gender.MALE, ApplicationType.FireOfficerFemale); + final ScoreResponse scoreResponse = scoreService.update(member.getId(), request, LocalDate.now()); + return ResponseEntity.ok(scoreResponse); + } + @GetMapping("/api/score/rank") public ResponseEntity> rank(int rankCnt) { final Member member = new Member(1l, "name", "email", "password", Gender.MALE, ApplicationType.FireOfficerFemale); diff --git a/src/main/java/se/ton/t210/domain/MonthlyScore.java b/src/main/java/se/ton/t210/domain/MonthlyScore.java index 757e094..0f9f8b7 100644 --- a/src/main/java/se/ton/t210/domain/MonthlyScore.java +++ b/src/main/java/se/ton/t210/domain/MonthlyScore.java @@ -38,4 +38,8 @@ public MonthlyScore(ApplicationType applicationType, Long memberId, int score) { public static MonthlyScore of(Member member, int score) { return new MonthlyScore(member.getApplicationType(), member.getId(), score); } + + public void update(int evaluationScoreSum) { + this.score = evaluationScoreSum; + } } diff --git a/src/main/java/se/ton/t210/domain/MonthlyScoreRepository.java b/src/main/java/se/ton/t210/domain/MonthlyScoreRepository.java index dfdf08b..3ace8b5 100644 --- a/src/main/java/se/ton/t210/domain/MonthlyScoreRepository.java +++ b/src/main/java/se/ton/t210/domain/MonthlyScoreRepository.java @@ -16,5 +16,9 @@ public interface MonthlyScoreRepository extends JpaRepository findByMemberIdAndYearMonth(Long memberId, LocalDate yearMonth); + boolean existByMemberIdAndYearMonth(Long memberId, LocalDate yearMonth); + List findAllByApplicationTypeAndYearMonth(ApplicationType applicationType, LocalDate yearMonth, PageRequest page); + + void deleteAllByMemberIdAndYearMonth(Long memberId, LocalDate yearMonth); } diff --git a/src/main/java/se/ton/t210/dto/EvaluationScoreRequest.java b/src/main/java/se/ton/t210/dto/EvaluationScoreRequest.java new file mode 100644 index 0000000..f7b08f4 --- /dev/null +++ b/src/main/java/se/ton/t210/dto/EvaluationScoreRequest.java @@ -0,0 +1,15 @@ +package se.ton.t210.dto; + +import lombok.Getter; + +@Getter +public class EvaluationScoreRequest { + + private final Long evaluationItemId; + private final int score; + + public EvaluationScoreRequest(Long evaluationItemId, int score) { + this.evaluationItemId = evaluationItemId; + this.score = score; + } +} diff --git a/src/main/java/se/ton/t210/service/EvaluationItemService.java b/src/main/java/se/ton/t210/service/EvaluationItemService.java index 3b176fd..a315199 100644 --- a/src/main/java/se/ton/t210/service/EvaluationItemService.java +++ b/src/main/java/se/ton/t210/service/EvaluationItemService.java @@ -8,6 +8,7 @@ import se.ton.t210.domain.type.ApplicationType; import se.ton.t210.dto.EvaluationItemResponse; import se.ton.t210.dto.EvaluationSectionInfo; +import se.ton.t210.dto.ScoreResponse; import java.util.*; @@ -22,14 +23,6 @@ public EvaluationItemService(EvaluationScoreSectionRepository evaluationScoreSec this.evaluationItemRepository = evaluationItemRepository; } - public int calculateEvaluationScore(Long evaluationItemId, int score) { - return evaluationScoreSectionRepository.findAllByEvaluationItemId(evaluationItemId).stream() - .filter(it -> it.getSectionBaseScore() < score) - .max(Comparator.comparingInt(EvaluationScoreSection::getScore)) - .map(EvaluationScoreSection::getScore) - .orElse(0); - } - public List items(ApplicationType applicationType) { final List items = evaluationItemRepository.findAllByApplicationType(applicationType); return EvaluationItemResponse.listOf(items); diff --git a/src/main/java/se/ton/t210/service/ScoreService.java b/src/main/java/se/ton/t210/service/ScoreService.java index 61ce8e0..12fc5ff 100644 --- a/src/main/java/se/ton/t210/service/ScoreService.java +++ b/src/main/java/se/ton/t210/service/ScoreService.java @@ -1,17 +1,19 @@ package se.ton.t210.service; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import se.ton.t210.domain.*; import se.ton.t210.domain.type.ApplicationType; -import se.ton.t210.dto.RankResponse; -import se.ton.t210.dto.RecordCountResponse; -import se.ton.t210.dto.ScoreResponse; +import se.ton.t210.dto.*; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Optional; @Service public class ScoreService { @@ -21,6 +23,9 @@ public class ScoreService { private final MonthlyScoreItemRepository monthlyScoreItemRepository; private final MonthlyScoreRepository monthlyScoreRepository; + @Autowired + private EvaluationScoreSectionRepository evaluationScoreSectionRepository; + public ScoreService(MemberRepository memberRepository, EvaluationItemRepository evaluationItemRepository, MonthlyScoreItemRepository monthlyScoreItemRepository, MonthlyScoreRepository monthlyScoreRepository) { this.memberRepository = memberRepository; this.evaluationItemRepository = evaluationItemRepository; @@ -39,6 +44,26 @@ public ScoreResponse score(Long memberId, LocalDate date) { return new ScoreResponse(monthlyScore.getScore()); } + @Transactional + public ScoreResponse update(Long memberId, List request, LocalDate yearMonth) { + int evaluationScoreSum = 0; + for(EvaluationScoreRequest scoreInfo : request) { + evaluationScoreSum += evaluationScore(scoreInfo.getEvaluationItemId(), scoreInfo.getScore()).getScore(); + } + final Member member = memberRepository.findById(memberId).orElseThrow(); + monthlyScoreRepository.deleteAllByMemberIdAndYearMonth(member.getId(), yearMonth); + monthlyScoreRepository.save(MonthlyScore.of(member, evaluationScoreSum)); + return new ScoreResponse(evaluationScoreSum); + } + + public ScoreResponse evaluationScore(Long evaluationItemId, int score) { + return new ScoreResponse(evaluationScoreSectionRepository.findAllByEvaluationItemId(evaluationItemId).stream() + .filter(it -> it.getSectionBaseScore() < score) + .max(Comparator.comparingInt(EvaluationScoreSection::getScore)) + .map(EvaluationScoreSection::getScore) + .orElse(0)); + } + public List rank(ApplicationType applicationType, int rankCnt, LocalDate date) { final PageRequest page = PageRequest.of(0, rankCnt, Sort.by(Sort.Order.desc("score"))); final List rankScores = monthlyScoreRepository.findAllByApplicationTypeAndYearMonth(applicationType, date, page); @@ -50,5 +75,4 @@ public List rank(ApplicationType applicationType, int rankCnt, Loc } return rankResponses; } - }