lonestone / rolebase.io

MIT License
18 stars 2 forks source link

Bug : Les étapes de réunions sont parfois dupliquées #116

Closed mguerin-actinvision closed 10 months ago

mguerin-actinvision commented 11 months ago

Bonjour, Nous avons déployé rolebase sur nhost, nous sommes en train de faire les premières réunions en live. Dans l'ensemble, tout se déroule bien, mais nous avons remarqué un problème.

Les sujets liés à la réunion avaient disparu de l'affichage, je me suis aperçu que certaines étapes de réunions avait été dupliqués.

Lorsque j'exécute la requête suivante dans Hasura, j'obtiens des lignes en résultat (ce qui signifie que certaines de nos réunions ont plusieurs étapes partageant le même "stepConfigId") : SELECT * FROM (SELECT ms."stepConfigId", ms.type, count(*) as "recordsNumber", ms."meetingId" FROM meeting_step as ms GROUP BY ms."stepConfigId", ms."meetingId", ms.type) as tmp LEFT JOIN meeting as m on m.id = tmp."meetingId" WHERE tmp."recordsNumber" > 1

Avez-vous également obtenu le même résultat ? Je n'ai pas réussi à reproduire le problème, mais il semble exister dans deux de nos réunions. Auriez-vous des idées sur la façon dont ce résultat pourrait se produire ?

Merci à l'avance pour votre aide. N'hésitez pas à me demander des informations supplémentaires si nécessaire.

Godefroy commented 10 months ago

Le plus probable c'est que 2 personnes aient ouvert exactement au même moment la réunion pour la 1ère fois, et comme le front est en charge de crée les étapes, les 2 ont créé les étapes en même temps.

Il n'y a pas de contrainte d'unicité sur le couple (meetingId, stepConfigId) dans la table meeting_step, mais je ne vois pas ce qui empêcherait d'en mettre une.

Godefroy commented 10 months ago

J'ai ajouté une clé d'unicité à la table pour éviter le problème. Il est possible qu'il reste une double requête côté front, mais je n'ai pas réussi à reproduire le problème.

Avant d'appliquer la dernière migration, il faut supprimer les duplicats de la table meeting_step.

On peut les supprimer avec une requête comme ça :

WITH DuplicateRows AS (
    SELECT "id",
           ROW_NUMBER() OVER (PARTITION BY "meetingId", "stepConfigId" ORDER BY "id") AS rn
    FROM "meeting_step"
)

DELETE FROM "meeting_step"
WHERE "id" IN (
    SELECT "id" FROM DuplicateRows WHERE rn > 1
);

⚠️ Faites un backup avant et vérifiez que la requête vous convient. Il se peut que ce ne soit pas les duplicats souhaités qui soient supprimés.