Orchestrer l’import transactionnel d’une preuve #49
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Orchestrer l’import transactionnel d’une preuve
Objectif
Ajouter un service métier capable d’importer une preuve de bout en bout en combinant :
EvidenceRecord;Ce ticket doit produire une opération cohérente : après succès, la copie et la ligne SQLite existent toutes les deux ; après échec, aucune preuve partielle ne doit rester.
Contexte
Les briques suivantes existent désormais :
EvidenceRecord;EvidenceDao;Il manque maintenant le composant qui orchestre ces modules sans mélanger les responsabilités.
Périmètre
Créer :
Mettre à jour le
Makefile.API proposée
L’API peut être adaptée à l’architecture existante, mais les responsabilités doivent rester clairement séparées.
Propriété des objets
EvidenceImporteremprunte la connexionDatabase.Il ne doit jamais :
EvidenceRecordaprès le retour ;Après succès, le
EvidenceRecordretourné appartient à l’appelant.Après échec, aucun modèle ne doit être retourné.
Données générées
Identifiant
Chaque preuve doit recevoir un UUID généré avec une API GLib adaptée.
L’identifiant doit être valide selon :
Nom original
Le nom original doit provenir du dernier composant du chemin source.
Il doit être copié avant toute autre opération.
Nom interne
Le nom interne doit être indépendant du nom original afin d’éviter :
Format recommandé :
Exemple :
L’extension :
Le nom interne ne doit jamais contenir de séparateur de chemin.
Chemin relatif
Le chemin relatif enregistré dans
EvidenceRecorddoit être construit avec :Il doit rester relatif à la racine de l’enquête.
Le chemin absolu de copie et le chemin relatif SQLite ne doivent jamais être confondus.
Date d’import
La date d’import doit être générée en UTC au format strict :
La date doit être créée au moment de l’import, pas fournie par l’interface.
Déroulement de l’import
L’ordre attendu est :
imported_at;EvidenceRecord;EvidenceDao;Cohérence fichier/base
SQLite ne peut pas annuler automatiquement une copie de fichier.
Le service doit donc implémenter une compensation explicite.
Échec avant copie
Aucun nettoyage fichier n’est nécessaire.
Échec pendant copie
EvidenceCopydoit supprimer lui-même tout fichier partiel.Échec après copie mais avant insertion
Le fichier copié doit être supprimé.
Échec d’insertion SQLite
Le fichier copié doit être supprimé.
Échec du nettoyage
Si la suppression du fichier échoue :
Il est interdit de signaler un simple échec d’insertion tout en laissant silencieusement une copie non référencée.
Transaction SQLite
L’insertion doit être effectuée dans une transaction SQLite explicite.
Ordre recommandé :
EvidenceDao;En cas d’échec :
Le service ne doit pas démarrer une transaction si la connexion en possède déjà une.
Une transaction déjà active doit produire une erreur claire.
Validation de la requête
Refuser :
EvidenceImporterabsent ;.ou..;GErrordéjà initialisé.Les champs suivants sont facultatifs :
collected_at;source;description.Les chaînes facultatives composées uniquement d’espaces doivent être normalisées à
NULL, conformément au comportement deEvidenceRecord.Annulation
Le
GCancellableest facultatif.L’annulation doit être vérifiée :
Après la copie, toute annulation doit déclencher la suppression de la copie.
Une annulation ne doit jamais laisser :
Gestion des erreurs
Le service doit convertir les erreurs des sous-modules dans son propre domaine tout en conservant le contexte.
Exemples :
Les erreurs ne doivent pas être écrasées pendant le nettoyage.
Sécurité
Le service ne doit jamais :
sprintf()ou concaténation fragile.Utiliser les API GLib de construction et de normalisation des chemins.
Tests obligatoires
Import valide complet
Créer une enquête temporaire et un fichier source.
Vérifier :
EvidenceRecordretourné ;Import avec champs facultatifs absents
Vérifier que :
collected_atestNULL;sourceestNULL;descriptionestNULL.Fichier vide
Vérifier l’import d’un fichier vide.
Fichier binaire
Vérifier l’import d’un fichier contenant des octets nuls.
Nom original complexe
Tester un nom comprenant :
Le nom original doit être conservé dans le modèle.
Le nom interne doit rester sûr.
Extension absente
Vérifier que le nom interne reste valide sans extension.
Extension invalide
Tester une extension trop longue ou contenant des caractères inhabituels.
L’import doit réussir avec un nom interne sans extension ou avec une extension normalisée sûre.
Type inconnu
Vérifier :
Destination déjà existante
Forcer une collision sur le nom interne grâce à un crochet de test déterministe.
Vérifier :
Échec d’insertion SQLite
Simuler une erreur du DAO après la copie.
Exemples acceptables :
Vérifier :
EvidenceRecordretourné.Échec de commit
Prévoir un mécanisme de test déterministe.
Vérifier :
Annulation avant copie
Vérifier qu’aucune destination n’est créée.
Annulation après copie
Utiliser un crochet de test pour annuler juste après la réussite de
EvidenceCopy.Vérifier :
Échec de suppression compensatoire
Simuler un nettoyage impossible.
Vérifier que l’erreur finale signale explicitement le risque de fichier orphelin et contient son chemin.
Appels successifs
Importer plusieurs preuves distinctes avec la même instance.
Vérifier :
Transaction déjà active
Démarrer une transaction avant l’appel.
Vérifier :
Cohérence finale
Après chaque test d’échec :
Crochets réservés aux tests
Les scénarios suivants peuvent nécessiter des crochets internes :
Ils doivent être compilés uniquement avec une macro dédiée :
La version de production ne doit exposer ni état global modifiable ni API de test.
Intégration au Makefile
Ajouter la cible :
Elle doit compiler au minimum :
Ajouter le module aux sources du binaire principal.
Critères d’acceptation
Le ticket est validé lorsque :
git diff --checkne signale rien ;Commandes de validation
Test ciblé :
Valgrind :
Résultats indispensables :
Hors périmètre
Ce ticket ne doit pas encore :
BackgroundTask;Suite prévue
Le ticket suivant ajoutera l’interface GTK d’import de preuve et lancera ce service dans un
BackgroundTask, avec progression, annulation et affichage des erreurs.