- Update vision, architecture and technical documentation - Update module definitions (PMC-001 to PMC-008) - Update requirements documentation - Add CONTEXT-MAP.yml and ENVIRONMENT-INVENTORY.yml - Add orchestration guidelines and references 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
547 lines
13 KiB
Markdown
547 lines
13 KiB
Markdown
---
|
|
id: "PMC-007-ADMIN"
|
|
title: "PMC-007: Módulo de Admin"
|
|
type: "Module Definition"
|
|
epic: "PMC-007"
|
|
status: "Draft"
|
|
project: "platform_marketing_content"
|
|
version: "1.0.0"
|
|
created_date: "2026-01-04"
|
|
updated_date: "2026-01-04"
|
|
---
|
|
# PMC-007: Módulo de Admin
|
|
|
|
**Versión:** 1.0.0
|
|
**Fecha:** 2025-12-08
|
|
**Estado:** Definición
|
|
**Prioridad:** Media
|
|
|
|
---
|
|
|
|
## Descripción General
|
|
|
|
El módulo de Admin proporciona las funcionalidades de administración del sistema SaaS: gestión de usuarios, roles, permisos, planes de suscripción, configuración global y herramientas de supervisión.
|
|
|
|
---
|
|
|
|
## Objetivos
|
|
|
|
1. Gestionar usuarios y sus roles dentro del tenant
|
|
2. Controlar permisos de acceso por módulo/acción
|
|
3. Administrar planes y suscripciones (preparación SaaS)
|
|
4. Configurar parámetros globales del sistema
|
|
5. Monitorear uso y salud del sistema
|
|
|
|
---
|
|
|
|
## Entidades del Dominio
|
|
|
|
### User
|
|
|
|
```yaml
|
|
Entidad: User
|
|
Descripción: Usuario del sistema
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK)
|
|
- email: string (único por tenant)
|
|
- password_hash: string
|
|
- first_name: string
|
|
- last_name: string
|
|
- avatar_url: string
|
|
- status: enum [pending, active, suspended, deactivated]
|
|
- role_id: UUID (FK)
|
|
- preferences: JSONB
|
|
- language: string
|
|
- timezone: string
|
|
- theme: string
|
|
- notifications: object
|
|
- last_login_at: timestamp
|
|
- email_verified_at: timestamp
|
|
- created_at: timestamp
|
|
- updated_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant
|
|
- N:1 con Role
|
|
- 1:N con Project (como owner)
|
|
- 1:N con Asset (como creator)
|
|
- 1:N con GenerationJob
|
|
```
|
|
|
|
### Role
|
|
|
|
```yaml
|
|
Entidad: Role
|
|
Descripción: Rol con conjunto de permisos
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK, null = rol de sistema)
|
|
- name: string
|
|
- description: text
|
|
- permissions: array[string] (lista de permisos)
|
|
- is_system: boolean (no editable si true)
|
|
- created_at: timestamp
|
|
- updated_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant (opcional)
|
|
- 1:N con User
|
|
|
|
Roles de Sistema:
|
|
- super_admin: Acceso total, sin límites
|
|
- tenant_admin: Admin del tenant
|
|
- creative: Crear contenido, gestionar campañas
|
|
- analyst: CRM, reportes
|
|
- viewer: Solo lectura
|
|
```
|
|
|
|
### Permission (definición estática)
|
|
|
|
```yaml
|
|
Permisos del Sistema:
|
|
# Tenants
|
|
- tenants.view
|
|
- tenants.create
|
|
- tenants.edit
|
|
- tenants.delete
|
|
|
|
# Users
|
|
- users.view
|
|
- users.create
|
|
- users.edit
|
|
- users.delete
|
|
- users.invite
|
|
|
|
# CRM
|
|
- clients.view
|
|
- clients.create
|
|
- clients.edit
|
|
- clients.delete
|
|
- brands.view
|
|
- brands.create
|
|
- brands.edit
|
|
- brands.delete
|
|
- products.view
|
|
- products.create
|
|
- products.edit
|
|
- products.delete
|
|
|
|
# Projects
|
|
- projects.view
|
|
- projects.create
|
|
- projects.edit
|
|
- projects.delete
|
|
- campaigns.view
|
|
- campaigns.create
|
|
- campaigns.edit
|
|
- campaigns.delete
|
|
- campaigns.approve
|
|
|
|
# Generation
|
|
- generation.execute
|
|
- generation.view_queue
|
|
- generation.manage_queue
|
|
- models.view
|
|
- models.create
|
|
- models.delete
|
|
- models.train
|
|
|
|
# Assets
|
|
- assets.view
|
|
- assets.upload
|
|
- assets.edit
|
|
- assets.delete
|
|
- assets.approve
|
|
- assets.download
|
|
|
|
# Automation
|
|
- automation.view
|
|
- automation.configure
|
|
- automation.execute
|
|
|
|
# Admin
|
|
- admin.users
|
|
- admin.roles
|
|
- admin.settings
|
|
- admin.billing
|
|
- admin.audit
|
|
```
|
|
|
|
### Invitation
|
|
|
|
```yaml
|
|
Entidad: Invitation
|
|
Descripción: Invitación pendiente para unirse al tenant
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK)
|
|
- email: string
|
|
- role_id: UUID (FK)
|
|
- invited_by: UUID (FK a User)
|
|
- token: string (único)
|
|
- status: enum [pending, accepted, expired, cancelled]
|
|
- expires_at: timestamp
|
|
- accepted_at: timestamp
|
|
- created_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant
|
|
- N:1 con Role
|
|
- N:1 con User (inviter)
|
|
```
|
|
|
|
### AuditLog
|
|
|
|
```yaml
|
|
Entidad: AuditLog
|
|
Descripción: Registro de acciones importantes
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK)
|
|
- user_id: UUID (FK)
|
|
- action: string (ej: user.created, asset.deleted)
|
|
- entity_type: string
|
|
- entity_id: UUID
|
|
- old_values: JSONB
|
|
- new_values: JSONB
|
|
- ip_address: string
|
|
- user_agent: string
|
|
- created_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant
|
|
- N:1 con User
|
|
```
|
|
|
|
### Setting
|
|
|
|
```yaml
|
|
Entidad: Setting
|
|
Descripción: Configuración del sistema/tenant
|
|
Atributos:
|
|
- id: UUID (PK)
|
|
- tenant_id: UUID (FK, null = global)
|
|
- key: string
|
|
- value: JSONB
|
|
- type: enum [string, number, boolean, json]
|
|
- category: string
|
|
- is_secret: boolean
|
|
- created_at: timestamp
|
|
- updated_at: timestamp
|
|
|
|
Relaciones:
|
|
- N:1 con Tenant (opcional)
|
|
```
|
|
|
|
---
|
|
|
|
## Funcionalidades
|
|
|
|
### F-007.1: Gestión de Usuarios
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-007.1.1 | Listar usuarios | Ver todos los usuarios del tenant | Alta |
|
|
| F-007.1.2 | Invitar usuario | Enviar invitación por email | Alta |
|
|
| F-007.1.3 | Editar usuario | Modificar datos y rol | Alta |
|
|
| F-007.1.4 | Suspender usuario | Bloquear acceso temporalmente | Media |
|
|
| F-007.1.5 | Eliminar usuario | Desactivar cuenta | Media |
|
|
|
|
### F-007.2: Gestión de Roles
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-007.2.1 | Listar roles | Ver roles disponibles | Alta |
|
|
| F-007.2.2 | Crear rol | Definir rol personalizado | Media |
|
|
| F-007.2.3 | Editar permisos | Modificar permisos de rol | Media |
|
|
| F-007.2.4 | Eliminar rol | Solo si no tiene usuarios | Baja |
|
|
|
|
### F-007.3: Configuración
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-007.3.1 | Settings generales | Nombre, branding, etc. | Alta |
|
|
| F-007.3.2 | Settings de generación | Modelos por defecto, calidad | Media |
|
|
| F-007.3.3 | Integraciones | Configurar n8n, APIs externas | Media |
|
|
| F-007.3.4 | Notificaciones | Templates de email, webhooks | Media |
|
|
|
|
### F-007.4: Auditoría
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-007.4.1 | Ver logs | Historial de acciones | Media |
|
|
| F-007.4.2 | Filtrar logs | Por usuario, acción, fecha | Media |
|
|
| F-007.4.3 | Exportar logs | Descargar en CSV | Baja |
|
|
|
|
### F-007.5: Monitoreo (Super Admin)
|
|
|
|
| ID | Funcionalidad | Descripción | Prioridad |
|
|
|----|---------------|-------------|-----------|
|
|
| F-007.5.1 | Dashboard sistema | Métricas globales | Media |
|
|
| F-007.5.2 | Estado de servicios | GPU, queue, storage | Alta |
|
|
| F-007.5.3 | Uso por tenant | Consumo de recursos | Media |
|
|
|
|
---
|
|
|
|
## Roles del Sistema
|
|
|
|
### Matriz de Permisos por Rol
|
|
|
|
```yaml
|
|
super_admin:
|
|
description: "Administrador del sistema completo"
|
|
permissions: ["*"] # Todos los permisos
|
|
notes: "Solo para el owner/CTO. Sin límites de uso."
|
|
|
|
tenant_admin:
|
|
description: "Administrador del tenant/agencia"
|
|
permissions:
|
|
- users.*
|
|
- roles.view
|
|
- clients.*
|
|
- brands.*
|
|
- products.*
|
|
- projects.*
|
|
- campaigns.*
|
|
- generation.*
|
|
- assets.*
|
|
- automation.view
|
|
- automation.configure
|
|
- admin.users
|
|
- admin.settings
|
|
- admin.audit
|
|
|
|
creative:
|
|
description: "Creativo/Media Buyer"
|
|
permissions:
|
|
- clients.view
|
|
- brands.view
|
|
- products.view
|
|
- products.create
|
|
- projects.view
|
|
- projects.create
|
|
- projects.edit
|
|
- campaigns.*
|
|
- generation.execute
|
|
- generation.view_queue
|
|
- models.view
|
|
- assets.view
|
|
- assets.upload
|
|
- assets.edit
|
|
|
|
analyst:
|
|
description: "Analista/CRM"
|
|
permissions:
|
|
- clients.*
|
|
- brands.view
|
|
- products.view
|
|
- projects.view
|
|
- campaigns.view
|
|
- assets.view
|
|
- assets.download
|
|
- automation.view
|
|
|
|
viewer:
|
|
description: "Solo lectura"
|
|
permissions:
|
|
- clients.view
|
|
- brands.view
|
|
- products.view
|
|
- projects.view
|
|
- campaigns.view
|
|
- assets.view
|
|
|
|
client_portal:
|
|
description: "Cliente externo (portal)"
|
|
permissions:
|
|
- campaigns.view # Solo sus campañas
|
|
- assets.view # Solo sus assets
|
|
- assets.download
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
```yaml
|
|
Base: /api/v1/admin
|
|
|
|
# Users
|
|
GET /users # Listar usuarios
|
|
GET /users/:id # Detalle de usuario
|
|
POST /users/invite # Invitar usuario
|
|
PUT /users/:id # Actualizar usuario
|
|
PATCH /users/:id/status # Cambiar estado
|
|
DELETE /users/:id # Desactivar usuario
|
|
|
|
# Invitations
|
|
GET /invitations # Listar invitaciones
|
|
POST /invitations/:id/resend # Reenviar
|
|
DELETE /invitations/:id # Cancelar
|
|
|
|
# Roles
|
|
GET /roles # Listar roles
|
|
GET /roles/:id # Detalle de rol
|
|
POST /roles # Crear rol
|
|
PUT /roles/:id # Actualizar rol
|
|
DELETE /roles/:id # Eliminar rol
|
|
|
|
# Settings
|
|
GET /settings # Listar settings
|
|
GET /settings/:key # Obtener setting
|
|
PUT /settings/:key # Actualizar setting
|
|
DELETE /settings/:key # Eliminar setting (custom)
|
|
|
|
# Audit
|
|
GET /audit # Listar logs
|
|
GET /audit/export # Exportar logs
|
|
|
|
# System (Super Admin only)
|
|
GET /system/status # Estado del sistema
|
|
GET /system/metrics # Métricas globales
|
|
GET /system/tenants # Listar todos los tenants
|
|
GET /system/tenants/:id/usage # Uso de un tenant
|
|
```
|
|
|
|
---
|
|
|
|
## Reglas de Negocio
|
|
|
|
```yaml
|
|
RN-007.1:
|
|
Descripción: Email único por tenant
|
|
Validación: No puede haber dos usuarios con mismo email en un tenant
|
|
|
|
RN-007.2:
|
|
Descripción: Roles de sistema no editables
|
|
Validación: is_system = true bloquea edición
|
|
|
|
RN-007.3:
|
|
Descripción: No eliminar rol con usuarios asignados
|
|
Validación: Verificar user_count = 0 antes de DELETE
|
|
|
|
RN-007.4:
|
|
Descripción: Invitación expira en 7 días
|
|
Validación: expires_at = created_at + 7 days
|
|
|
|
RN-007.5:
|
|
Descripción: Super admin no puede ser suspendido
|
|
Validación: Bloquear cambio de status si role = super_admin
|
|
|
|
RN-007.6:
|
|
Descripción: Audit logs son inmutables
|
|
Validación: Solo INSERT, no UPDATE ni DELETE
|
|
```
|
|
|
|
---
|
|
|
|
## Dependencias
|
|
|
|
```yaml
|
|
Dependencias de Módulos:
|
|
- PMC-001 Tenants: Configuración de tenant
|
|
- Todos los módulos: Para verificación de permisos
|
|
|
|
Dependencias del Catálogo:
|
|
- @CATALOG_AUTH:
|
|
path: shared/catalog/auth/
|
|
uso: Sistema completo de autenticacion
|
|
incluye:
|
|
- JWT access + refresh tokens
|
|
- Password hashing con bcrypt
|
|
- Guards y decoradores
|
|
- Recuperacion de contrasena
|
|
- Verificacion de email
|
|
adaptar:
|
|
- Definir roles especificos PMC (super_admin, tenant_admin, creative, etc.)
|
|
- Agregar tenant_id al JWT payload
|
|
- Integrar con sistema de permisos RBAC
|
|
docs: shared/catalog/auth/README.md
|
|
|
|
- @CATALOG_SESSION:
|
|
path: shared/catalog/session-management/
|
|
uso: Gestion de sesiones activas
|
|
incluye:
|
|
- Maximo N sesiones concurrentes
|
|
- Tracking de dispositivos
|
|
- Logout selectivo/global
|
|
- Auto-cleanup de expiradas
|
|
adaptar:
|
|
- Limite de sesiones por plan de suscripcion
|
|
- Integrar con audit log
|
|
docs: shared/catalog/session-management/README.md
|
|
|
|
- @CATALOG_FLAGS:
|
|
path: shared/catalog/feature-flags/
|
|
uso: Feature flags para rollout gradual (opcional)
|
|
docs: shared/catalog/feature-flags/README.md
|
|
|
|
- @CATALOG_NOTIFY:
|
|
path: shared/catalog/notifications/
|
|
uso: Envio de invitaciones y notificaciones
|
|
docs: shared/catalog/notifications/README.md
|
|
|
|
Servicios Externos:
|
|
- SMTP: Envío de invitaciones (via @CATALOG_NOTIFY)
|
|
- OAuth providers (opcional): Google, Microsoft para SSO
|
|
|
|
Referencia de Implementacion:
|
|
- Auth module: projects/gamilit/apps/backend/src/modules/auth/
|
|
- Session service: projects/gamilit/apps/backend/src/modules/auth/services/session-management.service.ts
|
|
- Roles/permissions: projects/gamilit/apps/backend/src/modules/admin/services/
|
|
```
|
|
|
|
---
|
|
|
|
## Flujos de Usuario
|
|
|
|
### Invitar Usuario
|
|
|
|
```
|
|
1. Admin navega a Users → Invite
|
|
2. Ingresa email y selecciona rol
|
|
3. Sistema genera token único
|
|
4. Sistema envía email con link
|
|
5. Usuario hace clic en link
|
|
6. Usuario completa registro (password, nombre)
|
|
7. Usuario queda activo en el tenant
|
|
```
|
|
|
|
### Cambiar Rol de Usuario
|
|
|
|
```
|
|
1. Admin navega a Users → [Usuario]
|
|
2. Selecciona nuevo rol
|
|
3. Sistema verifica que no sea el único admin
|
|
4. Sistema actualiza rol
|
|
5. Permisos se aplican inmediatamente
|
|
6. Se registra en audit log
|
|
```
|
|
|
|
---
|
|
|
|
## Criterios de Aceptación
|
|
|
|
- [ ] CRUD completo de usuarios funciona
|
|
- [ ] Sistema de invitaciones por email funciona
|
|
- [ ] Roles controlan acceso a módulos correctamente
|
|
- [ ] Permisos se verifican en cada endpoint
|
|
- [ ] Settings se guardan y cargan correctamente
|
|
- [ ] Audit logs registran acciones importantes
|
|
- [ ] Dashboard de sistema muestra métricas
|
|
- [ ] Super admin tiene acceso a todo
|
|
|
|
---
|
|
|
|
## Referencias
|
|
|
|
- [ARQUITECTURA-TECNICA.md](../00-vision-general/ARQUITECTURA-TECNICA.md)
|
|
- [@CATALOG_AUTH](../../../shared/catalog/modules/auth/)
|
|
- [PMC-001-TENANTS.md](./PMC-001-TENANTS.md)
|
|
|
|
---
|
|
|
|
**Documento generado por:** Requirements-Analyst
|
|
**Fecha:** 2025-12-08
|