Skip to content
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

Open
wants to merge 24 commits into
base: staging
Choose a base branch
from

Conversation

Holist
Copy link
Collaborator

@Holist Holist commented Nov 26, 2024

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 notre client_secret). https://francetravail.io/produits-partages/documentation/utilisation-api-france-travail/generer-access-token
2- 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'api api_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 services RetrieveAccessToken, BuildUserAuthenticatedHeaders et RetrieveUserToken.
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 module Webhook::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.

@Holist Holist self-assigned this Nov 26, 2024
@Holist Holist marked this pull request as ready for review November 27, 2024 11:58
Copy link
Collaborator

@aminedhobb aminedhobb left a 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.

app/services/concerns/webhooks/receipt_handler.rb Outdated Show resolved Hide resolved
app/models/france_travail/participation_payload.rb Outdated Show resolved Hide resolved
app/clients/france_travail_client.rb Outdated Show resolved Hide resolved
app/clients/france_travail_client.rb Show resolved Hide resolved
app/services/france_travail_api/retrieve_access_token.rb Outdated Show resolved Hide resolved
when :update
france_travail_client.update_participation(payload: payload)
when :delete
# Qui des delete pour raison RGPD dans 2 ans ?
Copy link
Collaborator

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 😄 !

Copy link
Collaborator Author

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)

Copy link
Collaborator

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 ?)

app/services/france_travail_api/process_participation.rb Outdated Show resolved Hide resolved
app/services/france_travail_api/process_participation.rb Outdated Show resolved Hide resolved
@Holist Holist requested a review from aminedhobb December 3, 2024 15:02
Copy link
Collaborator

@aminedhobb aminedhobb left a 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.

Comment on lines 19 to 27
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
}
Copy link
Collaborator

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.

Copy link
Collaborator Author

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

Comment on lines 2 to 12
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
Copy link
Collaborator

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.

Copy link
Collaborator Author

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

app/clients/france_travail_client.rb Show resolved Hide resolved
@Holist Holist force-pushed the feat/notify-france-travail-v2 branch from 345ef2e to d10d0e5 Compare December 5, 2024 17:48
@Holist Holist requested a review from aminedhobb December 6, 2024 08:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Interco] Réaliser les développements pour l'API rendez-vous
4 participants