DOC
Accueil/ Projets/ MJY Task Platform/ Tâches techniques - Sprint 05 (Refonte de l'authentification par utilisateur)

Tâches techniques - Sprint 05 (Refonte de l'authentification par utilisateur)

Ce document décompose les stories du Sprint Backlog 05 en tâches techniques. Cible : Supabase Auth natif (auth.users + bcrypt), rôles super_manager/manager/employee, pivot project_members, avec les trois parcours connexion / inscription / changement de PIN pour chaque utilisateur.


✅ Avancement au 08/07/2026 (backend validé)

Socle base de données terminé et vérifié (scripts npm run test:login + npm run test:workflow verts) :

  • Nettoyage + schéma cible joués (01_cleanup.sql, 02_schema.sql) - tables public recréées, Realtime activé.
  • Seed via Admin API exécuté (npm run seed:members) : super_manager admin@engwe-france.fr + 12 membres, PIN par défaut, bcrypt natif confirmé, rattachements project_members OK.
  • RLS périmètre projet appliquée (05_rls_policies.sql) : super=13/2, manager=12/2, employee=8/1 - conforme.
  • Workflow des tâches imposé par trigger (07_task_workflow.sql) : double validation (création + complétion), validation réservée aux managers du projet - vérifié.
  • Module src/services/authService.js (auth natif, defaultPinForRole, changePin) créé.

Fait aussi (couche client d'auth) :

  • Proxy de connexion serveur : lib/authBackend.js (partagé) + /api/roster & /api/login dans server.js et netlify/functions/{roster,login}.js - roster sans email, testé contre la base.
  • supabaseClient.js simplifié (client natif unique, persistSession), authService.js (getRoster/loginWithPin/changePin), hook src/hooks/useAuth.js.

Reste à faire (front - gros bloc, couche données) : réécriture Auth.jsx (roster + loginWithPin), refonte App.jsx (session native, rôles réels), migration de storage.js et des 3 dashboards vers le nouveau schéma (member/project/project_members/task/task_notes + Realtime), vue collaborateur multi-projets (tous projets confondus, cf. brief §3), modale de changement de PIN, Edge/endpoint create-member, suppression des anciennes fonctions netlify/functions/{auth,public_data}.js.


🛠️ Kanban des Tâches Techniques

US-AUTH-01 · Nettoyage base & schéma cible

  • TS5.1 : Sauvegarder la base Supabase de test (Dashboard → Database → Backups, ou pg_dump) avant tout DROP.
  • TS5.2 : Exécuter 01_cleanup.sql dans le SQL Editor ; vérifier que les 3 requêtes de contrôle finales renvoient tables/routines vides et remaining_auth_users = 0.
  • TS5.3 : Exécuter 02_schema.sql : member (id = auth.users.id), project, project_members (pivot), phase, task, task_notes avec CHECK sur role/status/priority et FK created_by/manager/owner distinctes.
  • TS5.4 : Créer/activer le trigger touch_updated_at() sur task.updated_at.
  • TS5.5 : Activer Realtime sur les tables task et task_notes (publication supabase_realtime).

US-AUTH-02 · Connexion via Supabase Auth natif

  • TS5.6 : Créer le compte super manager réel (admin@mjyholding.fr ou équivalent validé) via Admin API, PIN 9999 comme mot de passe initial.
  • TS5.7 : Simplifier src/services/supabaseClient.js - un seul createClient avec persistSession: true, autoRefreshToken: true ; supprimer setSessionToken et la reconstruction manuelle du client.
  • TS5.8 : Auth.jsx réécrit - plus de fetch("/api/auth") ni de JWT custom ni de branche super@manager/9999. Le login passe par le roster (/api/roster, sans email) + loginWithPin(memberId, pin) (proxy /api/loginsignInWithPassword côté serveur → supabase.auth.setSession). Vérifié : super/manager/employee OK, mauvais PIN → 401.
  • TS5.9 : netlify/functions/auth.js et public_data.js supprimés. Le proxy Vite /api est générique (aucune route /api/auth résiduelle) ; server.js n'expose plus que /api/roster, /api/login, /api/import.
  • TS5.10 : Vérifier la persistance locale de session (rechargement page = session conservée) et l'absence de synchronisation cloud de la session.

US-INSCR-03 · Inscription / création de membre

  • TS5.11 : Déployer l'Edge Function create-member/index.ts : contrôle du rôle appelant (super_manager/manager → sinon 403), auth.admin.createUser avec PIN par défaut selon rôle (4011/1052/9999), insertion member + project_members.
  • TS5.12 : Confirmer avec Marco la liste réelle des membres + emails, puis compléter 03_seed-members.js (retirer les placeholders prenom@mjyholding.fr).
  • TS5.13 : Exécuter 03_seed-members.js en local avec SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY en variables d'environnement (jamais commit ces clés).
  • TS5.14 : Rattacher chaque membre seedé à ses projets via project_members (Miyan / ENGWE - cf. INIT_MEMBERS comme référence de départ, un membre pouvant appartenir à plusieurs projets).
  • TS5.15 : Brancher MemberModal.jsx sur create-member (création) au lieu de l'écriture directe localStorage/members ; gérer l'affichage de l'erreur 403.

US-PIN-04 · Modification du code PIN self-service

  • TS5.16 : Créer une modale « Changer mon code PIN » (réutiliser components/modals/Modal.jsx) accessible depuis l'en-tête pour tout utilisateur connecté.
  • TS5.17 : Implémenter l'appel supabase.auth.updateUser({ password: newPin }) avec validation (4 chiffres, confirmation, refus si newPin == PIN par défaut du rôle).
  • TS5.18 : Exposer un flag serveur « PIN personnalisé » (ex. colonne member.pin_customized mise à true au 1er changement) pour piloter l'indicateur 🔒 sans jamais exposer le PIN en clair.
  • TS5.19 : Test de bout en bout : changement → déconnexion → reconnexion avec le nouveau PIN OK ; ancien PIN refusé.

US-RLS-05 · RLS par rôles réels + Realtime

  • TS5.20 : Appliquer les policies SELECT du handoff §5 sur task (super_manager_sees_all, manager_sees_own_scope, employee_sees_assigned) basées sur auth.uid().
  • TS5.21 : Étendre les policies aux opérations INSERT/UPDATE/DELETE sur task, et couvrir task_notes, project_members, member, project, phase.
  • TS5.22 : Retirer le filtrage isMine côté client là où la RLS le rend redondant ; laisser la RLS et Realtime ne remonter que le périmètre autorisé.
  • TS5.23 : Vérifier avec 3 sessions (super manager / manager / collaborateur) que chacune ne voit que son périmètre, y compris via les événements Realtime.

US-AUTH-06 · Refonte front-end de la couche session

  • TS5.24 : Réécrire l'alimentation des listes de membres dans Auth.jsx depuis member/project_members (ou un public_data refondu) au lieu de INIT_MEMBERS + localStorage.
  • TS5.25 : App.jsx réécrit sur useAuth() (session native getSession/onAuthStateChange). Supprimés : session_token/session_created_at, l'expiration 1h maison, setSessionToken, window.__forceAppRerender. Le routage par rôle (super_manager/manager/employee) est câblé ; les dashboards eux-mêmes restent à re-brancher (TS5.24/26/27, cf. TS5-DATA ci-dessous).
  • TS5.26 : Retirer SUPER_ADMIN_EMAILS (taskHelpers.js) et GLOBAL_ADMIN_EMAILS (auth.js) ; dériver le rôle uniquement de member.role (source unique).
  • TS5.27 : Adapter le routage par rôle dans App.jsx et les 3 dashboards à la session Supabase native (rôle super_manager/manager/employee).
  • [~] TS5.28 : src/__tests__/App.test.jsx mis à jour pour la session native (mock useAuth non-authentifié + getRoster) - vert (npm run test : 3/3). npm run build vert. Reste : réécrire l'e2e Playwright e2e/auth.spec.js (encore sur /api/public_data + /api/auth + bouton « Super Manager · Vue globale » disparus) pour le flux roster//api/login.

US-DOC-07 · Réalignement documentaire

  • TS5.29 : Mettre à jour docs/sprints/product_backlog.md (US1.1/US1.2 : comptes individuels, rôles réels, RLS auth.uid()) et README.md.
  • TS5.30 : Actualiser docs/supabase_schema.sql sur le schéma cible et documenter les procédures d'inscription + changement de PIN.
  • TS5.31 : Annoter le Sprint 04 bis (US-MIG-03/US-TEST-04) comme superseded par la migration auth.users ; noter que la couche auth de la dérive ne doit pas partir en production.

📌 Pré-requis avant démarrage (à débloquer par le PO)

  • Liste réelle des membres + emails confirmée par Marco (bloque TS5.12TS5.14).
  • Choix RLS stricte vs permissive V1 tranché (défaut : stricte).
  • Décision migration vs repart-de-zéro des données localStorage/Blobs (défaut : repart du seed).
  • Email de service du super manager validé (admin@mjyholding.fr ou autre).