-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(france-travail): add rendez-vous-partenaire api webhooks for participation v2 #2497
base: staging
Are you sure you want to change the base?
Conversation
…dv-insertion into feat/notify-france-travail-v2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merci @Holist pour cet énorme taff 🔥 👏 👏 🥇 💯 !!!
Tout est très cool, je t'ai posé quelques questions mais rien de très structurant.
when :update | ||
france_travail_client.update_participation(payload: payload) | ||
when :delete | ||
# Qui des delete pour raison RGPD dans 2 ans ? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bonne question à laquelle je n'ai pas de réponse 😄 !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@amaurydubot on y es pas encore mais je me suis posé la question de la suppression des rdvs concernés par la liaison FT dans 2 ans. Pour des questions rgpd on les supprimera chez nous, en l'état avec cette PR on enverra des webhooks de suppression chez FT mais peut être qu'ils préféreraient les garder eux ? (ou pas)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bien vu @Holist
Je vais poser la question mercredi à Julie lors de notre point (peut-être qu'ils les ignoreront ?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merci @Holist pour les changements 👍 !
Je t'ai laissé quelques questions et remarques.
around_destroy lambda { |participation, block| | ||
if participation.eligible_for_france_travail_webhook? | ||
OutgoingWebhooks::FranceTravail::ProcessParticipationJob.perform_later( | ||
participation_id: participation.id, timestamp: Time.current, event: :delete | ||
) | ||
end | ||
|
||
block.call | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je n'avais pas fait attention pendant ma première review mais on va avoir un problème ici: lorsque tu vas appeler Participation.find
dans le service la participation aura probablement déjà disparu. C'est pour ça que dans l'implémentation précédente le payload était généré ici avant le job.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bien vu pour ca effectivement....
Comme on a vu ensemble le plus propre pour éviter d'avoir des arguments conditionnés au delete uniquement dans un Job (ProcessParticipationJob
) qui faisait déjà beaucoup de choses c'est de partir sur une meilleure séparation des responsabilité (comme tu me l'avais suggéré initialement d'ailleurs ;) ) Je met en place des jobs spécifiques pour le create/l'update et le delete. C'est fait dans le dernier commit : 375c08c
def self.for_user(user) | ||
FranceTravailApi::BuildUserAuthenticatedHeaders.call(user: user).headers | ||
end | ||
|
||
def self.for_client | ||
access_token = FranceTravailApi::RetrieveAccessToken.call.access_token | ||
{ | ||
"Authorization" => "Bearer #{access_token}", | ||
"Content-Type" => "application/json" | ||
} | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
C'est très cool d'avoir présenté ça comme ça dans cette classe.
Malheureusement comme l'API de nos services est pas ouf, quand tu vas appeler ces méthodes depuis les services d'origine, il ne va rien se passer quand les services appelés par ces méthodes vont fail (ce qui risque d'arriver souvent malheureusement vu les API capricieuses de FT 😢 ).
Aujourd'hui le seul moyen d'appeler un service correctement depuis un autre service c'est la méthode call_service!
, je pense qu'on pourrait faire mieux. Mais du coup je pense que soit on trouve un moyen ici de gérer ça autrement que via la méthode call_service!
, soit au déplace l'appel de ces services dans les services directement.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bien vu merci pour ce rappel au sujet de call_service!
J'ai mis ca en place comme tu le suggére ici : 5539acf
345ef2e
to
d10d0e5
Compare
Close #2457
Suite du travail de @aminedhobb : #1876
Objectif
Faire en sorte d'envoyer les participations aux rdv à l'api
api_rendez-vous-partenairev1
de FT.Pour cela on a 3 étapes sur 3 endpoints différents :
1- Récupérer le jeton d'accès aux API FT. (on utilise notre
client_id
et notreclient_secret
). https://francetravail.io/produits-partages/documentation/utilisation-api-france-travail/generer-access-token2- Récupérer le jeton usager FT avec le jeton d'accès de l'étape 1 en utilisant comme informations, la date de naissance et le nir de l'usager. https://francetravail.io/produits-partages/catalogue/rechercher-usager/documentation#/api-reference/
3- Création/modification/Suppression des participations sur l'api
api_rendez-vous-partenairev1
en utilisant le jeton usager de l'étape 2 (et toujours le jeton d'accès de l'étape 1) https://francetravail.io/data/api/rechercher-usager/rdv-partenaire/documentation#/api-reference/Techniquement
L'implémentation est pensé de façon à ce qu'on puisse facilement ajouter d'autres endpoints vers d'autres API France Travail.
La synchronisation des participations des organisations FT se fait via les callbacks dans le concern
Participation::FranceTravailWebhooks
sur les organisations qui ont un code safir (on pourra étendre à d'autres si besoin).On appelle alors
OutgoingWebhooks::FranceTravail::ProcessParticipationJob
qui réutilise le système de job lock implémenté par Amine ici.Le job va utiliser le service
FranceTravailApi::ProcessParticipation
pour les appels à l'apiapi_rendez-vous-partenairev1
de FT.Dans le service en question on instancie
FranceTravailClient
qui recense les endpoints FT. C'est aussi ce client qui va générer les headers attendus par FT (avec le jeton usager si on en a besoin en passant un user en paramètre du client) via les servicesRetrieveAccessToken
,BuildUserAuthenticatedHeaders
etRetrieveUserToken
.Le payload des participations que s'attend à recevoir FT est défini dans
FranceTravail::ParticipationPayload
Lors de la création du rdv chez FT on récupére l'id de la participation du retour de l'api FT que l'on stocke dans un nouveau champ ajouté aux participations
france_travail_id
. On se sert ensuite de cette id pour les update des participation en l'incluant dans le payload envoyé à FT.TODO : Il faudra penser à déclencher manuellement les webhooks de création pour toutes les participations des organisations concernées pour récupérer les
france_travail_id
Je met en place la méthode
with_webhook_receipt
dans le moduleWebhook::ReceiptHandler
pour gérer la logique de skip (en cas de vieux webhook) et de création des receipts, ce module est utilisé par les webhook FT sortant définis ici et nos autres webhooks sortants.