diff --git a/src/main/java/org/ezcode/codetest/application/ranking/dto/PointResponse.java b/src/main/java/org/ezcode/codetest/application/ranking/dto/PointResponse.java new file mode 100644 index 00000000..381a62ad --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/ranking/dto/PointResponse.java @@ -0,0 +1,5 @@ +package org.ezcode.codetest.application.ranking.dto; + +public record PointResponse ( + int points +){} diff --git a/src/main/java/org/ezcode/codetest/application/ranking/dto/RankingResponse.java b/src/main/java/org/ezcode/codetest/application/ranking/dto/RankingResponse.java index 511862ab..62d75f7c 100644 --- a/src/main/java/org/ezcode/codetest/application/ranking/dto/RankingResponse.java +++ b/src/main/java/org/ezcode/codetest/application/ranking/dto/RankingResponse.java @@ -3,7 +3,7 @@ import lombok.Builder; @Builder -public record RankingResponse( +public record RankingResponse( Long userId, String nickname, // 사용자 이름 int ranks, diff --git a/src/main/java/org/ezcode/codetest/application/ranking/service/PointService.java b/src/main/java/org/ezcode/codetest/application/ranking/service/PointService.java new file mode 100644 index 00000000..9de73b73 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/application/ranking/service/PointService.java @@ -0,0 +1,17 @@ +package org.ezcode.codetest.application.ranking.service; + +import lombok.RequiredArgsConstructor; +import org.ezcode.codetest.domain.submission.repository.UserProblemResultRepository; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PointService { + + private final UserProblemResultRepository userProblemResultRepository; + + public int getTotalPoints(Long userId) { + return userProblemResultRepository.sumPointByUserId(userId).orElse(0); + } + +} diff --git a/src/main/java/org/ezcode/codetest/domain/submission/repository/UserProblemResultRepository.java b/src/main/java/org/ezcode/codetest/domain/submission/repository/UserProblemResultRepository.java index 649a5381..ada21a06 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/repository/UserProblemResultRepository.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/repository/UserProblemResultRepository.java @@ -6,6 +6,8 @@ import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + public interface UserProblemResultRepository { Optional findUserProblemResultByUserIdAndProblemId(Long userId, Long problemId); @@ -24,4 +26,6 @@ SELECT upr.user.id, SUM(p.score) GROUP BY upr.user.id """) List findScoresBetween(LocalDateTime start, LocalDateTime end); + + Optional sumPointByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/impl/UserProblemResultRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/impl/UserProblemResultRepositoryImpl.java index 512c5350..9d27d3fe 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/impl/UserProblemResultRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/impl/UserProblemResultRepositoryImpl.java @@ -37,4 +37,9 @@ public List findScoresBetween(LocalDateTime start, LocalDateTime end) return userProblemResultJpaRepository.findScoresBetween(start, end); } + @Override + public Optional sumPointByUserId(Long userId) { + return userProblemResultJpaRepository.sumScoreByUserId(userId); + } + } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/jpa/UserProblemResultJpaRepository.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/jpa/UserProblemResultJpaRepository.java index 12b0dab2..8e0ce9a4 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/jpa/UserProblemResultJpaRepository.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/jpa/UserProblemResultJpaRepository.java @@ -7,6 +7,7 @@ import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface UserProblemResultJpaRepository extends JpaRepository { Optional findByUserIdAndProblemId(Long userId, Long problemId); @@ -22,4 +23,14 @@ SELECT upr.user.id, SUM(p.score) """) List findScoresBetween(LocalDateTime start, LocalDateTime end); + @Query(""" + SELECT SUM(p.score) + FROM UserProblemResult upr + JOIN upr.problem p + WHERE upr.user.id = :userId + AND upr.isCorrect = true +""") + Optional sumScoreByUserId(@Param("userId") Long userId); + + } diff --git a/src/main/java/org/ezcode/codetest/presentation/ranking/PointController.java b/src/main/java/org/ezcode/codetest/presentation/ranking/PointController.java new file mode 100644 index 00000000..aa48891c --- /dev/null +++ b/src/main/java/org/ezcode/codetest/presentation/ranking/PointController.java @@ -0,0 +1,32 @@ +package org.ezcode.codetest.presentation.ranking; + +import lombok.RequiredArgsConstructor; +import org.ezcode.codetest.application.ranking.dto.PointResponse; +import org.ezcode.codetest.application.ranking.service.PointService; +import org.ezcode.codetest.domain.user.model.entity.AuthUser; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/points") +@RequiredArgsConstructor +public class PointController { + private final PointService pointService; + + @GetMapping("/me") + public ResponseEntity getMyPoint(@AuthenticationPrincipal AuthUser authUser) { + Long userId = authUser.getId(); + int totalPoints = pointService.getTotalPoints(userId); + return ResponseEntity.ok(new PointResponse(totalPoints)); + } + + @GetMapping("/{userId}") + public ResponseEntity getUserPoint(@PathVariable Long userId) { + int totalPoint = pointService.getTotalPoints(userId); + return ResponseEntity.ok(new PointResponse(totalPoint)); + } +} diff --git a/src/main/java/org/ezcode/codetest/presentation/ranking/RankingController.java b/src/main/java/org/ezcode/codetest/presentation/ranking/RankingController.java index bc8bddbf..0f97569c 100644 --- a/src/main/java/org/ezcode/codetest/presentation/ranking/RankingController.java +++ b/src/main/java/org/ezcode/codetest/presentation/ranking/RankingController.java @@ -1,9 +1,11 @@ package org.ezcode.codetest.presentation.ranking; import lombok.RequiredArgsConstructor; +import org.ezcode.codetest.application.ranking.dto.PointResponse; import org.ezcode.codetest.application.ranking.dto.RankingResponse; import org.ezcode.codetest.application.ranking.service.RankingFacadeService; import org.ezcode.codetest.infrastructure.ranking.scheduler.RankingSyncScheduler; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping;