feat: Système complet de gestion des établissements (backend) - Entités JPA pour Establishment, EstablishmentMedia, EstablishmentRating - DTOs pour création, mise à jour et réponses - Repositories Panache pour accès aux données - Services avec logique métier et validation - Resources REST avec tous les endpoints CRUD - Gestion des médias (photos/vidéos) - Système de notation avec statistiques
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
package com.lions.dev.resource;
|
||||
|
||||
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.ws.rs.*;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.eclipse.microprofile.openapi.annotations.Operation;
|
||||
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Ressource REST pour la gestion des médias d'établissements.
|
||||
* Cette classe expose des endpoints pour uploader, récupérer et supprimer des médias.
|
||||
*/
|
||||
@Path("/establishments/{establishmentId}/media")
|
||||
@Produces(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)
|
||||
@Consumes(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)
|
||||
@Tag(name = "Establishment Media", description = "Opérations liées aux médias des établissements")
|
||||
public class EstablishmentMediaResource {
|
||||
|
||||
@Inject
|
||||
EstablishmentMediaService mediaService;
|
||||
|
||||
private static final Logger LOG = Logger.getLogger(EstablishmentMediaResource.class);
|
||||
|
||||
/**
|
||||
* Récupère tous les médias d'un établissement.
|
||||
*/
|
||||
@GET
|
||||
@Operation(summary = "Récupérer tous les médias d'un établissement",
|
||||
description = "Retourne la liste de tous les médias (photos et vidéos) d'un établissement")
|
||||
public Response getEstablishmentMedia(@PathParam("establishmentId") String establishmentId) {
|
||||
LOG.info("Récupération des médias pour l'établissement : " + establishmentId);
|
||||
|
||||
try {
|
||||
UUID id = UUID.fromString(establishmentId);
|
||||
List<EstablishmentMedia> medias = mediaService.getMediaByEstablishmentId(id);
|
||||
List<EstablishmentMediaResponseDTO> responseDTOs = medias.stream()
|
||||
.map(EstablishmentMediaResponseDTO::new)
|
||||
.collect(Collectors.toList());
|
||||
return Response.ok(responseDTOs).build();
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOG.error("ID d'établissement invalide : " + establishmentId);
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("ID d'établissement invalide")
|
||||
.build();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Erreur lors de la récupération des médias", e);
|
||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
||||
.entity("Erreur lors de la récupération des médias")
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload un nouveau média pour un établissement.
|
||||
*/
|
||||
@POST
|
||||
@Transactional
|
||||
@Operation(summary = "Uploader un média pour un établissement",
|
||||
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) {
|
||||
LOG.info("Upload d'un média pour l'établissement : " + establishmentId);
|
||||
|
||||
try {
|
||||
UUID id = UUID.fromString(establishmentId);
|
||||
UUID uploadedByUserId = UUID.fromString(uploadedByUserIdStr);
|
||||
|
||||
// Valider le type de média
|
||||
MediaType mediaType;
|
||||
try {
|
||||
mediaType = MediaType.valueOf(mediaTypeStr.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);
|
||||
EstablishmentMediaResponseDTO responseDTO = new EstablishmentMediaResponseDTO(media);
|
||||
return Response.status(Response.Status.CREATED).entity(responseDTO).build();
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOG.error("Paramètres invalides : " + e.getMessage());
|
||||
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());
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity(e.getMessage())
|
||||
.build();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Erreur inattendue lors de l'upload du média", e);
|
||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
||||
.entity("Erreur lors de l'upload du média")
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime un média d'un établissement.
|
||||
*/
|
||||
@DELETE
|
||||
@Path("/{mediaId}")
|
||||
@Transactional
|
||||
@Operation(summary = "Supprimer un média d'un établissement",
|
||||
description = "Supprime un média spécifique d'un établissement")
|
||||
public Response deleteMedia(
|
||||
@PathParam("establishmentId") String establishmentId,
|
||||
@PathParam("mediaId") String mediaId) {
|
||||
LOG.info("Suppression du média " + mediaId + " de l'établissement " + establishmentId);
|
||||
|
||||
try {
|
||||
UUID establishmentUuid = UUID.fromString(establishmentId);
|
||||
UUID mediaUuid = UUID.fromString(mediaId);
|
||||
mediaService.deleteMedia(establishmentUuid, mediaUuid);
|
||||
return Response.status(Response.Status.NO_CONTENT).build();
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOG.error("ID invalide : " + e.getMessage());
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity("ID invalide")
|
||||
.build();
|
||||
} catch (RuntimeException e) {
|
||||
LOG.error("Erreur lors de la suppression du média : " + e.getMessage());
|
||||
return Response.status(Response.Status.BAD_REQUEST)
|
||||
.entity(e.getMessage())
|
||||
.build();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Erreur inattendue lors de la suppression du média", e);
|
||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
|
||||
.entity("Erreur lors de la suppression du média")
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user