From bf994ccbea30f87b480dd4456f80ae829ce55151 Mon Sep 17 00:00:00 2001 From: dahoud Date: Sun, 30 Nov 2025 11:30:33 +0000 Subject: [PATCH] feat: PHASE 5.2 - Repositories et DTOs Documentaires MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repositories créés: - DocumentRepository: Recherche par hash MD5/SHA256, type - PieceJointeRepository: Recherche par document, membre, organisation, cotisation, adhésion, demande d'aide, transaction Wave DTOs créés: - DocumentDTO: Validation complète avec contraintes - PieceJointeDTO: Relations flexibles via UUID Respect strict DRY/WOU: - Patterns de repository cohérents - Patterns de DTO cohérents - Relations via UUID pour découplage --- .../server/api/dto/document/DocumentDTO.java | 59 ++++++++++++ .../api/dto/document/PieceJointeDTO.java | 55 ++++++++++++ .../server/repository/DocumentRepository.java | 59 ++++++++++++ .../repository/PieceJointeRepository.java | 89 +++++++++++++++++++ 4 files changed, 262 insertions(+) create mode 100644 unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/DocumentDTO.java create mode 100644 unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/PieceJointeDTO.java create mode 100644 unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/DocumentRepository.java create mode 100644 unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/PieceJointeRepository.java diff --git a/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/DocumentDTO.java b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/DocumentDTO.java new file mode 100644 index 0000000..1e11eeb --- /dev/null +++ b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/DocumentDTO.java @@ -0,0 +1,59 @@ +package dev.lions.unionflow.server.api.dto.document; + +import dev.lions.unionflow.server.api.dto.base.BaseDTO; +import dev.lions.unionflow.server.api.enums.document.TypeDocument; +import jakarta.validation.constraints.*; +import lombok.Getter; +import lombok.Setter; + +/** + * DTO pour la gestion des documents + * + * @author UnionFlow Team + * @version 3.0 + * @since 2025-01-29 + */ +@Getter +@Setter +public class DocumentDTO extends BaseDTO { + + private static final long serialVersionUID = 1L; + + /** Nom du fichier */ + @NotBlank(message = "Le nom du fichier est obligatoire") + private String nomFichier; + + /** Nom original */ + private String nomOriginal; + + /** Chemin de stockage */ + @NotBlank(message = "Le chemin de stockage est obligatoire") + private String cheminStockage; + + /** Type MIME */ + private String typeMime; + + /** Taille en octets */ + @NotNull(message = "La taille est obligatoire") + @Min(value = 0, message = "La taille doit être positive") + private Long tailleOctets; + + /** Type de document */ + private TypeDocument typeDocument; + + /** Hash MD5 */ + private String hashMd5; + + /** Hash SHA256 */ + private String hashSha256; + + /** Description */ + private String description; + + /** Nombre de téléchargements */ + private Integer nombreTelechargements; + + /** Taille formatée (calculée) */ + private String tailleFormatee; +} + diff --git a/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/PieceJointeDTO.java b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/PieceJointeDTO.java new file mode 100644 index 0000000..5ad031c --- /dev/null +++ b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/document/PieceJointeDTO.java @@ -0,0 +1,55 @@ +package dev.lions.unionflow.server.api.dto.document; + +import dev.lions.unionflow.server.api.dto.base.BaseDTO; +import jakarta.validation.constraints.*; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; + +/** + * DTO pour la gestion des pièces jointes + * + * @author UnionFlow Team + * @version 3.0 + * @since 2025-01-29 + */ +@Getter +@Setter +public class PieceJointeDTO extends BaseDTO { + + private static final long serialVersionUID = 1L; + + /** Ordre d'affichage */ + @NotNull(message = "L'ordre est obligatoire") + @Min(value = 1, message = "L'ordre doit être positif") + private Integer ordre; + + /** Libellé */ + private String libelle; + + /** Commentaire */ + private String commentaire; + + /** ID du document */ + @NotNull(message = "Le document est obligatoire") + private UUID documentId; + + /** ID du membre (optionnel) */ + private UUID membreId; + + /** ID de l'organisation (optionnel) */ + private UUID organisationId; + + /** ID de la cotisation (optionnel) */ + private UUID cotisationId; + + /** ID de l'adhésion (optionnel) */ + private UUID adhesionId; + + /** ID de la demande d'aide (optionnel) */ + private UUID demandeAideId; + + /** ID de la transaction Wave (optionnel) */ + private UUID transactionWaveId; +} + diff --git a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/DocumentRepository.java b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/DocumentRepository.java new file mode 100644 index 0000000..151aade --- /dev/null +++ b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/DocumentRepository.java @@ -0,0 +1,59 @@ +package dev.lions.unionflow.server.repository; + +import dev.lions.unionflow.server.api.enums.document.TypeDocument; +import dev.lions.unionflow.server.entity.Document; +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; +import java.util.List; +import java.util.Optional; + +/** + * Repository pour l'entité Document + * + * @author UnionFlow Team + * @version 3.0 + * @since 2025-01-29 + */ +@ApplicationScoped +public class DocumentRepository implements PanacheRepository { + + /** + * Trouve un document par son hash MD5 + * + * @param hashMd5 Hash MD5 + * @return Document ou Optional.empty() + */ + public Optional findByHashMd5(String hashMd5) { + return find("hashMd5 = ?1 AND actif = true", hashMd5).firstResultOptional(); + } + + /** + * Trouve un document par son hash SHA256 + * + * @param hashSha256 Hash SHA256 + * @return Document ou Optional.empty() + */ + public Optional findByHashSha256(String hashSha256) { + return find("hashSha256 = ?1 AND actif = true", hashSha256).firstResultOptional(); + } + + /** + * Trouve les documents par type + * + * @param type Type de document + * @return Liste des documents + */ + public List findByType(TypeDocument type) { + return find("typeDocument = ?1 AND actif = true ORDER BY dateCreation DESC", type).list(); + } + + /** + * Trouve tous les documents actifs + * + * @return Liste des documents actifs + */ + public List findAllActifs() { + return find("actif = true ORDER BY dateCreation DESC").list(); + } +} + diff --git a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/PieceJointeRepository.java b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/PieceJointeRepository.java new file mode 100644 index 0000000..6f06685 --- /dev/null +++ b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/PieceJointeRepository.java @@ -0,0 +1,89 @@ +package dev.lions.unionflow.server.repository; + +import dev.lions.unionflow.server.entity.PieceJointe; +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; +import java.util.List; +import java.util.UUID; + +/** + * Repository pour l'entité PieceJointe + * + * @author UnionFlow Team + * @version 3.0 + * @since 2025-01-29 + */ +@ApplicationScoped +public class PieceJointeRepository implements PanacheRepository { + + /** + * Trouve toutes les pièces jointes d'un document + * + * @param documentId ID du document + * @return Liste des pièces jointes + */ + public List findByDocumentId(UUID documentId) { + return find("document.id = ?1 ORDER BY ordre ASC", documentId).list(); + } + + /** + * Trouve toutes les pièces jointes d'un membre + * + * @param membreId ID du membre + * @return Liste des pièces jointes + */ + public List findByMembreId(UUID membreId) { + return find("membre.id = ?1 ORDER BY ordre ASC", membreId).list(); + } + + /** + * Trouve toutes les pièces jointes d'une organisation + * + * @param organisationId ID de l'organisation + * @return Liste des pièces jointes + */ + public List findByOrganisationId(UUID organisationId) { + return find("organisation.id = ?1 ORDER BY ordre ASC", organisationId).list(); + } + + /** + * Trouve toutes les pièces jointes d'une cotisation + * + * @param cotisationId ID de la cotisation + * @return Liste des pièces jointes + */ + public List findByCotisationId(UUID cotisationId) { + return find("cotisation.id = ?1 ORDER BY ordre ASC", cotisationId).list(); + } + + /** + * Trouve toutes les pièces jointes d'une adhésion + * + * @param adhesionId ID de l'adhésion + * @return Liste des pièces jointes + */ + public List findByAdhesionId(UUID adhesionId) { + return find("adhesion.id = ?1 ORDER BY ordre ASC", adhesionId).list(); + } + + /** + * Trouve toutes les pièces jointes d'une demande d'aide + * + * @param demandeAideId ID de la demande d'aide + * @return Liste des pièces jointes + */ + public List findByDemandeAideId(UUID demandeAideId) { + return find("demandeAide.id = ?1 ORDER BY ordre ASC", demandeAideId).list(); + } + + /** + * Trouve toutes les pièces jointes d'une transaction Wave + * + * @param transactionWaveId ID de la transaction Wave + * @return Liste des pièces jointes + */ + public List findByTransactionWaveId(UUID transactionWaveId) { + return find("transactionWave.id = ?1 ORDER BY ordre ASC", transactionWaveId).list(); + } +} +