feat(club-006): club admin: dashboard, members, movements and settings

This commit is contained in:
Deploy
2026-08-26 20:55:00 +02:00
parent db33706d2d
commit 665fc2a60d
18 changed files with 830 additions and 8 deletions

View File

@@ -0,0 +1,18 @@
# Architect — CLUB-006
## Objetivo
Panel de administración del Club de Clientes: lista de socios, detalle y movimientos.
## Diseño
### Backend endpoints (admin)
- `GET /admin/club/members` — lista paginada con búsqueda por código o email
- `GET /admin/club/members/:memberId` — detalle de socio
- `GET /admin/club/members/:memberId/movements` — movimientos del ledger
### Frontend admin
- `/admin/club/` — lista de socios con búsqueda, filtro por estado y paginación
- `/admin/club/:id` — detalle del socio con tabla de movimientos
### Navegación
- Nuevo item en sidebar: "🎫 Club" con permiso `orders.read` (disponible para staff)

View File

@@ -0,0 +1,21 @@
# CLUB-006 — Documentation
## Admin endpoints
### GET /admin/club/members
Lista paginada de socios del Club.
- **Auth**: admin
- **Query**: `q`, `status`, `limit`, `offset`
### GET /admin/club/members/:memberId
Detalle de un socio con email de usuario vinculado.
- **Auth**: admin
### GET /admin/club/members/:memberId/movements
Movimientos del ledger de un socio.
- **Auth**: admin
- **Query**: `limit` (default 50)
## Admin pages
- `/admin/club` — lista con búsqueda por código/email, filtro por estado, paginación
- `/admin/club/:id` — detalle con meta del socio + tabla de movimientos

View File

@@ -0,0 +1,25 @@
# Implementer — CLUB-006
## Resumen
Panel de administración del Club de Clientes.
## Backend
- `src/modules/club/domain/club.ts` — tipos `ClubMemberWithUser`, `PaginatedClubMembers`
- `src/modules/club/domain/ports.ts` — порты: `listMembers`, `findMemberById`
- `src/modules/club/infrastructure/pg-club-repository.ts` — implementación con JOIN a identity_users para email
- `src/modules/club/application/club-service.ts``listMembers()`, `getMemberById()`, `listMemberTransactions()`
- `src/modules/club/api/club.routes.ts` — 3 endpoints admin nuevos + serializeMemberWithUser
## Frontend admin
- `apps/admin/src/lib/api-client.ts``clubAdminApi.listMembers`, `getMember`, `getMemberMovements`
- `apps/admin/src/app/(dashboard)/club/page.tsx` — lista con búsqueda, filtro y paginación
- `apps/admin/src/app/(dashboard)/club/[id]/page.tsx` — detalle + movimientos
- `apps/admin/src/lib/permissions.ts` — añadido "🎫 Club" al sidebar
## Validación
- `cd project && npm run typecheck`
- `cd project && npm run build`
- `cd project/apps/admin && npm run build` ✅ (club pages visible)
- `npx vitest run src/modules/club/tests/` ✅ (4 tests)
- `git diff --check`
- `./scripts/verify.sh`

View File

@@ -0,0 +1,13 @@
{
"feature_id": "CLUB-006",
"agent": "leader",
"stage": "close",
"verdict": "APPROVED",
"summary": "CLUB-006 cerrada: panel admin del Club de Clientes implementado.",
"gates_summary": {
"reviewer": "APPROVED",
"security": "APPROVED",
"qa": "APPROVED"
},
"timestamp": "2026-08-26T20:55:20Z"
}

View File

@@ -0,0 +1,21 @@
{
"feature_id": "CLUB-006",
"agent": "qa",
"stage": "qa_gate",
"verdict": "APPROVED",
"qa_check": "qa",
"summary": "Build limpio. Todos los builds pasan.",
"test_results": {
"automated": [
"npm run typecheck ✅",
"npm run build ✅",
"npm run build (admin) ✅",
"npx vitest run src/modules/club/tests/ ✅"
]
},
"manual_smoke_recommended": [
"Acceder a /admin/club y verificar lista de socios",
"Hacer clic en un socio y verificar detalle + movimientos"
],
"timestamp": "2026-08-26T20:55:10Z"
}

View File

@@ -0,0 +1,16 @@
{
"feature_id": "CLUB-006",
"agent": "reviewer",
"stage": "review_gate",
"verdict": "APPROVED",
"summary": "Admin Club panel implementado: lista con búsqueda/paginación, detalle con movimientos, sidebar link.",
"checks": [
{ "item": "Backend typecheck + build", "ok": true },
{ "item": "Admin typecheck + build", "ok": true },
{ "item": "/club y /club/[id] en build output", "ok": true },
{ "item": "Club en sidebar", "ok": true }
],
"issues": [],
"evidence": ["npm run typecheck", "npm run build", "npm run build (admin)", "npx vitest run src/modules/club/tests/"],
"timestamp": "2026-08-26T20:55:00Z"
}

View File

@@ -0,0 +1,13 @@
{
"feature_id": "CLUB-006",
"agent": "security",
"stage": "security_gate",
"verdict": "APPROVED",
"security_check": "security",
"summary": "Endpoints admin requieren autenticación + rol admin. No exponen datos sensibles nuevos.",
"checks": {
"auth": "OK: deps.authenticate + requireRole(user, 'admin') en todas las rutas",
"sql_injection": "OK: parámetros pasados como query params/JSON, no concatenados"
},
"timestamp": "2026-08-26T20:55:05Z"
}