backend/src/domain/entities/document.rs
Description et Responsabilités
Le fichier document.rs définit l’entité de domaine Document dans le système KoproGo. Cette entité représente les documents de copropriété (proc
ès-verbaux, factures, contrats, règlements, devis, etc.) et leur gestion.
Responsabilités principales:
Représenter un document avec ses métadonnées (type, titre, taille, format)
Gérer le stockage de fichiers et leur localisation (file_path)
Lier les documents aux entités métier (meetings, expenses)
Valider les données lors de la création
Tracer l’origine des documents (uploaded_by)
Maintenir les métadonnées temporelles (création, mise à jour)
Contexte métier:
Dans une copropriété, de nombreux documents doivent être conservés et partagés avec les copropriétaires : procès-verbaux d’assemblées générales, bilans financiers, factures de travaux, contrats de prestation, règlements de copropriété, devis, etc. Ces documents doivent être organisés, accessibles, et liés aux événements et charges correspondants.
Énumérations
DocumentType
Signature:
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DocumentType {
MeetingMinutes,
FinancialStatement,
Invoice,
Contract,
Regulation,
WorksQuote,
Other,
}
Description:
Énumération représentant les différents types de documents de copropriété.
Variants:
Variant |
Description |
|---|---|
|
Procès-verbal d’assemblée générale (AGO, AGE) |
|
Bilan financier, comptabilité, états des comptes |
|
Facture de fournisseurs, prestataires |
|
Contrat de prestation (gardiennage, entretien, assurance) |
|
Règlement de copropriété, règlement intérieur |
|
Devis pour travaux |
|
Autre type de document non catégorisé |
Traits dérivés:
Debug: Affichage pour le débogageClone: Copie de la valeurSerialize/Deserialize: Sérialisation JSONPartialEq: Comparaison d’égalité
Structures et Types
Document
Signature:
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Document {
pub id: Uuid,
pub building_id: Uuid,
pub document_type: DocumentType,
pub title: String,
pub description: Option<String>,
pub file_path: String,
pub file_size: i64,
pub mime_type: String,
pub uploaded_by: Uuid,
pub related_meeting_id: Option<Uuid>,
pub related_expense_id: Option<Uuid>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
Description:
Structure représentant un document de copropriété avec toutes ses métadonnées et ses liens vers les entités associées.
Champs:
Champ |
Type |
Description |
|---|---|---|
|
|
Identifiant unique du document (UUID v4) |
|
|
Référence vers l’immeuble concerné |
|
|
Type de document (PV, facture, contrat, etc.) |
|
|
Titre du document (obligatoire, non vide) |
|
|
Description optionnelle du document |
|
|
Chemin d’accès au fichier (obligatoire, non vide) |
|
|
Taille du fichier en bytes (doit être > 0) |
|
|
Type MIME du fichier (ex: |
|
|
ID de l’utilisateur qui a téléversé le document |
|
|
Lien optionnel vers une assemblée générale |
|
|
Lien optionnel vers une charge/dépense |
|
|
Date et heure de création de l’enregistrement |
|
|
Date et heure de dernière mise à jour |
Méthodes
Document::new
Signature:
pub fn new(
building_id: Uuid,
document_type: DocumentType,
title: String,
description: Option<String>,
file_path: String,
file_size: i64,
mime_type: String,
uploaded_by: Uuid,
) -> Result<Self, String>
Description:
Constructeur pour créer une nouvelle instance de Document avec validation des données.
Comportement:
Valide que
titlen’est pas videValide que
file_pathn’est pas videValide que
file_sizeest strictement positif (> 0)Génère un nouvel UUID v4 pour
idInitialise
related_meeting_idetrelated_expense_idàNoneCapture le timestamp actuel UTC pour
created_atetupdated_atRetourne une instance Document si toutes les validations passent
Retourne une erreur descriptive si une validation échoue
Retour:
Ok(Document): Instance Document valide avec ID généré et timestampsErr(String): Message d’erreur descriptif si validation échoue
Erreurs possibles:
"Title cannot be empty": Le titre est vide"File path cannot be empty": Le chemin de fichier est vide"File size must be greater than 0": La taille est d 0
Document::link_to_meeting
Signature:
pub fn link_to_meeting(&mut self, meeting_id: Uuid)
Description:
Lie le document à une assemblée générale et met à jour le timestamp.
Document::link_to_expense
Signature:
pub fn link_to_expense(&mut self, expense_id: Uuid)
Description:
Lie le document à une charge/dépense et met à jour le timestamp.
Document::file_size_mb
Signature:
pub fn file_size_mb(&self) -> f64
Description:
Convertit et retourne la taille du fichier en mégaoctets (MB). Divise file_size (en bytes) par 1 048 576 (1024 × 1024).
Tests
Le fichier contient 3 tests unitaires:
test_create_document_success: Création réussie avec données validestest_create_document_empty_title_fails: Validation titre videtest_link_document_to_meeting: Lien vers assemblée
Fichiers Associés
backend/src/domain/entities/document.rs CE FICHIER
backend/src/application/dto/document_dto.rs
backend/src/application/ports/document_repository.rs
backend/src/infrastructure/repositories/postgres_document_repository.rs
backend/src/web/handlers/documents.rs