Model d'identitat (User / Person / Roles de domini)
Mòdul: Identitat
Versió: 1.0
Actualitzat: 2024-12
Referència: Veure també Security Playbook
Aquest document descriu el model d'identitat de LDP i com es relacionen:
- els usuaris que es loguegen al sistema (
User), - les persones i rols de domini (
Person,PersonRole), - les fitxes de coreògrafs i altres rols públics (
Choreographer,DJ,Teacher, etc.).
1. Capes d'identitat
Hi ha dues capes separades però relacionades:
-
Capa de seguretat (User)
- Pensada per autenticació i autorització.
- Gestiona:
- email + password,
- rols de seguretat (
USER,TEACHER,ADMIN), - estat del compte.
-
Capa de domini (Person)
- Representa persones dins de l'ecosistema del line dance.
- Pot existir encara que no tinguin login.
- Gestiona:
- nom públic,
- país/ciutat,
- rols de domini (coreògraf, DJ, teacher…),
- metadades públiques.
2. Capa de seguretat – User
Entitat User (resum conceptual):
idemail(únic, login principal)passwordHash(BCrypt)role(seguretat):USER,ADMINenabled(bool)lockedUntil?/accountLocked?tokenVersion(per invalidar JWT)- timestamps:
created_at,updated_at
A partir de Phase 2B, TEACHER ja no és un rol de seguretat.
S'ha mogut a rol de domini (PersonRoleType.TEACHER).
Veure ADR-002 per detalls.
Característiques:
- Un
Usersempre té unemailúnic. - El rol de seguretat controla què pot fer dins l'app (RBAC).
- L'autorització d'edició de recursos es basa en ownership, no en el rol de seguretat.
Detalls tècnics a authentication.md.
3. Capa de domini – Person i PersonRole
3.1. Entitat Person
Representa una identitat pública dins de LDP:
iddisplayName(nom públic)country,citypublicContact?(email web, xarxes socials…)bio?avatarUrl?(quan es defineixi l'avatar, veureroadmap/avatar-feature.md)- timestamps
Una Person pot representar:
- un individu,
- un grup (p. ex. un col·lectiu de coreògrafs).
3.2. Taula PersonRole
Per evitar que una sola entitat s'espremi amb massa camps, es defineixen rols de domini:
idperson_id→Personrole(CHOREOGRAPHER,TEACHER,DJ,ARTIST,STAFF,GUEST, …)metadata(JSONB) per a detalls específics del rol:- p. ex. per
CHOREOGRAPHER: any d'inici, web oficial, etc.
- p. ex. per
Una mateixa Person pot tenir múltiples PersonRole:
- p. ex. una persona pot ser
CHOREOGRAPHERiTEACHER.
4. Relació User ↔ Person
No totes les Person tenen per què tenir User associat:
- hi pot haver fitxes de coreògrafs que només existeixen com a catàleg, sense compte d'usuari.
Quan una persona sí té usuari:
Userpot tenir un campperson_id(nullable).- En el moment de registre o reclamació de fitxa:
- es pot enllaçar
User.person_idaPerson.id.
- es pot enllaçar
Regles generals:
- Cada
Usercom a màxim hauria d'apuntar a unaPerson. - Una
Personpot tenir 0 o 1Userassociats (fins que no es defineixin escenaris especials). - La propietat/gestió d'una fitxa pública es fa a través del sistema d'ownership (veure
architecture/ownership-workflow.md).
5. Choreographer i altres rols de domini
Per facilitar consultes i compatibilitat amb el model actual, es pot mantenir una entitat Choreographer com a vista especialitzada sobre Person + PersonRole.
Opcions:
- A. Entitat pròpia
Choreographer- amb FK a
person_id, - camps específics (si n'hi ha gaires).
- amb FK a
- B. Treballar només amb
Person+PersonRole("CHOREOGRAPHER")- i crear vistes/DTOs per exposar-ho a l'API.
Independentment de la implementació:
- la fitxa de coreògraf ha de mostrar:
- nom públic,
- país / ciutat,
- foto/avatar,
- enllaços oficials (web, xarxes),
- llistat de danceds associats.
6. Ownership i gestió de fitxes
El sistema d'ownership permet que un User reclami la gestió d'una fitxa de domini (p. ex. un Choreographer).
Conceptes clau:
OwnershipRequest- tipus:
CLAIM(reclamar fitxa existent),TRANSFER(transferir propietat a un altre usuari).
- estat:
PENDING_CLAIM,PENDING_TRANSFER,APPROVED,REJECTED,CANCELLED.
- tipus:
- Regles:
- un
Usernomés pot ser owner d'un coreògraf SOLO (no grups), - hi ha un unic owner actiu per fitxa (regles al backend).
- un
Detalls funcionals a architecture/ownership-workflow.md.
7. Casos típics
7.1. Coreògraf sense usuari
- Es crea una
Person+PersonRole("CHOREOGRAPHER"). - No hi ha
Userassociat. - La fitxa és gestionada per admins fins que algú la reclami.
7.2. Coreògraf que es registra a la plataforma
- Es crea
Useramb rol de seguretat (p. ex.TEACHER). - Es crea o es troba la
Personcorresponent. - Es llança un OwnershipRequest(CLAIM) sobre la fitxa de coreògraf.
- Un ADMIN aprova la sol·licitud.
- A partir d'aquí, el
Useres considera owner de la fitxa.
7.3. Usuari que representa un grup
Personpot marcar-se com a "grup" a nivell de metadades.- Les regles d'ownership poden ser diferents (p. ex. permetre més d'un gestor).
- De moment, els grups poden ser no reclamables per simplificar (decisió temporal).
8. Documents relacionats
- Security Playbook
- Autenticació JWT
- Protecció de Dades
- Workflow d'ownership:
architecture/ownership-workflow