package dev.lions.unionflow.server.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import dev.lions.unionflow.server.entity.Evenement; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * DTO pour l'API mobile - Mapping des champs de l'entité Evenement vers le * format attendu par * l'application mobile Flutter * * @author UnionFlow Team * @version 2.0 * @since 2025-01-16 */ @Data @NoArgsConstructor @AllArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class EvenementMobileDTO { private UUID id; private String titre; private String description; private LocalDateTime dateDebut; private LocalDateTime dateFin; private String lieu; private String adresse; private String ville; private String codePostal; // Mapping: typeEvenement -> type private String type; // Mapping: statut -> statut (OK) private String statut; // Mapping: capaciteMax -> maxParticipants private Integer maxParticipants; // Nombre de participants actuels (calculé depuis les inscriptions) private Integer participantsActuels; // IDs et noms pour les relations private UUID organisateurId; private String organisateurNom; private UUID organisationId; private String organisationNom; // Priorité (à ajouter dans l'entité si nécessaire) private String priorite; // Mapping: visiblePublic -> estPublic private Boolean estPublic; // Mapping: inscriptionRequise -> inscriptionRequise (OK) private Boolean inscriptionRequise; // Mapping: prix -> cout private BigDecimal cout; // Devise private String devise; // Tags (à implémenter si nécessaire) private String[] tags; // URLs private String imageUrl; private String documentUrl; // Notes private String notes; // Dates de création/modification private LocalDateTime dateCreation; private LocalDateTime dateModification; // Actif private Boolean actif; /** * Convertit une entité Evenement en DTO mobile * * @param evenement L'entité à convertir * @return Le DTO mobile */ public static EvenementMobileDTO fromEntity(Evenement evenement) { if (evenement == null) { return null; } return EvenementMobileDTO.builder() .id(evenement.getId()) // Utilise getId() depuis BaseEntity .titre(evenement.getTitre()) .description(evenement.getDescription()) .dateDebut(evenement.getDateDebut()) .dateFin(evenement.getDateFin()) .lieu(evenement.getLieu()) .adresse(evenement.getAdresse()) .ville(null) // Pas de champ ville dans l'entité .codePostal(null) // Pas de champ codePostal dans l'entité // Mapping des enums .type(evenement.getTypeEvenement() != null ? evenement.getTypeEvenement() : null) .statut(evenement.getStatut() != null ? evenement.getStatut() : "PLANIFIE") // Mapping des champs renommés .maxParticipants(evenement.getCapaciteMax()) .participantsActuels(evenement.getNombreInscrits()) // Relations (gestion sécurisée des lazy loading) .organisateurId(evenement.getOrganisateur() != null ? evenement.getOrganisateur().getId() : null) .organisateurNom(evenement.getOrganisateur() != null ? evenement.getOrganisateur().getNomComplet() : null) .organisationId(evenement.getOrganisation() != null ? evenement.getOrganisation().getId() : null) .organisationNom(evenement.getOrganisation() != null ? evenement.getOrganisation().getNom() : null) // Priorité (valeur par défaut) .priorite("MOYENNE") // Mapping booléens .estPublic(evenement.getVisiblePublic()) .inscriptionRequise(evenement.getInscriptionRequise()) // Mapping prix -> cout .cout(evenement.getPrix()) .devise("XOF") // Tags vides pour l'instant .tags(new String[] {}) // URLs (à implémenter si nécessaire) .imageUrl(null) .documentUrl(null) // Notes .notes(evenement.getInstructionsParticulieres()) // Dates .dateCreation(evenement.getDateCreation()) .dateModification(evenement.getDateModification()) // Actif .actif(evenement.getActif()) .build(); } }