feat(club-006): club admin: dashboard, members, movements and settings
This commit is contained in:
18
work/artifacts/CLUB-006/architect.md
Normal file
18
work/artifacts/CLUB-006/architect.md
Normal 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)
|
||||
21
work/artifacts/CLUB-006/documenter.md
Normal file
21
work/artifacts/CLUB-006/documenter.md
Normal 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
|
||||
25
work/artifacts/CLUB-006/implementer.md
Normal file
25
work/artifacts/CLUB-006/implementer.md
Normal 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` ✅
|
||||
13
work/artifacts/CLUB-006/leader-close.json
Normal file
13
work/artifacts/CLUB-006/leader-close.json
Normal 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"
|
||||
}
|
||||
21
work/artifacts/CLUB-006/qa.json
Normal file
21
work/artifacts/CLUB-006/qa.json
Normal 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"
|
||||
}
|
||||
16
work/artifacts/CLUB-006/reviewer.json
Normal file
16
work/artifacts/CLUB-006/reviewer.json
Normal 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"
|
||||
}
|
||||
13
work/artifacts/CLUB-006/security.json
Normal file
13
work/artifacts/CLUB-006/security.json
Normal 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"
|
||||
}
|
||||
Reference in New Issue
Block a user