feat: PHASE 5.2 - Repositories et DTOs Documentaires

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
This commit is contained in:
dahoud
2025-11-30 11:30:33 +00:00
parent 4b78c173ca
commit bf994ccbea
4 changed files with 262 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<Document> {
/**
* Trouve un document par son hash MD5
*
* @param hashMd5 Hash MD5
* @return Document ou Optional.empty()
*/
public Optional<Document> 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<Document> 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<Document> 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<Document> findAllActifs() {
return find("actif = true ORDER BY dateCreation DESC").list();
}
}

View File

@@ -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<PieceJointe> {
/**
* Trouve toutes les pièces jointes d'un document
*
* @param documentId ID du document
* @return Liste des pièces jointes
*/
public List<PieceJointe> 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<PieceJointe> 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<PieceJointe> 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<PieceJointe> 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<PieceJointe> 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<PieceJointe> 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<PieceJointe> findByTransactionWaveId(UUID transactionWaveId) {
return find("transactionWave.id = ?1 ORDER BY ordre ASC", transactionWaveId).list();
}
}