diff --git a/backend/src/main/java/online/wesal/wesal/controller/InvitationController.java b/backend/src/main/java/online/wesal/wesal/controller/InvitationController.java index 9aa7030..e3d9e11 100644 --- a/backend/src/main/java/online/wesal/wesal/controller/InvitationController.java +++ b/backend/src/main/java/online/wesal/wesal/controller/InvitationController.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import online.wesal.wesal.dto.ApiResponse; +import online.wesal.wesal.dto.CategorizedInvitationsResponse; import online.wesal.wesal.dto.CreateInvitationRequest; import online.wesal.wesal.dto.InvitationResponse; import online.wesal.wesal.service.InvitationService; @@ -80,12 +81,15 @@ public class InvitationController { } } - @GetMapping("/available") - @Operation(summary = "Get available invitations", description = "Get all invitations with available space") - public ResponseEntity>> getAvailableInvitations() { + @GetMapping("/all") + @Operation(summary = "Get all categorized invitations", description = "Get invitations in three categories: created, accepted, and available") + public ResponseEntity> getAllCategorizedInvitations(Authentication authentication) { try { - List invitations = invitationService.getAvailableInvitations(); - return ResponseEntity.ok(ApiResponse.success(invitations)); + String userEmail = authentication.getName(); + CategorizedInvitationsResponse response = invitationService.getAllCategorizedInvitations(userEmail); + return ResponseEntity.ok(ApiResponse.success(response)); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().body(ApiResponse.error(e.getMessage())); } catch (Exception e) { return ResponseEntity.status(500).body(ApiResponse.error("Something went wrong.. We're sorry but try again later")); } diff --git a/backend/src/main/java/online/wesal/wesal/dto/CategorizedInvitationsResponse.java b/backend/src/main/java/online/wesal/wesal/dto/CategorizedInvitationsResponse.java new file mode 100644 index 0000000..8bc0158 --- /dev/null +++ b/backend/src/main/java/online/wesal/wesal/dto/CategorizedInvitationsResponse.java @@ -0,0 +1,44 @@ +package online.wesal.wesal.dto; + +import java.util.List; + +public class CategorizedInvitationsResponse { + + private List created; + private List accepted; + private List available; + + public CategorizedInvitationsResponse() {} + + public CategorizedInvitationsResponse(List created, + List accepted, + List available) { + this.created = created; + this.accepted = accepted; + this.available = available; + } + + public List getCreated() { + return created; + } + + public void setCreated(List created) { + this.created = created; + } + + public List getAccepted() { + return accepted; + } + + public void setAccepted(List accepted) { + this.accepted = accepted; + } + + public List getAvailable() { + return available; + } + + public void setAvailable(List available) { + this.available = available; + } +} \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/repository/InvitationRepository.java b/backend/src/main/java/online/wesal/wesal/repository/InvitationRepository.java index 802354e..a7d03f6 100644 --- a/backend/src/main/java/online/wesal/wesal/repository/InvitationRepository.java +++ b/backend/src/main/java/online/wesal/wesal/repository/InvitationRepository.java @@ -10,6 +10,12 @@ import java.util.List; @Repository public interface InvitationRepository extends JpaRepository { - @Query("SELECT i FROM Invitation i WHERE i.currentAttendees < i.maxParticipants ORDER BY i.id ASC") + @Query("SELECT i FROM Invitation i WHERE i.currentAttendees < i.maxParticipants AND (i.dateTime IS NULL OR i.dateTime > CURRENT_TIMESTAMP) ORDER BY i.id ASC") List findAvailableInvitationsOrderByCreationDate(); + + @Query("SELECT i FROM Invitation i WHERE i.creator.id = :userId ORDER BY i.id DESC") + List findByCreatorIdOrderByCreationDateDesc(Long userId); + + @Query("SELECT i FROM Invitation i JOIN Attendee a ON a.invitation.id = i.id WHERE a.user.id = :userId ORDER BY i.id DESC") + List findAcceptedInvitationsByUserIdOrderByCreationDateDesc(Long userId); } \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/service/InvitationService.java b/backend/src/main/java/online/wesal/wesal/service/InvitationService.java index 6cc6b93..8b656b5 100644 --- a/backend/src/main/java/online/wesal/wesal/service/InvitationService.java +++ b/backend/src/main/java/online/wesal/wesal/service/InvitationService.java @@ -1,5 +1,6 @@ package online.wesal.wesal.service; +import online.wesal.wesal.dto.CategorizedInvitationsResponse; import online.wesal.wesal.dto.CreateInvitationRequest; import online.wesal.wesal.dto.InvitationResponse; import online.wesal.wesal.entity.Attendee; @@ -68,6 +69,30 @@ public class InvitationService { .collect(Collectors.toList()); } + public CategorizedInvitationsResponse getAllCategorizedInvitations(String userEmail) { + User user = userRepository.findByEmail(userEmail) + .orElseThrow(() -> new RuntimeException("Authentication error. Please log in again")); + + List created = invitationRepository.findByCreatorIdOrderByCreationDateDesc(user.getId()) + .stream() + .map(this::mapToResponse) + .collect(Collectors.toList()); + + List accepted = invitationRepository.findAcceptedInvitationsByUserIdOrderByCreationDateDesc(user.getId()) + .stream() + .map(this::mapToResponse) + .collect(Collectors.toList()); + + List available = invitationRepository.findAvailableInvitationsOrderByCreationDate() + .stream() + .filter(invitation -> !invitation.getCreator().getId().equals(user.getId())) + .filter(invitation -> !attendeeRepository.existsByInvitationIdAndUserId(invitation.getId(), user.getId())) + .map(this::mapToResponse) + .collect(Collectors.toList()); + + return new CategorizedInvitationsResponse(created, accepted, available); + } + @Transactional public void acceptInvitation(Long invitationId, String userEmail) { User user = userRepository.findByEmail(userEmail)