diff --git a/src/main/java/com/codeit/todo/repository/GoalRepository.java b/src/main/java/com/codeit/todo/repository/GoalRepository.java index cc2ec3e..c0e7322 100644 --- a/src/main/java/com/codeit/todo/repository/GoalRepository.java +++ b/src/main/java/com/codeit/todo/repository/GoalRepository.java @@ -34,7 +34,7 @@ public interface GoalRepository extends JpaRepository { from Goal g join fetch g.todos t where g.user.userId = :userId -and g.goalId = :lastGoalId +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/todo/impl/TodoServiceImpl.java b/src/main/java/com/codeit/todo/service/todo/impl/TodoServiceImpl.java index a3b821d..a01a70a 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 @@ -13,8 +13,8 @@ import com.codeit.todo.service.todo.TodoService; import com.codeit.todo.web.dto.request.todo.*; import com.codeit.todo.web.dto.response.complete.ReadCompleteResponse; +import com.codeit.todo.web.dto.response.slice.CustomSlice; import com.codeit.todo.web.dto.response.todo.*; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; @@ -106,7 +106,7 @@ public CreateTodoResponse saveTodo(int userId, CreateTodoRequest request) { @Transactional(readOnly = true) @Override - public Slice findTodoListWithGoals(int userId, @Valid ReadTodoCompleteWithGoalRequest request) { + public Slice findTodoListWithGoals(int userId, ReadTodoCompleteWithGoalRequest request) { int pageSize = request.size(); Pageable pageable = PageRequest.of(0, pageSize); @@ -130,7 +130,11 @@ public Slice findTodoListWithGoals(int userId, @Vali }) .toList(); - return new SliceImpl<>(responses, pageable, goals.hasNext()); + Integer nextCursor = goals.hasNext() + ? goals.getContent().get(goals.getContent().size() - 1).getGoalId() + : null; + + return new CustomSlice<>(responses, pageable, goals.hasNext(), nextCursor); } @Transactional(readOnly = true) diff --git a/src/main/java/com/codeit/todo/web/dto/response/slice/CustomSlice.java b/src/main/java/com/codeit/todo/web/dto/response/slice/CustomSlice.java new file mode 100644 index 0000000..4cf16e2 --- /dev/null +++ b/src/main/java/com/codeit/todo/web/dto/response/slice/CustomSlice.java @@ -0,0 +1,19 @@ +package com.codeit.todo.web.dto.response.slice; + +import lombok.Builder; +import lombok.Getter; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; + +import java.util.List; + +@Getter +public class CustomSlice extends SliceImpl { + private final Integer nextCursor; + + @Builder + public CustomSlice(List content, Pageable pageable, boolean hasNext, Integer nextCursor) { + super(content, pageable, hasNext); + this.nextCursor = nextCursor; + } +} diff --git a/src/main/java/com/codeit/todo/web/dto/response/todo/ReadTodosWithGoalsResponse.java b/src/main/java/com/codeit/todo/web/dto/response/todo/ReadTodosWithGoalsResponse.java index 15728da..31710e1 100644 --- a/src/main/java/com/codeit/todo/web/dto/response/todo/ReadTodosWithGoalsResponse.java +++ b/src/main/java/com/codeit/todo/web/dto/response/todo/ReadTodosWithGoalsResponse.java @@ -11,6 +11,7 @@ public record ReadTodosWithGoalsResponse( String goalTitle, String goalColor, double progress, + int nextCursor, List todos ) { public static ReadTodosWithGoalsResponse from(Goal goal, List responses, double goalProgress) {