diff --git a/src/main/java/com/codeit/todo/repository/GoalRepository.java b/src/main/java/com/codeit/todo/repository/GoalRepository.java index ddd6415..cc2ec3e 100644 --- a/src/main/java/com/codeit/todo/repository/GoalRepository.java +++ b/src/main/java/com/codeit/todo/repository/GoalRepository.java @@ -4,7 +4,10 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -13,7 +16,26 @@ public interface GoalRepository extends JpaRepository { Optional findByGoalIdAndUser_UserId(int goalId, int userId); - Slice findByUser_UserId(int userId, Pageable pageable); + Slice findByUser_UserId(@Param("userId") int userId, Pageable pageable); - Slice findByGoalIdAndUser_UserId(Integer goalId, int userId, Pageable pageable); + Slice findByGoalIdAndUser_UserId(@Param("lastGoalId") Integer lastGoalId, @Param("userId") int userId, Pageable pageable); + + @Query(""" +select g +from Goal g +join fetch g.todos t +where g.user.userId = :userId +and :today between t.startDate and t.endDate +""") + Slice findByUserAndHasTodos(@Param("userId") int userId, Pageable pageable, @Param("today") LocalDate today); + + @Query(""" +select g +from Goal g +join fetch g.todos t +where g.user.userId = :userId +and g.goalId = :lastGoalId +and :today between t.startDate and t.endDate +""") + Slice findByUserAndHasTodosAfterLastGoalId(@Param("lastGoalId") Integer lastGoalId, @Param("userId") int userId, Pageable pageable, @Param("today") LocalDate today); } diff --git a/src/main/java/com/codeit/todo/service/goal/impl/GoalServiceImpl.java b/src/main/java/com/codeit/todo/service/goal/impl/GoalServiceImpl.java index 1b7d00d..a2d1a2d 100644 --- a/src/main/java/com/codeit/todo/service/goal/impl/GoalServiceImpl.java +++ b/src/main/java/com/codeit/todo/service/goal/impl/GoalServiceImpl.java @@ -109,7 +109,7 @@ public Slice findAllGoals(int userId, ReadTodoComple int pageSize = request.size(); Pageable pageable = PageRequest.of(0, pageSize); - Slice goals = todoServiceImpl.getGoalsPagination(userId, request, pageable); + Slice goals = getGoalsPagination(userId, request, pageable); List goalsResponses = goals.stream() .map(goal -> { @@ -127,6 +127,16 @@ public Slice findAllGoals(int userId, ReadTodoComple return new SliceImpl<>(sortedGoalsResponses, pageable, goals.hasNext()); } + private Slice getGoalsPagination(int userId, ReadTodoCompleteWithGoalRequest request, Pageable pageable){ + Slice goals; + if (Objects.isNull(request.lastGoalId()) || request.lastGoalId() <= 0) { + goals = goalRepository.findByUser_UserId(userId, pageable); + } else { + goals = goalRepository.findByGoalIdAndUser_UserId(request.lastGoalId(), userId, pageable); + } + return goals; + } + private List sortAllGoals(List goalsResponses){ List sortedGoalsResponses = new ArrayList<>(); diff --git a/src/main/java/com/codeit/todo/service/todo/impl/TodoServiceImpl.java b/src/main/java/com/codeit/todo/service/todo/impl/TodoServiceImpl.java index 276e10f..a3b821d 100644 --- a/src/main/java/com/codeit/todo/service/todo/impl/TodoServiceImpl.java +++ b/src/main/java/com/codeit/todo/service/todo/impl/TodoServiceImpl.java @@ -110,12 +110,18 @@ public Slice findTodoListWithGoals(int userId, @Vali int pageSize = request.size(); Pageable pageable = PageRequest.of(0, pageSize); - Slice goals = getGoalsPagination(userId, request, pageable); + Slice goals; + LocalDate today = LocalDate.now(); + + if (Objects.isNull(request.lastGoalId()) || request.lastGoalId() <= 0) { + goals = goalRepository.findByUserAndHasTodos(userId, pageable, today); + } else { + goals = goalRepository.findByUserAndHasTodosAfterLastGoalId(request.lastGoalId(), userId, pageable, today); + } List responses = goals.getContent().stream() .map(goal -> { - List todos = todoRepository.findTodosByGoalIdBetweenDates(goal.getGoalId(), LocalDate.now()); - + List todos = goal.getTodos(); List todosResponses = makeTodosResponses(todos); double goalProgress = calculateGoalProgress(todos); @@ -270,7 +276,7 @@ public double calculateGoalProgress(List todos) { } public List makeTodosResponses(List todos){ - List todosResponses = todos.stream() + return todos.stream() .map(todo -> { List completes = completeRepository.findByTodo_TodoId(todo.getTodoId()); @@ -280,8 +286,6 @@ public List makeTodosResponses(List todos){ return ReadTodosResponse.from(todo, completeResponses); }).toList(); - - return todosResponses; } public Slice getGoalsPagination(int userId, ReadTodoCompleteWithGoalRequest request, Pageable pageable){