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) - tablespublicrecréées, Realtime activé. - Seed via Admin API exécuté (
npm run seed:members) : super_manageradmin@engwe-france.fr+ 12 membres, PIN par défaut, bcrypt natif confirmé, rattachementsproject_membersOK. - 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/logindansserver.jsetnetlify/functions/{roster,login}.js- roster sans email, testé contre la base. supabaseClient.jssimplifié (client natif unique,persistSession),authService.js(getRoster/loginWithPin/changePin), hooksrc/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 toutDROP. - TS5.2 : Exécuter
01_cleanup.sqldans le SQL Editor ; vérifier que les 3 requêtes de contrôle finales renvoient tables/routines vides etremaining_auth_users = 0. - TS5.3 : Exécuter
02_schema.sql:member(id =auth.users.id),project,project_members(pivot),phase,task,task_notesavecCHECKsurrole/status/priorityet FKcreated_by/manager/ownerdistinctes. - TS5.4 : Créer/activer le trigger
touch_updated_at()surtask.updated_at. - TS5.5 : Activer Realtime sur les tables
taskettask_notes(publicationsupabase_realtime).
US-AUTH-02 · Connexion via Supabase Auth natif
- TS5.6 : Créer le compte super manager réel (
admin@mjyholding.frou équivalent validé) via Admin API, PIN9999comme mot de passe initial. - TS5.7 : Simplifier
src/services/supabaseClient.js- un seulcreateClientavecpersistSession: true,autoRefreshToken: true; supprimersetSessionTokenet la reconstruction manuelle du client. - TS5.8 :
Auth.jsxréécrit - plus defetch("/api/auth")ni de JWT custom ni de branchesuper@manager/9999. Le login passe par le roster (/api/roster, sans email) +loginWithPin(memberId, pin)(proxy/api/login→signInWithPasswordcôté serveur →supabase.auth.setSession). Vérifié : super/manager/employee OK, mauvais PIN → 401. - TS5.9 :
netlify/functions/auth.jsetpublic_data.jssupprimés. Le proxy Vite/apiest générique (aucune route/api/authrésiduelle) ;server.jsn'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.createUseravec PIN par défaut selon rôle (4011/1052/9999), insertionmember+project_members. - TS5.12 : Confirmer avec Marco la liste réelle des membres + emails, puis compléter
03_seed-members.js(retirer les placeholdersprenom@mjyholding.fr). - TS5.13 : Exécuter
03_seed-members.jsen local avecSUPABASE_URL+SUPABASE_SERVICE_ROLE_KEYen variables d'environnement (jamais commit ces clés). - TS5.14 : Rattacher chaque membre seedé à ses projets via
project_members(Miyan / ENGWE - cf.INIT_MEMBERScomme référence de départ, un membre pouvant appartenir à plusieurs projets). - TS5.15 : Brancher
MemberModal.jsxsurcreate-member(création) au lieu de l'écriture directelocalStorage/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 sinewPin== PIN par défaut du rôle). - TS5.18 : Exposer un flag serveur « PIN personnalisé » (ex. colonne
member.pin_customizedmise àtrueau 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
SELECTdu handoff §5 surtask(super_manager_sees_all,manager_sees_own_scope,employee_sees_assigned) basées surauth.uid(). - TS5.21 : Étendre les policies aux opérations
INSERT/UPDATE/DELETEsurtask, et couvrirtask_notes,project_members,member,project,phase. - TS5.22 : Retirer le filtrage
isMinecô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.jsxdepuismember/project_members(ou unpublic_datarefondu) au lieu deINIT_MEMBERS+localStorage. - TS5.25 :
App.jsxréécrit suruseAuth()(session nativegetSession/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) etGLOBAL_ADMIN_EMAILS(auth.js) ; dériver le rôle uniquement demember.role(source unique). - TS5.27 : Adapter le routage par rôle dans
App.jsxet les 3 dashboards à la session Supabase native (rôlesuper_manager/manager/employee). - [~] TS5.28 :
src/__tests__/App.test.jsxmis à jour pour la session native (mockuseAuthnon-authentifié +getRoster) - vert (npm run test: 3/3).npm run buildvert. Reste : réécrire l'e2e Playwrighte2e/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, RLSauth.uid()) etREADME.md. - TS5.30 : Actualiser
docs/supabase_schema.sqlsur 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 migrationauth.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.12–TS5.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.frou autre).
