feat: migration complète vers WebSockets Next + Kafka pour temps réel
- Migration de Jakarta WebSocket vers Quarkus WebSockets Next - Implémentation de l'architecture Kafka pour événements temps réel - Ajout des DTOs d'événements (NotificationEvent, ChatMessageEvent, ReactionEvent, PresenceEvent) - Création des bridges Kafka → WebSocket (NotificationKafkaBridge, ChatKafkaBridge, ReactionKafkaBridge) - Mise à jour des services pour publier dans Kafka au lieu d'appeler directement WebSocket - Suppression des classes obsolètes (ChatWebSocket, NotificationWebSocket) - Correction de l'injection des paramètres path dans WebSockets Next (utilisation de connection.pathParam) - Ajout des migrations DB pour bookings, promotions, business hours, amenities, reviews - Mise à jour de la configuration application.properties pour Kafka et WebSockets Next - Mise à jour .gitignore pour ignorer les fichiers de logs
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package com.lions.dev.resource;
|
||||
|
||||
import com.lions.dev.dto.request.establishment.EstablishmentMediaRequestDTO;
|
||||
import com.lions.dev.dto.response.establishment.EstablishmentMediaResponseDTO;
|
||||
import com.lions.dev.entity.establishment.EstablishmentMedia;
|
||||
import com.lions.dev.entity.establishment.MediaType;
|
||||
import com.lions.dev.service.EstablishmentMediaService;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.transaction.Transactional;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.eclipse.microprofile.openapi.annotations.Operation;
|
||||
@@ -62,6 +64,7 @@ public class EstablishmentMediaResource {
|
||||
|
||||
/**
|
||||
* Upload un nouveau média pour un établissement.
|
||||
* Accepte un body JSON avec les informations du média.
|
||||
*/
|
||||
@POST
|
||||
@Transactional
|
||||
@@ -69,36 +72,56 @@ public class EstablishmentMediaResource {
|
||||
description = "Upload un nouveau média (photo ou vidéo) pour un établissement")
|
||||
public Response uploadMedia(
|
||||
@PathParam("establishmentId") String establishmentId,
|
||||
@QueryParam("mediaUrl") String mediaUrl,
|
||||
@QueryParam("mediaType") String mediaTypeStr,
|
||||
@QueryParam("uploadedByUserId") String uploadedByUserIdStr,
|
||||
@QueryParam("thumbnailUrl") String thumbnailUrl) {
|
||||
@Valid EstablishmentMediaRequestDTO requestDTO,
|
||||
@QueryParam("uploadedByUserId") String uploadedByUserIdStr) {
|
||||
LOG.info("Upload d'un média pour l'établissement : " + establishmentId);
|
||||
|
||||
try {
|
||||
UUID id = UUID.fromString(establishmentId);
|
||||
UUID uploadedByUserId = UUID.fromString(uploadedByUserIdStr);
|
||||
|
||||
// Utiliser uploadedByUserId du query param ou du DTO
|
||||
String userIdStr = uploadedByUserIdStr != null && !uploadedByUserIdStr.isEmpty()
|
||||
? uploadedByUserIdStr
|
||||
: requestDTO.getUploadedByUserId();
|
||||
|
||||
if (userIdStr == null || userIdStr.isEmpty()) {
|
||||
LOG.error("uploadedByUserId est obligatoire");
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("L'ID de l'utilisateur (uploadedByUserId) est obligatoire")
|
||||
.build();
|
||||
}
|
||||
|
||||
UUID uploadedByUserId = UUID.fromString(userIdStr);
|
||||
|
||||
// Valider le type de média
|
||||
MediaType mediaType;
|
||||
try {
|
||||
mediaType = MediaType.valueOf(mediaTypeStr.toUpperCase());
|
||||
mediaType = MediaType.valueOf(requestDTO.getMediaType().toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("Type de média invalide. Utilisez PHOTO ou VIDEO")
|
||||
.build();
|
||||
}
|
||||
|
||||
EstablishmentMedia media = mediaService.uploadMedia(id, mediaUrl, mediaType, uploadedByUserId, thumbnailUrl);
|
||||
// Appeler le service avec displayOrder
|
||||
EstablishmentMedia media = mediaService.uploadMedia(
|
||||
id,
|
||||
requestDTO.getMediaUrl(),
|
||||
mediaType,
|
||||
uploadedByUserId,
|
||||
requestDTO.getThumbnailUrl(),
|
||||
requestDTO.getDisplayOrder() != null ? requestDTO.getDisplayOrder() : 0
|
||||
);
|
||||
|
||||
EstablishmentMediaResponseDTO responseDTO = new EstablishmentMediaResponseDTO(media);
|
||||
return Response.status(Response.Status.CREATED).entity(responseDTO).build();
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOG.error("Paramètres invalides : " + e.getMessage());
|
||||
LOG.error("Paramètres invalides : " + e.getMessage(), e);
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("Paramètres invalides : " + e.getMessage())
|
||||
.build();
|
||||
} catch (RuntimeException e) {
|
||||
LOG.error("Erreur lors de l'upload du média : " + e.getMessage());
|
||||
LOG.error("Erreur lors de l'upload du média : " + e.getMessage(), e);
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity(e.getMessage())
|
||||
.build();
|
||||
|
||||
Reference in New Issue
Block a user