package com.lions.dev.service; import com.lions.dev.entity.establishment.Establishment; import com.lions.dev.entity.establishment.EstablishmentMedia; import com.lions.dev.entity.establishment.MediaType; import com.lions.dev.entity.users.Users; import com.lions.dev.repository.EstablishmentMediaRepository; import com.lions.dev.repository.EstablishmentRepository; import com.lions.dev.repository.UsersRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; import org.jboss.logging.Logger; import java.util.List; import java.util.UUID; /** * Service de gestion des médias d'établissements. * Ce service contient la logique métier pour l'upload, la récupération et la suppression des médias. */ @ApplicationScoped public class EstablishmentMediaService { @Inject EstablishmentMediaRepository mediaRepository; @Inject EstablishmentRepository establishmentRepository; @Inject UsersRepository usersRepository; private static final Logger LOG = Logger.getLogger(EstablishmentMediaService.class); /** * Récupère tous les médias d'un établissement. * * @param establishmentId L'ID de l'établissement * @return Liste des médias de l'établissement */ public List getMediaByEstablishmentId(UUID establishmentId) { LOG.info("Récupération des médias pour l'établissement : " + establishmentId); return mediaRepository.findByEstablishmentId(establishmentId); } /** * Upload un nouveau média pour un établissement. * * @param establishmentId L'ID de l'établissement * @param mediaUrl L'URL du média * @param mediaType Le type de média (PHOTO ou VIDEO) * @param uploadedByUserId L'ID de l'utilisateur qui upload * @param thumbnailUrl L'URL de la miniature (optionnel, pour les vidéos) * @return Le média créé */ @Transactional public EstablishmentMedia uploadMedia(UUID establishmentId, String mediaUrl, MediaType mediaType, UUID uploadedByUserId, String thumbnailUrl) { LOG.info("Upload d'un média pour l'établissement : " + establishmentId); // Vérifier que l'établissement existe Establishment establishment = establishmentRepository.findById(establishmentId); if (establishment == null) { LOG.error("Établissement non trouvé avec l'ID : " + establishmentId); throw new RuntimeException("Établissement non trouvé"); } // Vérifier que l'utilisateur existe Users uploadedBy = usersRepository.findById(uploadedByUserId); if (uploadedBy == null) { LOG.error("Utilisateur non trouvé avec l'ID : " + uploadedByUserId); throw new RuntimeException("Utilisateur non trouvé"); } // Créer le média EstablishmentMedia media = new EstablishmentMedia(establishment, mediaUrl, mediaType, uploadedBy); media.setThumbnailUrl(thumbnailUrl); // Déterminer l'ordre d'affichage (dernier média = ordre le plus élevé) List existingMedia = mediaRepository.findByEstablishmentId(establishmentId); int maxOrder = existingMedia.stream() .mapToInt(EstablishmentMedia::getDisplayOrder) .max() .orElse(-1); media.setDisplayOrder(maxOrder + 1); mediaRepository.persist(media); LOG.info("Média uploadé avec succès : " + media.getId()); return media; } /** * Supprime un média d'un établissement. * * @param establishmentId L'ID de l'établissement * @param mediaId L'ID du média à supprimer */ @Transactional public void deleteMedia(UUID establishmentId, UUID mediaId) { LOG.info("Suppression du média " + mediaId + " de l'établissement " + establishmentId); EstablishmentMedia media = mediaRepository.findById(mediaId); if (media == null) { LOG.error("Média non trouvé avec l'ID : " + mediaId); throw new RuntimeException("Média non trouvé"); } // Vérifier que le média appartient à l'établissement if (!media.getEstablishment().getId().equals(establishmentId)) { LOG.error("Le média " + mediaId + " n'appartient pas à l'établissement " + establishmentId); throw new RuntimeException("Le média n'appartient pas à cet établissement"); } mediaRepository.delete(media); LOG.info("Média supprimé avec succès : " + mediaId); } }