Add implementation plan for ORGANISMOS_OPERADORES role
New role that sits between ADMIN and OPERATOR, allowing users to be assigned multiple projects instead of just one. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
170
docs/plans/PLAN_ROL_ORGANISMOS_OPERADORES.md
Normal file
170
docs/plans/PLAN_ROL_ORGANISMOS_OPERADORES.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# Plan: Agregar Rol ORGANISMOS_OPERADORES
|
||||
|
||||
## Resumen
|
||||
Agregar un nuevo rol "ORGANISMOS_OPERADORES" que:
|
||||
- Se ubica entre ADMIN y OPERATOR en la jerarquía
|
||||
- Permite asignar **múltiples proyectos** a un usuario (a diferencia de OPERATOR que solo tiene uno)
|
||||
- Puede ver datos de todos sus proyectos asignados
|
||||
|
||||
---
|
||||
|
||||
## Fase 1: Base de Datos
|
||||
|
||||
### 1.1 Crear migración SQL
|
||||
**Archivo nuevo:** `water-api/sql/add_organismos_operadores_role.sql`
|
||||
|
||||
```sql
|
||||
-- Agregar nuevo valor al enum role_name
|
||||
ALTER TYPE role_name ADD VALUE 'ORGANISMOS_OPERADORES' AFTER 'ADMIN';
|
||||
|
||||
-- Crear tabla user_projects para relación muchos-a-muchos
|
||||
CREATE TABLE user_projects (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(user_id, project_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_user_projects_user_id ON user_projects(user_id);
|
||||
CREATE INDEX idx_user_projects_project_id ON user_projects(project_id);
|
||||
|
||||
-- Insertar el nuevo rol con permisos
|
||||
INSERT INTO roles (name, description, permissions) VALUES (
|
||||
'ORGANISMOS_OPERADORES',
|
||||
'Organismos Operadores - gestiona múltiples proyectos asignados',
|
||||
'{
|
||||
"users": {"create": false, "read": true, "update": false, "delete": false},
|
||||
"projects": {"create": false, "read": true, "update": true, "delete": false},
|
||||
"devices": {"create": true, "read": true, "update": true, "delete": false},
|
||||
"meters": {"create": true, "read": true, "update": true, "delete": false},
|
||||
"readings": {"create": true, "read": true, "update": false, "delete": false},
|
||||
"settings": {"create": false, "read": true, "update": false, "delete": false},
|
||||
"reports": {"create": true, "read": true, "export": true}
|
||||
}'::JSONB
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fase 2: Backend
|
||||
|
||||
### 2.1 Actualizar validador de roles
|
||||
**Archivo:** `water-api/src/validators/role.validator.ts`
|
||||
- Línea 7: Agregar 'ORGANISMOS_OPERADORES' al enum
|
||||
```typescript
|
||||
export const RoleNameEnum = z.enum(['ADMIN', 'ORGANISMOS_OPERADORES', 'OPERATOR', 'VIEWER']);
|
||||
```
|
||||
|
||||
### 2.2 Actualizar tipos
|
||||
**Archivo:** `water-api/src/types/index.ts`
|
||||
- Agregar `projectIds?: string[]` a `JwtPayload`
|
||||
- Agregar `project_ids?: string[]` a `User` y `UserPublic`
|
||||
|
||||
### 2.3 Actualizar servicio de usuarios
|
||||
**Archivo:** `water-api/src/services/user.service.ts`
|
||||
- Agregar funciones `getUserProjects(userId)` y `setUserProjects(userId, projectIds[])`
|
||||
- Modificar `create()` para manejar `project_ids` cuando rol es ORGANISMOS_OPERADORES
|
||||
- Modificar `update()` igual
|
||||
- Modificar `getById()` y `getAll()` para incluir project_ids en respuesta
|
||||
|
||||
### 2.4 Actualizar servicio de autenticación
|
||||
**Archivo:** `water-api/src/services/auth.service.ts`
|
||||
- En `login()`: si rol es ORGANISMOS_OPERADORES, consultar `user_projects` y agregar array al JWT
|
||||
- En `refresh()`: mismo cambio
|
||||
- En `getMe()`: retornar `project_ids` array
|
||||
|
||||
### 2.5 Actualizar middleware de autenticación
|
||||
**Archivo:** `water-api/src/middleware/auth.middleware.ts`
|
||||
- Extraer `projectIds` del JWT y adjuntar a `req.user`
|
||||
|
||||
### 2.6 Actualizar validador de usuarios
|
||||
**Archivo:** `water-api/src/validators/user.validator.ts`
|
||||
- Agregar `project_ids: z.array(z.string().uuid()).optional()` a schemas
|
||||
|
||||
---
|
||||
|
||||
## Fase 3: Frontend
|
||||
|
||||
### 3.1 Actualizar API de autenticación
|
||||
**Archivo:** `src/api/auth.ts`
|
||||
- Agregar `projectIds?: string[]` a `JwtPayload` y `AuthUser`
|
||||
- Agregar función `getCurrentUserProjectIds(): string[] | null`
|
||||
- Agregar función `isOrganismosOperadores(): boolean`
|
||||
|
||||
### 3.2 Actualizar API de usuarios
|
||||
**Archivo:** `src/api/users.ts`
|
||||
- Agregar `project_ids?: string[]` a interfaces `User`, `CreateUserInput`, `UpdateUserInput`
|
||||
|
||||
### 3.3 Actualizar UsersPage
|
||||
**Archivo:** `src/pages/UsersPage.tsx`
|
||||
- Agregar `projectIds?: string[]` a interfaces
|
||||
- Agregar componente de selección múltiple de proyectos para ORGANISMOS_OPERADORES
|
||||
- Mantener selector único para OPERATOR
|
||||
- Validar que se seleccione al menos un proyecto para ORGANISMOS_OPERADORES
|
||||
|
||||
### 3.4 Actualizar Sidebar
|
||||
**Archivo:** `src/components/layout/Sidebar.tsx`
|
||||
- Agregar `isOrganismosOperadores` check
|
||||
- ORGANISMOS_OPERADORES puede ver: Dashboard, Proyectos, Medidores, Concentradores, Consumo, Analytics
|
||||
- ORGANISMOS_OPERADORES NO puede ver: Users Management, Conectores, Auditoría
|
||||
|
||||
### 3.5 Actualizar páginas de datos
|
||||
**Archivos:**
|
||||
- `src/pages/meters/useMeters.ts`
|
||||
- `src/pages/consumption/ConsumptionPage.tsx`
|
||||
- `src/pages/projects/ProjectsPage.tsx`
|
||||
|
||||
Cambios en cada archivo:
|
||||
- Importar `getCurrentUserProjectIds`
|
||||
- Filtrar proyectos visibles usando array de IDs
|
||||
- Permitir cambiar entre proyectos asignados
|
||||
|
||||
---
|
||||
|
||||
## Orden de Implementación
|
||||
|
||||
1. **SQL Migration** - Crear tabla y enum
|
||||
2. **Backend Types** - Actualizar tipos base
|
||||
3. **Backend Validators** - Actualizar validaciones
|
||||
4. **Backend Services** - user.service.ts, auth.service.ts
|
||||
5. **Backend Middleware** - auth.middleware.ts
|
||||
6. **Frontend Auth API** - src/api/auth.ts
|
||||
7. **Frontend Users API** - src/api/users.ts
|
||||
8. **Frontend UsersPage** - Multi-select UI
|
||||
9. **Frontend Sidebar** - Visibilidad de menús
|
||||
10. **Frontend Data Pages** - Filtrado por proyectos
|
||||
|
||||
---
|
||||
|
||||
## Archivos a Modificar
|
||||
|
||||
| Archivo | Cambio |
|
||||
|---------|--------|
|
||||
| `water-api/sql/add_organismos_operadores_role.sql` | **NUEVO** - Migración |
|
||||
| `water-api/src/validators/role.validator.ts` | Agregar enum value |
|
||||
| `water-api/src/validators/user.validator.ts` | Agregar project_ids |
|
||||
| `water-api/src/types/index.ts` | Agregar projectIds a tipos |
|
||||
| `water-api/src/services/user.service.ts` | Funciones multi-proyecto |
|
||||
| `water-api/src/services/auth.service.ts` | ProjectIds en JWT |
|
||||
| `water-api/src/middleware/auth.middleware.ts` | Extraer projectIds |
|
||||
| `src/api/auth.ts` | Funciones helper |
|
||||
| `src/api/users.ts` | Actualizar interfaces |
|
||||
| `src/pages/UsersPage.tsx` | Multi-select UI |
|
||||
| `src/components/layout/Sidebar.tsx` | Visibilidad menús |
|
||||
| `src/pages/meters/useMeters.ts` | Filtrado multi-proyecto |
|
||||
| `src/pages/consumption/ConsumptionPage.tsx` | Filtrado multi-proyecto |
|
||||
| `src/pages/projects/ProjectsPage.tsx` | Filtrado multi-proyecto |
|
||||
|
||||
---
|
||||
|
||||
## Verificación
|
||||
|
||||
1. **Base de datos**: Ejecutar migración y verificar que el rol existe
|
||||
2. **Backend**:
|
||||
- Crear usuario con rol ORGANISMOS_OPERADORES y múltiples proyectos
|
||||
- Verificar que JWT incluye array de projectIds
|
||||
3. **Frontend**:
|
||||
- Verificar multi-select aparece solo para ORGANISMOS_OPERADORES
|
||||
- Verificar que sidebar muestra/oculta elementos correctamente
|
||||
- Verificar que páginas de datos filtran por proyectos asignados
|
||||
Reference in New Issue
Block a user