Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat : 문제 풀이 결과 세분화 #36

Merged
merged 4 commits into from
Aug 20, 2024
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 @@ -110,7 +110,7 @@ public GetProblemListsResponse getProblemList(User user, Long groupId, Pageable
LocalDate startDate = problem.getStartDate();
LocalDate endDate = problem.getEndDate();
Integer level = problem.getLevel();
boolean solved = solutionRepository.existsByUserAndProblemAndIsCorrect(user, problem, true);
boolean solved = solutionRepository.existsByUserAndProblemAndResult(user, problem, "맞았습니다!!");
Integer correctCount = solutionRepository.countDistinctUsersWithCorrectSolutionsByProblemId(problemId);
Integer submitMemberCount = solutionRepository.countDistinctUsersByProblemId(problemId);
Integer groupMemberCount = groupMemberRepository.countMembersByStudyGroupId(groupId) + 1;
Expand Down Expand Up @@ -194,7 +194,7 @@ public List<GetProblemResponse> getDeadlineReachedProblemList(User user, Long gr
problem.getStartDate(),
problem.getEndDate(),
problem.getLevel(),
solutionRepository.existsByUserAndProblemAndIsCorrect(user, problem, true),
solutionRepository.existsByUserAndProblemAndResult(user, problem, "맞았습니다!!"),
submitMemberCount,
groupMemberCount,
accuracy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

import java.time.LocalDateTime;

import com.gamzabat.algohub.feature.problem.domain.Problem;
import com.gamzabat.algohub.feature.user.domain.User;

import com.gamzabat.algohub.feature.problem.domain.Problem;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
Expand Down Expand Up @@ -34,27 +33,23 @@ public class Solution {

private LocalDateTime solvedDateTime;
private String content;
private boolean isCorrect;
private String result;
private Integer memoryUsage;
private Integer executionTime;
private String language;
private Integer codeLength;

@Builder
public Solution(Problem problem, User user, LocalDateTime solvedDateTime, String content, boolean isCorrect,
Integer memoryUsage, Integer executionTime, String language, Integer codeLength) {
public Solution(Problem problem, User user, LocalDateTime solvedDateTime, String content, String result,
Integer memoryUsage, Integer executionTime, String language, Integer codeLength) {
this.problem = problem;
this.user = user;
this.solvedDateTime = solvedDateTime;
this.content = content;
this.isCorrect = isCorrect;
this.result = result;
this.memoryUsage = memoryUsage;
this.executionTime = executionTime;
this.language = language;
this.codeLength = codeLength;
}

public LocalDateTime getSolvedDateTime() {
return solvedDateTime;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public record GetSolutionResponse(Long solutionId,
String profileImage,
String solvedDateTime,
String content,
boolean isCorrect,
String result,
Integer memoryUsage,
Integer executionTime,
String language,
Expand All @@ -28,7 +28,7 @@ public static GetSolutionResponse toDTO(Solution solution, Long commentCount) {
.profileImage(solution.getUser().getProfileImage())
.solvedDateTime(solvedDateTime)
.content(solution.getContent())
.isCorrect(solution.isCorrect())
.result(solution.getResult())
.memoryUsage(solution.getMemoryUsage())
.executionTime(solution.getExecutionTime())
.language(solution.getLanguage())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,47 @@
package com.gamzabat.algohub.feature.solution.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import com.gamzabat.algohub.feature.studygroup.domain.StudyGroup;
import com.gamzabat.algohub.feature.studygroup.dto.GetRankingResponse;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.gamzabat.algohub.feature.problem.domain.Problem;
import com.gamzabat.algohub.feature.solution.domain.Solution;
import com.gamzabat.algohub.feature.studygroup.domain.StudyGroup;
import com.gamzabat.algohub.feature.studygroup.dto.GetRankingResponse;
import com.gamzabat.algohub.feature.user.domain.User;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface SolutionRepository extends JpaRepository<Solution, Long> {
Page<Solution> findAllByProblemOrderBySolvedDateTimeDesc(Problem problem, Pageable pageable);
import java.util.List;

public interface SolutionRepository extends JpaRepository<Solution,Long> {
Page<Solution> findAllByProblemOrderBySolvedDateTimeDesc(Problem problem, Pageable pageable);
Boolean existsByUserAndProblem(User user, Problem problem);


@Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId")
Integer countDistinctUsersByProblemId(@Param("problemId") Long problemId);

@Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId AND s.isCorrect = true")
@Query("SELECT COUNT(DISTINCT s.user) FROM Solution s WHERE s.problem.id = :problemId AND s.result = '맞았습니다!!'")
Integer countDistinctUsersWithCorrectSolutionsByProblemId(@Param("problemId") Long problemId);

@Query("SELECT COUNT(DISTINCT s.problem.id) FROM Solution s " +
"JOIN s.problem p " +
"WHERE s.user = :user " +
"AND p.studyGroup.id = :groupId " +
"AND s.isCorrect = true")
"JOIN s.problem p " +
"WHERE s.user = :user " +
"AND p.studyGroup.id = :groupId " +
"AND s.result = '맞았습니다!!'")
Long countDistinctCorrectSolutionsByUserAndGroup(@Param("user") User user, @Param("groupId") Long groupId);

@Query(
"SELECT new com.gamzabat.algohub.feature.studygroup.dto.GetRankingResponse(u.nickname, u.profileImage, 0, COUNT(DISTINCT s.problem.id)) "
+
@Query("SELECT new com.gamzabat.algohub.feature.studygroup.dto.GetRankingResponse(u.nickname, u.profileImage, 0, COUNT(DISTINCT s.problem.id)) " +
"FROM Solution s " +
"JOIN s.user u " +
"JOIN s.problem p " +
"JOIN p.studyGroup g " +
"WHERE s.isCorrect = true AND g = :group " +
"WHERE s.result = '맞았습니다!!' AND g = :group " +
"GROUP BY u.id, u.nickname, u.profileImage " +
"ORDER BY COUNT(DISTINCT s.problem.id) DESC, MAX(s.solvedDateTime) ASC")
List<GetRankingResponse> findTopUsersByGroup(@Param("group") StudyGroup group);

boolean existsByUserAndProblemAndIsCorrect(User user, Problem problem, boolean isCorrect);

boolean existsByUserAndProblemAndResult(User user, Problem problem, String result);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,33 @@
import java.util.Iterator;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import com.gamzabat.algohub.exception.ProblemValidationException;
import com.gamzabat.algohub.exception.StudyGroupValidationException;
import com.gamzabat.algohub.exception.UserValidationException;
import com.gamzabat.algohub.feature.comment.repository.CommentRepository;
import com.gamzabat.algohub.feature.problem.domain.Problem;
import com.gamzabat.algohub.feature.problem.repository.ProblemRepository;
import com.gamzabat.algohub.feature.solution.domain.Solution;
import com.gamzabat.algohub.feature.solution.dto.CreateSolutionRequest;
import com.gamzabat.algohub.feature.solution.dto.GetSolutionResponse;
import com.gamzabat.algohub.feature.solution.exception.CannotFoundSolutionException;
import com.gamzabat.algohub.feature.solution.repository.SolutionRepository;
import com.gamzabat.algohub.feature.user.repository.UserRepository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;


import com.gamzabat.algohub.feature.problem.domain.Problem;
import com.gamzabat.algohub.feature.studygroup.domain.StudyGroup;
import com.gamzabat.algohub.feature.studygroup.exception.GroupMemberValidationException;
import com.gamzabat.algohub.feature.studygroup.repository.GroupMemberRepository;
import com.gamzabat.algohub.feature.studygroup.repository.StudyGroupRepository;
import com.gamzabat.algohub.feature.user.domain.User;
import com.gamzabat.algohub.feature.user.repository.UserRepository;
import com.gamzabat.algohub.exception.ProblemValidationException;
import com.gamzabat.algohub.feature.problem.repository.ProblemRepository;
import com.gamzabat.algohub.feature.solution.repository.SolutionRepository;




import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
Expand All @@ -46,36 +51,37 @@ public class SolutionService {

public Page<GetSolutionResponse> getSolutionList(User user, Long problemId, Pageable pageable) {
Problem problem = problemRepository.findById(problemId)
.orElseThrow(() -> new ProblemValidationException(HttpStatus.NOT_FOUND.value(), "존재하지 않는 문제 입니다."));
.orElseThrow(() -> new ProblemValidationException(HttpStatus.NOT_FOUND.value(), "존재하지 않는 문제 입니다."));

StudyGroup group = studyGroupRepository.findById(problem.getStudyGroup().getId())
.orElseThrow(() -> new StudyGroupValidationException(HttpStatus.NOT_FOUND.value(), "존재하지 않는 그룹 입니다."));
.orElseThrow(() -> new StudyGroupValidationException(HttpStatus.NOT_FOUND.value(), "존재하지 않는 그룹 입니다."));

if (!groupMemberRepository.existsByUserAndStudyGroup(user, group)
&& !group.getOwner().getId().equals(user.getId())) {
throw new GroupMemberValidationException(HttpStatus.FORBIDDEN.value(), "참여하지 않은 그룹 입니다.");
if(!groupMemberRepository.existsByUserAndStudyGroup(user, group)
&& !group.getOwner().getId().equals(user.getId())) {
throw new GroupMemberValidationException(HttpStatus.FORBIDDEN.value(),"참여하지 않은 그룹 입니다.");
}

Page<Solution> solutions = solutionRepository.findAllByProblemOrderBySolvedDateTimeDesc(problem, pageable);
log.info("success to get solution list");

return solutions.map(solution -> {
long commentCount = commentRepository.countCommentsBySolutionId(solution.getId());
return GetSolutionResponse.toDTO(solution, commentCount);
return GetSolutionResponse.toDTO(solution,commentCount);
});
}

public GetSolutionResponse getSolution(User user, Long solutionId) {
public GetSolutionResponse getSolution(User user, Long solutionId){
Solution solution = solutionRepository.findById(solutionId)
.orElseThrow(() -> new CannotFoundSolutionException("존재하지 않는 풀이 입니다."));
.orElseThrow(() -> new CannotFoundSolutionException("존재하지 않는 풀이 입니다."));

StudyGroup group = solution.getProblem().getStudyGroup();

if (groupMemberRepository.existsByUserAndStudyGroup(user, group)
if (groupMemberRepository.existsByUserAndStudyGroup(user,group)
|| group.getOwner().getId().equals(user.getId())) {
long commentCount = commentRepository.countCommentsBySolutionId(solution.getId());
return GetSolutionResponse.toDTO(solution, commentCount);
} else {
return GetSolutionResponse.toDTO(solution,commentCount);
}
else {
throw new UserValidationException("해당 풀이를 확인 할 권한이 없습니다.");
}
}
Expand All @@ -88,7 +94,7 @@ public void createSolution(CreateSolutionRequest request) {
}

User user = userRepository.findByBjNickname(request.userName())
.orElseThrow(() -> new UserValidationException("존재하지 않는 유저 입니다."));
.orElseThrow(() -> new UserValidationException("존재하지 않는 유저 입니다."));

Iterator<Problem> iterator = problems.iterator();
while (iterator.hasNext()) {
Expand All @@ -98,22 +104,23 @@ public void createSolution(CreateSolutionRequest request) {
LocalDate endDate = problem.getEndDate();
LocalDate now = LocalDate.now();


if ((studyGroup.getOwner() != user && !groupMemberRepository.existsByUserAndStudyGroup(user, studyGroup))
|| endDate == null || now.isAfter(endDate)) {
||endDate == null || now.isAfter(endDate)) {
iterator.remove();
continue;
}
solutionRepository.save(Solution.builder()
.problem(problem)
.user(user)
.content(request.code())
.memoryUsage(request.memoryUsage())
.executionTime(request.executionTime())
.language(request.codeType())
.codeLength(request.codeLength())
.isCorrect(request.result().equals("맞았습니다!!"))
.solvedDateTime(LocalDateTime.now())
.build()
.problem(problem)
.user(user)
.content(request.code())
.memoryUsage(request.memoryUsage())
.executionTime(request.executionTime())
.language(request.codeType())
.codeLength(request.codeLength())
.result(request.result())
.solvedDateTime(LocalDateTime.now())
.build()
);
}

Expand Down
Loading
Loading