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

Harmonisation des doublons usagers suspectés #1284

Merged
merged 5 commits into from Apr 13, 2021

Conversation

adipasquale
Copy link
Contributor

@adipasquale adipasquale commented Mar 29, 2021

Ceci est une grosse PR, elle m'a pris un long moment et beaucoup d'allers-retours. Le code n'est pas encore parfait, mais ça va dans la bonne direction par rapport à aujourd'hui je pense.

Contexte

Un usager peut-être créé de plusieurs manières :

  • inscription par l'usager normale
  • inscription par l'usager avec FranceConnect
  • création par un agent depuis le formulaire usager
  • création par un agent depuis la modale dans le tunnel RDV
  • création par un agent depuis l'API

Il y a différents cas d'usagers doublons que l'on veut gérer :

  • sur base de l'email : interdits strictements partout
  • sur base du numéro de téléphone : plus souple
  • sur base de l'identité (nom prénom date de naissance) : plus souple

Lorsqu'un doublon est détecté on veut réagir différement selon le chemin emprunté :

  • depuis l'admin, on veut pouvoir avertir des suspicions contournables, et on veut aussi pouvoir offrir des actions contextuelles : "aller modifier l'usager suspect plutôt qu'en créer un nouveau", "Choisir cet usager pour le RDV courant plutôt que d'en créer un nouveau" et enfin "associer cet usager suspect existant dans une autre orga à l'orga courante plutôt que d'en créer un nouveau"
  • depuis les autres chemins, on veut pour l'instant uniquement respecter les interdictions strictes (càd uniquement sur base de l'email aujourd'hui). On n'inclut pas d'infos sur les avertissements contournables dans l'API, l'inscription via FC ni l'inscription normale des usagers.

Enfin, il faut aussi prendre en compte les chemins de mise à jour, dans lesquels on veut réagir de la même manière mais uniquement en cas de modification des champs menant à l'apparition du doublon. On ne veut pas ré-alerter de la présence d'un doublon sur base du numéro de téléphone si l'agent vient de changer l'adresse par ex.

cf screenshots tout en bas pour avoir une idée visuelle

Objectifs de cette PR

Changements fonctionnels

  • Aujourd'hui les doublons sur base de l'identité sont strictement interdits, ce qui ne me paraît pas correct (c'est d'ailleurs ce qu'on veut explicitement autoriser pour réparer le bug FC cf reparer reconciliation sur email pour FranceConnect #1237) . Je transforme donc cette interdiction stricte en avertissement contournable côté admin, et en autorisation silencieuse pour les autres chemins (inscription usagers, API, FranceConnect) ...
  • Aujourd'hui tous les doublons sont interdits coté inscription usagers, sur base de l'email, du numéro de tel et de l'identité. C'est à mon avis un side effect innattendu plus qu'un choix. Je change ça pour que les inscriptions usagers ne respectent plus que les règles strictes (càd l'email uniquement)

Refactorings code

Form Object Admin::UserForm

introduction d'un Form Object Admin::UserForm dont le rôle est de rajouter des validations et warnings sur la création et update d'User, uniquement depuis les formulaires web de l'admin.

Ces validations et warnings étaient jusqu'ici faites dans le modèle User, ce qui ne permettait pas de se comporter différement selon le chemin emprunté.

Mon utilisation idéale d'un Form Object (FO) serait qu'il remplace complètement l'AR record qu'il wrappe dans le contrôleur et la vue, que l'on puisse faire simple_form_for(user_form), user_form.save, afficher les warnings du FO plutot que du record. Malheureusement ça ne se comporte pas très bien avec simple_form, principalement parce qu'il ne reconnaît pas bien les associations, même en déléguant bien du FO vers le record. Je fais donc un usage un peu hybride des deux objets, ce qui n'est pas très agréable :/

À cause de cette remarque précédente, ce FO rajoute des erreurs et des warnings sur le record (plutôt que d'avoir ses propres warnings et erreurs, et de les fusionner avec ceux du record). En plus, on fait un truc un peu hacky avec le active_warnings_confirm_decision qui vient de la gem activemodel-caution : il faut bien qu'il soit setté au niveau des params du FO et pas de ceux du record, car il faut le mettre au même niveau que l'appel à caution 😓 tricky

Contrôleur admin/users_controler

  • on remplace les instanciations de user par des instanciations du UserForm
  • on doit passer des view_locals qui vont être utilisées dans la génération des messages interactifs d'erreurs et de warnings. Ce n'est pas très agréable mais je n'ai pas d'autre solution en tête.
  • on peut remplacer les manips custom avec skip_duplicate_warnings par le passage au bon niveau du active_warnings_confirm_decision qui vient de la gem activemodel-caution

Modèle User

beaucoup de nettoyage de vilaines méthodes :)

