# Convenciones de rutas — Wari

## Regla general

Cada recurso pertenece al controlador de su dominio. Las operaciones sobre un recurso X van en XController.

## Asignación por dominio

| Recurso / operación | Controlador |
|---|---|
| CRUD grupos, membresía, invitaciones, permisos, Telegram | `GrupoController` |
| CRUD eventos, votación de fechas, confirmación, cancelación | `EventoController` |
| Autenticación, registro, reset de contraseña | `SecurityController` |
| Perfil, avatar, 2FA | `PerfilController` |
| Colección BGG, sincronización, puntuaciones inline | `ColeccionController` |
| JSON privado para UI sin recargar página | `Api\*Controller` bajo `/api/` |
| Administración | `Admin\*Controller` bajo `/admin/` |

## Prefijos de nombre de ruta

```
app_grupo_*          → GrupoController
app_evento_*         → EventoController
app_login / app_register / app_request_reset / app_reset_password
app_perfil_*         → PerfilController
app_coleccion_*      → ColeccionController
app_api_*            → Api\*
app_admin_*          → Admin\*
```

## Criterio para mover una ruta

- Si una acción necesita más de 3 dependencias del otro dominio → moverla al controlador propietario o extraerla a un servicio.
- Nunca añadir rutas de negocio a SecurityController (solo auth).
- Las rutas API son solo JSON; nunca devuelven HTML.
