Skip to content

Les réunions de l'association, et la présence annoncée - #45

Merged
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu
Sep 10, 2026
Merged

Les réunions de l'association, et la présence annoncée#45
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu

Conversation

@flocom

@flocom flocom commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Une réunion de bureau, un conseil, une assemblée générale : ce sont des événements de l'association, mais pas des manifestations. Elles vivent donc dans les événements, avec un type qui les distingue, et trois différences qui comptent.

Elles ne sortent jamais sur le site public

C'est la contrainte qui commande tout le reste. La table events alimente la page d'accueil publique, et chaque événement porte un shareToken qui ouvre /inscription/[token] sans authentification. Une réunion publiée par inadvertance aurait affiché son ordre du jour et l'adresse d'un domicile sur Internet.

Deux verrous ferment ce chemin, tous deux portés par les requêtes et non par les pages, pour qu'un futur appelant en hérite sans y penser :

Chemin Verrou
getUpcomingPublishedEvents() — accueil public, page Rejoindre filtre kind = 'event'
getEventByShareToken() — page publique d'un événement filtre kind = 'event' : le jeton d'une réunion n'ouvre rien

Testé avec une réunion volontairement publiée, portant une adresse de domicile et un ordre du jour : zéro occurrence sur /, sur /rejoindre et sur son propre jeton de partage, qui répond « Lien d'inscription indisponible ». Les liens des vrais événements continuent de fonctionner.

Elles se voient avant les manifestations

  • Bandeau en tête du tableau de bord : la prochaine réunion, sa date, son lieu, le nombre de présents annoncés, et les trois boutons de réponse à même le bandeau.
  • Section colorée en haut de la liste des événements, avant « À venir ».
  • L'indicateur « Événements à venir » ne les compte pas : elles ont leur propre place.

Elles se répondent

Trois réponses — je serai là / peut-être / je ne peux pas — parce qu'un parent qui ne sait pas encore n'est ni un présent ni un absent, et qu'une assemblée générale se prépare avec des chiffres honnêtes. Une réponse par personne (contrainte d'unicité en base), modifiable, retirable en recliquant dessus. L'onglet « Bénévoles » d'une réunion devient « Présences » et liste qui vient, qui hésite et qui s'excuse.

Répondre exige une session : on répond pour soi, jamais au nom d'un autre. La route refuse aussi de noter une présence sur un événement ordinaire — là, ce sont les créneaux de bénévoles.

Côté saisie

Le formulaire d'événement s'ouvre sur un choix en deux cartes (un événement / une réunion). En mode réunion, la billetterie et la description publique disparaissent — sans objet — et le sous-titre rappelle que rien n'ira sur le site public.

Vérifications

Contrôle Résultat
Fuite publique (réunion publiée) 0 occurrence sur les 3 chemins publics
Jeton de partage d'une réunion « Lien d'inscription indisponible »
Jeton d'un événement inchangé, page complète
Bandeau du tableau de bord affiché, titre et lieu corrects
Réponse depuis le bandeau compteur passe à « 1 présent annoncé », puis « 0 présent · 1 peut-être » sans rechargement
Onglets d'une réunion Aperçu / Préparation / Présences (le compteur suit les présents)
Liste des événements section « Réunions à venir » placée avant les manifestations
Formulaire en mode réunion billetterie masquée, mention publique affichée
Indicateur « Événements à venir » 3 — la réunion n'y est pas comptée

Migration 0019_meetings : colonne events.kind (défaut event, donc tout l'existant reste un événement) et table meeting_attendance.

🤖 Generated with Claude Code

https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD


Generated by Claude Code

Une réunion de bureau, un conseil, une assemblée générale : ce sont des
événements de l'association, mais pas des manifestations. Elles vivent
donc dans les événements, avec un type qui les distingue, et trois
différences qui comptent.

Elles ne sortent jamais sur le site public. C'est la contrainte qui
commande tout le reste : la table des événements alimente la page
d'accueil publique, et chaque événement porte un jeton de partage qui
ouvre une page sans authentification. Une réunion publiée par
inadvertance aurait affiché son ordre du jour et l'adresse d'un domicile
sur Internet. Deux verrous ferment ce chemin, tous deux portés par les
requêtes et non par les pages, pour qu'un futur appelant en hérite sans
y penser : les événements publiés à venir sont filtrés sur le type, et la
lecture par jeton de partage refuse les réunions. Une réunion publiée
répond « lien indisponible » sur son propre jeton.

Elles se voient avant les manifestations. Un bandeau les annonce en tête
du tableau de bord, avec la réponse de présence à même le bandeau, et une
section colorée les place en haut de la liste des événements.

Elles se répondent. Trois réponses — je serai là, peut-être, je ne peux
pas — parce qu'un parent qui ne sait pas encore n'est ni un présent ni un
absent, et qu'une assemblée générale se prépare avec des chiffres
honnêtes. Une réponse par personne, modifiable, retirable en recliquant.
L'onglet « Bénévoles » d'une réunion devient « Présences » et liste qui
vient, qui hésite et qui s'excuse.

Le formulaire masque ce qui n'a pas de sens pour une réunion : la
billetterie et la description publique disparaissent, et le sous-titre
rappelle que rien n'ira sur le site public.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
@flocom
flocom merged commit bccb599 into main Sep 10, 2026
1 check passed
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.

2 participants