Repository navigation
[Refactor] M11-05 — Découper services & composants métier #185
Description
Activity
- addedrefactorRefactoring sans changement de comportementRefactoring sans changement de comportementpriority-mediumPriorité normalePriorité normaleepic/collectionAjout & collectionAjout & collectionepic/backupExport / ImportExport / Importsize/mMoyenne (≤ 1 j)Moyenne (≤ 1 j)
on Sep 7, 2026 Points relayés depuis la revue complète du code (#183, PR #193 mergée) — 3 à traiter en priorité (criticité Élevée) :
backup-service.ts:399-407(Élevée) : round-trip CSV — une édition sans exemplaire émet des lignes vides réimportées en exemplaire fantôme daté d'aujourd'hui (dump ≠ restore).backup-service.ts:285-312(Élevée) : import CSV — fusion par clépublication::issueNumber: perte deedition/language/condition, collapse des éditions àissueNumbernull.migrations.ts:26-31(Élevée) : migrations hors transaction — un échec partiel laisse du DDL appliqué avecuser_versioninchangé (relance bloquante).
Puis, à intégrer au découpage :
use-collection-store.ts:88-98(Moyenne) :addMagazine=create()+addCopy()hors transaction ⇒ édition orpheline possible.magazine-repository.ts:136(Moyenne) :LIKEsans échappement de%/_(recherche%⇒ tout le catalogue).backup-service.ts:443+native-file-gateway.ts:70(Moyenne) : aucune borne de taille d'import (parse 2× du fichier en mémoire).scanBarcode.ts:83-88(Moyenne) : code 10 chiffres à checksum ISBN-10 invalide rejetéinvalid(codes CODE39/ITF longs bloqués) — la doc annonce un repli GENERIC.result.tsx+search.tsx(Moyenne) :resolved/owned/handleAddCopy+ stylesownedText/absentTextdupliqués.barcode.tsx/camera.tsx/form-barcode.tsx(Moyenne, partagé avec [Refactor] M11-04 — Découper les gros écrans (camera.tsx 830, barcode.tsx 551) #184) : styles caméra dupliqués._layout.tsx:25-31+collection/index.tsx:100-106(Mineure) : calcul de la liste d'éditions dupliqué.backup-service.ts(Mineures) :\rCRLF dans les champs CSV quotés ; contrôles JSON/CSV asymétriques (issueNumberfractionnaire accepté en JSON) ;dateAdded/exportedAtnon validés ;created_at/updated_atnon exportés (historique perdu à la restauration).magazine-repository.ts:101(Mineure) :lower()SQLite = repli ASCII (accents) — prétraiter en JS.
Rapport complet : commentaire sur #183.
Compléments relayés par la passe de validation complémentaire de #183 (2ᵉ revue exhaustive) :
Élevées
- Erreurs non interceptées dans les flux scan/ajout/suppression — aucune surface d'erreur ni état de reprise (UI bloquée « Recherche… ») :
scan/search.tsx:58-75(search()sanstry/finally),scan/barcode.tsx:99-115,scan/camera.tsx:95-173(intervalle try/finally sans catch, rejet relancé toutes les 500 ms),result.tsx:49-52,search.tsx:101,barcode.tsx:82,127,collection/[id]/index.tsx:44,55. Prévoir surface d'erreur + retry dansidentificationService/callers. - Échec d'init DB permanent + écran vide :
dependencies.ts:41-44+_layout.tsx:33-42(affecté aussi à [Refactor] M11-04 — Découper les gros écrans (camera.tsx 830, barcode.tsx 551) #184).
Moyennes
3.findByPublicationAndIssuerenvoie la variante arbitraire (la plus ancienne) quand(publication, issue_number)est dupliqué (légal depuis v4) → identification OCR liée à la mauvaise édition (FR vs BE, autre barcode) — rendre le choix déterministe et visible.
4. Ids d'éditions dupliqués en JSON : passentvalidateCollectionpuis font échouer toute la restauration (violation PK après résumé « n éditions ») — rejeter en validation (InvalidBackupError).
5.created_at/h historique : déjà relayé, ré-évalué Moyenne (la date « Ajouté le » de toutes les éditions devient la date de restauration).Mineures (ici)
6.asCsvString(backup-service.ts:236-239) : valeur renvoyée non trimmée (barcode avec espaces persisté) — cohérence avec la sémantique trim utilisée ailleurs.
7. Parser CSV :\rnu hors guillemets perdu (L222-225).
8. Regex ISBN-10/^[0-9X]{10}$/:Xaccepté à toute position (L83).
9. TriORDER BY publicationen collation BINARY (casse) +lower()ASCII uniquement (L101).Contexte complet : commentaire de validation sur #183.
- Erreurs non interceptées dans les flux scan/ajout/suppression — aucune surface d'erreur ni état de reprise (UI bloquée « Recherche… ») :
- added 4 commits that reference this issue
on Sep 8, 2026 ✅ Correctifs #185 livrés (PR #197, merge
355697e)Tous les points de revue #183/PR #193 sont traités :
Base de données
- E3 : chaque migration est transactionnelle (
BEGIN→ DDL →user_version→COMMIT,ROLLBACK+ relance en cas d'échec) + tests (migrations.test.ts). - M1 :
addMagazineatomique viacreateWithCopy(magazine + exemplaire dans une transaction). - M2 : recherche réécrite en JS — insensible aux accents/casse,
%/_littéraux, tri déterministe (localeCompare'fr').
Backup
- E1 : plus de copie fantôme à l'import CSV si
copyNotesetdateAddedsont vides. - E2 : l'édition
publication::issueNumber::edition::language::conditionpréserve les variantes (Édition n° vs n° simple) et corrige le collapse desissueNumbernuls. - M9 : rejet des IDs dupliqués, issueNumber fractionnaire, dates non-ISO.
- M3 : import plafonné à 25 Mo (service + sélecteur de fichier).
- M10 :
created_at/updated_atexportés/importés (JSON + CSV rétro-compatible). - Mineures : trim des champs texte, CRLF/retour-chariot seul gérés.
Scan
- M4 : ISBN-10
Xtoléré en dernière position uniquement, 10 chiffres à checksum invalide →GENERIC. - M5 : mutex résolu/possédé et styles de statut dédupliqués via
useScanResult(partagé result/search) ; stylesownedText/absentTextmutualisés. - M8 :
findByPublicationAndIssueconfirmé déterministe + test du choix de la plus ancienne.
Vérifié : 458 tests OK, couverture 100 % backup/identification, CI Quality verte.
M6 (styles caméra) reste partagé avec #184 — traité sur sa branche.
- E3 : chaque migration est transactionnelle (
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Objectif
Responsabilités claires, effets de bord isolés, composants maintenables.
Périmètre
Livrables