sync_cartes_visite_v1.md
2151 octets
Sync cartes de visite (images) — v1
Date : 2026-07-23
Dépôts : Projectiaon (serveur) + EBII_mobileVCF / Card2vcf (client)
Statut : implémenté
Objectif
À la sync, pousser/tirer non seulement le contact texte, mais aussi l’image de carte de visite (et la photo de profil) déjà gérées côté Projectiaon via Contact.carte_visite / Contact.photo.
Contexte
La sync CRM v1 excluait explicitement les « médias serveur ». L’upload image n’existait qu’en session web (POST /contacts/:id/carte), inutilisable par Card2vcf (Bearer).
API serveur (Bearer)
| Méthode | Route | Rôle |
|---|---|---|
POST | /api/contacts/:id/carte | multipart → carte_visite |
GET | /api/contacts/:id/carte | sert le fichier |
POST | /api/contacts/:id/photo | multipart → photo |
GET | /api/contacts/:id/photo | sert la photo |
- Auth : même garde Bearer que le reste de
/api - Validation : png/jpg/jpeg/webp/gif, max 5 Mo (
medias::enregistrer_upload) - POST :
200+ JSONContact(avecmis_a_jour_lemis à jour) - Routes web
/contacts/:id/carte|photoinchangées (session)
Client Card2vcf
- Push : après
create/updatecontact JSON réussi, uploadcard.jpg/profile.jpgsi présents. - Retry : échec upload → SyncOp
contact_media(ne re-crée pas le contact). - Rotation :
rotateCardImageenqueue un update contact pour re-pousser l’image. - Pull : si DTO a
carte_visite/photoet (fichier local absent ou serveur plus récent),GET+ContactImageStore.saveBytes. Skip si SyncOp contact/média pending.
Hors scope
- Fichier
.vcfen pièce jointe - Champ
PHOTOdans l’export VCF - Sync des champs locaux non mappés (
website,address, …)
Tests
- Projectiaon :
tests/api_contacts_media_http.rs - Card2vcf :
AilianceApiClientTest(multipart/download),SyncEngineTest(push image, retry, pull)
Critères de succès
- Scan + sync → vignette carte visible dans l’UI web Projectiaon
- 2ᵉ appareil / réinstall → pull récupère contact +
card.jpg - Routes web inchangées
GitRust