EventLinx — synchronisation des événements Salesforce (Linx)

Module NestJS qui synchronise les événements Salesforce (objet Campaign) vers la table event_linx, et expose une API pour le front jeune et le back-office.

Flux de synchronisation

  1. Token OAuth2 : POST {LINX_BASE_URL}oauth2/token (grant_type=password + client_id, client_secret, username, password — LINX_PASSWORD = mot de passe + jeton de sécurité Salesforce concaténés).
  2. Fetch : GET {LINX_BASE_URL}data/v61.0/query/?q=<SOQL> avec bearer token. SOQL : Campaign filtré sur RecordTypeId = '012IV000002dcVhYAI', champs Id, Name, Categorie__c, StartDate, Physique_ou_Digital__c, RecordTypeId, Region_campagne__c, Ville__c, Lien_inscription__c, Publie_calendrier_jeunes__c.
  3. Réconciliation :
  4. création si nouvel idLinx
  5. mise à jour de tous les champs mappés si changement
  6. restore si event soft-deleted réapparu
  7. soft-delete si absent du fetch (uniquement si fetch réussi et non vide)
  8. événement sans StartDate ignoré (la colonne start_date est obligatoire) ; son Id reste dans le fetch pour ne pas le soft-delete
  9. Normalisation région : matching tolérant contre la liste canonique (Region.js), sinon valeur brute conservée.
  10. Visibilité calendrier (publie_calendrier_jeunes) : seuls les événements publiés (true) sont renvoyés aux jeunes, quel que soit leur programme.
  11. Lien d'inscription (url / Lien_inscription__c) : seuls les événements avec une URL non vide sont listés côté jeune (GET /event-linx) et back-office (GET /event-linx/admin).
  12. Visibilité jeune (endpoint GET /event-linx authentifié) :
  13. un jeune PNP voit uniquement les événements digitaux, dans toutes les régions ;
  14. un jeune PP voit les événements digitaux de toutes les régions ainsi que les événements présentiels de sa région (schoolRegion) et les événements nationaux ;
  15. un programme absent ou inconnu applique les règles PNP.

Affichage jeune (dashboard v2 + liste)

Le dashboard (/compte/jeune/dashboard/v2) et la page liste (/compte/jeune/dashboard/events) appellent le même endpoint avec les mêmes filtres de visibilité. Le dashboard affiche les 3 prochains événements à venir (tous mois confondus), du plus proche non passé au plus loin (sort=ASC). La page liste filtre par mois (month=YYYY-MM, mois courant par défaut) avec le même ordre.

Le titre affiché au jeune retire un tiret initial et une date JJ-MM-AAAA en fin de nom Salesforce (ex. - Atelier - 01-06-2027). La date reste dans le méta de la carte. Le back-office conserve le nom brut.

Champs mappés (Campaign → event_linx)

Salesforce Colonne BDD
Id id_linx
Name name
StartDate start_date
Region_campagne__c region (normalisée)
Lien_inscription__c url
Categorie__c thematique
Physique_ou_Digital__c format (Physique | Digital)
Ville__c ville
Publie_calendrier_jeunes__c publie_calendrier_jeunes

Endpoints

Méthode Route Auth Description
GET /event-linx JWT Liste paginée/filtrée des événements publiés à venir — filtres : thematique, format (presentiel → Physique, digital → Digital), name, month ; visibilité région/format selon le programme et la schoolRegion du jeune
GET /event-linx/regions JWT Régions distinctes en base
GET /event-linx/user?email= JWT + admin Events utilisateur (bruts Salesforce, non stockés)
POST /event-linx/sync JWT + admin Synchro manuelle