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 @@ -62,6 +62,22 @@ public ResponseEntity<ProblemResponseDto> getUnsolvedProblems(@Parameter @PathVa

}

@Operation(description = "특정 팀의 unsolved problem 1개 랜덤으로 조회")
@ApiResponse(responseCode = "200", description = "조회 성공", content = @Content(schema = @Schema(implementation = ProblemResponseDto.class)))
@GetMapping(value = "/unsolved/random/{teamName}")
public ResponseEntity<ProblemResponseDto> getRandomUnsolvedProblem(@Parameter @PathVariable String teamName) {
Optional<ProblemResponseDto> result;
try {
result = problemTeamService.findRandomUnsolvedProblem(teamName);
}
catch (Exception exception) {
return ResponseEntity.notFound().build();
}
if (result.isEmpty())
return ResponseEntity.noContent().build();
return ResponseEntity.ok(result.get());
}

@Operation(description = "특정 팀, 특정 티어의 unsolved problem 모두 리스트로 조회")
@ApiResponse(responseCode = "200", description = "조회 성공", content = @Content(schema = @Schema(implementation = ProblemResponseDto.class)))
@GetMapping(value = "/unsolved/{teamName}/{tier}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
public interface ProblemTeamRepositoryCustom {

public Optional<ProblemResponseDto> findUnsolvedRandomProblems(String teamName, Long tier);
public Optional<ProblemResponseDto> findUnsolvedRandomProblem(String teamName);
public List<Long> findAllProblemNumberByTeamOrderById(Long teamId);
public List<Long> findAllIdByTeamAndUser(Long teamId, Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@ public class ProblemTeamRepositoryImpl implements ProblemTeamRepositoryCustom {

@Override
public Optional<ProblemResponseDto> findUnsolvedRandomProblems(String teamName, Long tier) {

Random random = new Random(System.currentTimeMillis());
List<Long> count;
int randomNum;
Optional<ProblemResponseDto> result = Optional.empty();

count = queryFactory
.select(problem.id.count())
.from(problem)
.leftJoin(problem.problemTeams, problemTeam)
.on(problemTeam.team.name.eq(teamName))
.where(problemTeam.id.isNull().and(problem.tier.eq(tier)))
.fetch();

if (count.get(0) > 0) {
randomNum = random.nextInt(count.get(0).intValue()) + 1; // 0 <= value < max
result = Optional.of(queryFactory
Expand All @@ -49,6 +49,38 @@ public Optional<ProblemResponseDto> findUnsolvedRandomProblems(String teamName,
return result;
}

@Override
public Optional<ProblemResponseDto> findUnsolvedRandomProblem(String teamName) {

Random random = new Random(System.currentTimeMillis());
List<Long> count;
int randomNum;
Optional<ProblemResponseDto> result = Optional.empty();

count = queryFactory
.select(problem.id.count())
.from(problem)
.leftJoin(problem.problemTeams, problemTeam)
.on(problemTeam.team.name.eq(teamName))
.where(problemTeam.id.isNull())
.fetch();

if (count.get(0) > 0) {
randomNum = random.nextInt(count.get(0).intValue()) + 1; // 0 <= value < max
result = Optional.of(queryFactory
.select(new QProblemResponseDto(problem.id, problem.problemNumber, problem.title, problem.tier))
.from(problem)
.leftJoin(problem.problemTeams, problemTeam)
.on(problemTeam.team.name.eq(teamName))
.where(problemTeam.id.isNull())
.limit(1)
.offset(randomNum)
.fetch()
.get(0));
}
return result;
}

@Override
public List<Long> findAllProblemNumberByTeamOrderById(Long teamId) {
return queryFactory.select(problemTeam.problem.problemNumber)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.unsolvedwa.unsolvedwa.domain.problemteam;

import com.unsolvedwa.unsolvedwa.domain.problem.dto.ProblemResponseDto;
import com.unsolvedwa.unsolvedwa.domain.team.Team;
import com.unsolvedwa.unsolvedwa.domain.team.TeamRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.webjars.NotFoundException;


@Service("problemTeamService")
Expand All @@ -13,10 +16,20 @@
public class ProblemTeamService {

private final ProblemTeamRepository problemTeamRepository;
private final TeamRepository teamRepository;

@Transactional(readOnly = true)
public Optional<ProblemResponseDto> findUnsolvedRandomProblems(String teamName, Long tier) {

return problemTeamRepository.findUnsolvedRandomProblems(teamName, tier);
}

@Transactional(readOnly = true)
public Optional<ProblemResponseDto> findRandomUnsolvedProblem(String teamName) throws NotFoundException {

Optional<Team> optionalTeam = teamRepository.findByName(teamName);
if (optionalTeam.isEmpty()) {
throw new NotFoundException("teamName NotFound");
}
return problemTeamRepository.findUnsolvedRandomProblem(teamName);
}
}