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éthodeRouteRôle
POST/api/contacts/:id/cartemultipart → carte_visite
GET/api/contacts/:id/cartesert le fichier
POST/api/contacts/:id/photomultipart → photo
GET/api/contacts/:id/photosert 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 + JSON Contact (avec mis_a_jour_le mis à jour)
  • Routes web /contacts/:id/carte|photo inchangées (session)

Client Card2vcf

  1. Push : après create/update contact JSON réussi, upload card.jpg / profile.jpg si présents.
  2. Retry : échec upload → SyncOp contact_media (ne re-crée pas le contact).
  3. Rotation : rotateCardImage enqueue un update contact pour re-pousser l’image.
  4. Pull : si DTO a carte_visite/photo et (fichier local absent ou serveur plus récent), GET + ContactImageStore.saveBytes. Skip si SyncOp contact/média pending.

Hors scope

  • Fichier .vcf en pièce jointe
  • Champ PHOTO dans 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

  1. Scan + sync → vignette carte visible dans l’UI web Projectiaon
  2. 2ᵉ appareil / réinstall → pull récupère contact + card.jpg
  3. Routes web inchangées