diff --git a/src/main/java/com/fredmaina/chatapp/core/Controllers/ChatController.java b/src/main/java/com/fredmaina/chatapp/core/Controllers/ChatController.java index 894075b..b8e8009 100644 --- a/src/main/java/com/fredmaina/chatapp/core/Controllers/ChatController.java +++ b/src/main/java/com/fredmaina/chatapp/core/Controllers/ChatController.java @@ -6,6 +6,7 @@ import com.fredmaina.chatapp.Auth.services.JWTService; import com.fredmaina.chatapp.core.DTOs.ChatMessageDto; import com.fredmaina.chatapp.core.DTOs.ChatSessionDto; +import com.fredmaina.chatapp.core.DTOs.PaginationDto; import com.fredmaina.chatapp.core.Repositories.ChatMessageRepository; import com.fredmaina.chatapp.core.Services.ChatService; import com.fredmaina.chatapp.core.models.ChatMessage; @@ -63,12 +64,21 @@ public ResponseEntity getUserChats(@RequestHeader(value = "Authorization", re @GetMapping("/chat/session_history") public ResponseEntity getAnonChatHistory( @RequestParam String sessionId, - @RequestParam String recipient // This is the username of the dashboard owner + @RequestParam String recipient, // This is the username of the dashboard owner + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "50") int size ) { - ; - List messages = chatService.getChatHistoryForAnonymous(sessionId, recipient); - - return ResponseEntity.ok(Map.of("success", true, "messages", messages)); + PaginationDto chatPage = + chatService.getChatHistoryForAnonymous(sessionId, recipient, page, size); + + return ResponseEntity.ok(Map.of( + "success", true, + "page", chatPage.getPage(), + "size", chatPage.getSize(), + "totalPages", chatPage.getTotalPages(), + "hasNextPage", chatPage.isHasNextPage(), + "messages", chatPage.getMessages() + )); } @DeleteMapping("/chat/{anonSessionId}") diff --git a/src/main/java/com/fredmaina/chatapp/core/DTOs/PaginationDto.java b/src/main/java/com/fredmaina/chatapp/core/DTOs/PaginationDto.java new file mode 100644 index 0000000..ffae142 --- /dev/null +++ b/src/main/java/com/fredmaina/chatapp/core/DTOs/PaginationDto.java @@ -0,0 +1,19 @@ +package com.fredmaina.chatapp.core.DTOs; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@Data +@AllArgsConstructor +public class PaginationDto { + + private List messages; + private int page; + private int size; + private int totalPages; + private boolean hasNextPage; + } + + diff --git a/src/main/java/com/fredmaina/chatapp/core/Repositories/ChatMessageRepository.java b/src/main/java/com/fredmaina/chatapp/core/Repositories/ChatMessageRepository.java index 9e5979d..f53ea13 100644 --- a/src/main/java/com/fredmaina/chatapp/core/Repositories/ChatMessageRepository.java +++ b/src/main/java/com/fredmaina/chatapp/core/Repositories/ChatMessageRepository.java @@ -2,6 +2,8 @@ import com.fredmaina.chatapp.Auth.Models.User; import com.fredmaina.chatapp.core.models.ChatMessage; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -24,8 +26,9 @@ public interface ChatMessageRepository extends JpaRepository "OR " + "(m.toSessionId = :sessionId AND m.fromUser.id = :recipientId) " + "ORDER BY m.timestamp") - List findFullChatHistory(@Param("sessionId") String sessionId, - @Param("recipientId") UUID recipientId); + Page findFullChatHistory(@Param("sessionId") String sessionId, + @Param("recipientId") UUID recipientId + , Pageable pageable); diff --git a/src/main/java/com/fredmaina/chatapp/core/Services/ChatService.java b/src/main/java/com/fredmaina/chatapp/core/Services/ChatService.java index 89d7db3..1199924 100644 --- a/src/main/java/com/fredmaina/chatapp/core/Services/ChatService.java +++ b/src/main/java/com/fredmaina/chatapp/core/Services/ChatService.java @@ -5,11 +5,16 @@ import com.fredmaina.chatapp.core.DTOs.ChatMessageDto; import com.fredmaina.chatapp.core.DTOs.ChatMessageMapper; import com.fredmaina.chatapp.core.DTOs.ChatSessionDto; +import com.fredmaina.chatapp.core.DTOs.PaginationDto; import com.fredmaina.chatapp.core.Repositories.ChatMessageRepository; import com.fredmaina.chatapp.core.models.ChatMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -73,17 +78,27 @@ public List getUserChatSessions(UUID userId) { } @Transactional - public List getChatHistoryForAnonymous(String sessionId, String recipientUsername) { + public PaginationDto getChatHistoryForAnonymous(String sessionId, String recipientUsername, + int page,int size) { User recipient = userRepository.findByUsername(recipientUsername) .orElseThrow(() -> new RuntimeException("Recipient user not found: " + recipientUsername)); - List messages = chatMessageRepository.findFullChatHistory(sessionId,recipient.getId()); + Pageable pageable = PageRequest.of(page, size, Sort.by("timestamp").descending()); + Page messages = chatMessageRepository.findFullChatHistory(sessionId,recipient.getId(),pageable); chatMessageRepository.markMessagesAsRead(recipient.getId(), sessionId); - return messages.stream() + List dtoList = messages.stream() .map(msg -> ChatMessageMapper.toDto(msg, recipient.getId())) .collect(Collectors.toList()); + + return new PaginationDto( + dtoList, + messages.getNumber(), + messages.getSize(), + messages.getTotalPages(), + messages.hasNext() + ); }