Screenshots

(après modifications décrites dans cette PR)

Screenshot avant après refacto pour utiliser le système d'avertissements générique

avant-après

Screenshots admin/users#new meme orga

user-create-1

Screenshots admin/users#new different orga

create-user-2

Screenshots dans le tunnel RDV

rdv-tunnel-1

@adipasquale adipasquale force-pushed the refactor/duplicate-user-service branch 4 times, most recently from a3a5524 to 9f4ce4f Compare April 7, 2021 10:25
@adipasquale adipasquale force-pushed the refactor/duplicate-user-service branch 5 times, most recently from 5cd4860 to 4a314b6 Compare April 7, 2021 15:57
@adipasquale adipasquale changed the title WIP refacto DuplicateUserFinder Harmonisation de la manière d'afficher les usagers doublons suspectés Apr 8, 2021
@adipasquale adipasquale changed the title Harmonisation de la manière d'afficher les usagers doublons suspectés Harmonisation des suspects de doublons usagers Apr 8, 2021
@adipasquale adipasquale changed the title Harmonisation des suspects de doublons usagers Harmonisation des doublons usagers suspectés Apr 8, 2021
@adipasquale adipasquale force-pushed the refactor/duplicate-user-service branch 4 times, most recently from b64e30f to 3822f22 Compare April 8, 2021 11:43
app/controllers/admin/users_controller.rb Outdated Show resolved Hide resolved
app/models/user.rb Show resolved Hide resolved
app/views/admin/users/_form.html.slim Show resolved Hide resolved
@adipasquale adipasquale marked this pull request as ready for review April 8, 2021 11:55
Copy link
Contributor

@n-b n-b left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(notes pour moi)

app/controllers/admin/users_controller.rb Outdated Show resolved Hide resolved
app/models/user.rb Show resolved Hide resolved
app/views/admin/users/_form.html.slim Show resolved Hide resolved
app/controllers/admin/users_controller.rb Outdated Show resolved Hide resolved
app/form_models/admin/user_form.rb Show resolved Hide resolved
app/form_models/admin/user_form.rb Show resolved Hide resolved
app/form_models/admin/user_form.rb Show resolved Hide resolved
@n-b n-b force-pushed the refactor/duplicate-user-service branch from 3822f22 to e1833c1 Compare April 12, 2021 14:00
@n-b n-b changed the title Harmonisation des doublons usagers suspectés Refactor des doublons usagers Apr 12, 2021
@n-b n-b changed the title Refactor des doublons usagers Refactor des doublons Apr 12, 2021
Copy link
Contributor

@n-b n-b left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yaf Sinon c’est bon pour moi. J’ai l’impression que la modale nous coûte assez cher en complexité du code, mais c’est pas l’objet ici.

Je veux bien que tu jettes un coup d’œil rapide :)

app/controllers/admin/users_controller.rb Show resolved Hide resolved
@yaf
Copy link
Contributor

yaf commented Apr 12, 2021

Je vais prendre un peu le temps de faire quelques tests si c'est ok pour toi d'attendre un peu.

@n-b n-b changed the title Refactor des doublons Harmonisation des doublons usagers suspectés Apr 12, 2021
Copy link
Contributor

@yaf yaf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il y a une erreur 500 lorsque je pose un rendez-vous depuis l'agenda
https://sentry.io/organizations/rdv-solidarites/issues/2178934294/?project=1811205&referrer=RegressionActivityEmail

Bizarre d'ailleurs de ne pas avoir un test qui claque ici du coup 🤔 S'il y a bien un truc qui est sur le chemin critique, c'est bien poser un rendez-vous sur l'agenda :)

@n-b
Copy link
Contributor

n-b commented Apr 13, 2021

Mm, je vois la 500 sur la review app mais pas en local. (Au moins ça explique pourquoi les tests n’échouent pas.)

@yaf
Copy link
Contributor

yaf commented Apr 13, 2021

Ah oui. Ok, c'est peut-être lié à une migration ou une donnée inconsistante alors 🤔

Copy link
Contributor

@yaf yaf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça fait du bien ce petit nettoyage.

Je ne suis pas à l'aise avec cette histoire de modal. Mais je crois que pour s'en passer nous avons besoin de réfléchir un peu en termes de design

Pour l'usage des FormObjects, je ne suis pas encore pleinement convaincu, mais je n'ai pas non plus d'argument contre. Je suis prêt à essayer encore un peu :)

@n-b n-b enabled auto-merge (squash) April 13, 2021 13:41
@n-b n-b merged commit 6dcda87 into master Apr 13, 2021
@n-b n-b deleted the refactor/duplicate-user-service branch April 13, 2021 13:45
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.

None yet

3 participants