Skip to content

feat: salons des communautés, lus en direct, avec leur salle d'appel (API et contrat) (#155) - #184

Merged
rev22rse22 merged 1 commit into
mainfrom
155-salons
Nov 14, 2026
Merged

rev22rse22 merged 1 commit into
mainfrom
155-salons

Conversation

@rev22rse22

Copy link
Copy Markdown
Collaborator

Première moitié des salons (#155) : le contrat et l'API. Les écrans suivent dans une seconde PR, contre ce contrat.

Ce qui a été fait

  • contracts/communautes.yaml v0.2 :
    • GET /api/communautes/{slug}/salons ;
    • GET /api/communautes/{slug}/salons/{salon}/messages?apres=… ;
    • POST /api/communautes/{slug}/salons/{salon}/messages.
  • En direct sans WebSocket : le front relit toutes les 3 secondes avec apres (le numero du dernier message reçu). La réponse est no-store. Rien de plus à héberger derrière le proxy de DataCloud.
  • Migration V20261114_1812__salons.sql (horodatée, docs/equipe.md) : tables salon et message_salon, trois salons dans chaque communauté (general, entraide, projets).
  • Appels : chaque salon a sa salle Jitsi, APPELS_URL (par défaut https://meet.jit.si) + jamii-<communauté>-<salon>-<12 caractères aléatoires>. L'adresse n'est donnée qu'aux membres (appelUrl: null sinon). Choix expliqué dans Module · Communautés façon Discord : salons, appels vocaux et vidéo (@rev22rse22) #155.
  • Droits et abus : lire demande d'être connecté, écrire demande d'être membre (403 pas_membre). Texte brut de 1 à 2 000 caractères, 20 messages par minute (429 avec Retry-After).
  • Données personnelles : les messages d'un compte sont dans son export (communautes.messagesSalons) et sont supprimés avec lui.
  • Types du front regénérés (api:types).

Comment c'est vérifié

  • tests (PostgreSQL réel) : SalonsTest 7/7 :
    • trois salons de départ, dans l'ordre ;
    • appelUrl réservé aux membres ;
    • écrire, lire, relire seulement les nouveaux ;
    • non-membre 403 ; texte vide ou trop long 400 ; sans CSRF 403 ;
    • salon ou communauté inconnus 404 ; paramètres invalides 400 ;
    • limite de 20 par minute ;
    • export et suppression.
  • CommunautesTest 11/11, MesDonneesTest 12/12, ModulesTest vert. vue-tsc OK avec les types regénérés.

Décisions et alternatives écartées

  • Relecture toutes les 3 s plutôt que WebSocket ou SSE : aucune infrastructure de plus, et ça tient la démo (quelques personnes). Pour beaucoup de monde, SSE ou WebSocket après la CADEV.
  • Messages supprimés avec le compte (et non gardés sans auteur comme les réponses) : une discussion en direct n'a pas de valeur de référence, on garde le moins de données possible.
  • Jitsi par lien plutôt que LiveKit sur DataCloud pour l'instant : rien à héberger avant dimanche 8 h GMT (voir Module · Communautés façon Discord : salons, appels vocaux et vidéo (@rev22rse22) #155).

Pistes d'amélioration

  • 🔴 Risque : sur meet.jit.si, le premier arrivé doit se connecter (Google, GitHub ou Facebook) pour ouvrir la salle. La personne qui présente le fait avant la démo.
  • 🟡 À améliorer ensuite : une communauté créée plus tard n'aura pas de salons (aucune route ne crée de communauté aujourd'hui). Le signalement des messages des salons.
  • 💡 Idée : les demandes publiées par le module freelance (DemandePubliee, @sowibrr) dans #projets.

Outils d'IA utilisés : Claude Code (Claude Opus 5.5).

🤖 Generated with Claude Code

…(API et contrat) (#155)

- contracts/communautes.yaml v0.2 : GET .../salons, GET et POST .../salons/{salon}/messages.
  Le front relit les nouveaux messages toutes les 3 secondes (`apres`), sans WebSocket.
- Trois salons par communauté (général, entraide, projets). L'adresse de l'appel (Jitsi, APPELS_URL)
  n'est donnée qu'aux membres, avec un suffixe aléatoire.
- Écrire : membres seulement, 20 messages par minute. Les messages sont dans l'export du compte
  et partent avec lui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rev22rse22
rev22rse22 merged commit 087d131 into main Nov 14, 2026
7 checks passed
@rev22rse22
rev22rse22 deleted the 155-salons branch November 14, 2026 18:20
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.

1 participant