Admin
Endpoints para tareas administrativas, reportes y configuración del sistema.
Modelos de Datos
Section titled “Modelos de Datos”Los endpoints de administración utilizan modelos de múltiples schemas para generar estadísticas y reportes. Los principales modelos consultados incluyen:
Schemas Utilizados
Section titled “Schemas Utilizados”| Schema | Modelos |
|---|---|
auth | User, Account, UserRole |
users | UserProfile, Membership |
gym | Trainer, Class, ClassSchedule, Reservation, TrainingSession |
fitness | WorkoutLog, Exercise |
gamification | Goal, Streak, Achievement |
social | Post, Comment, Like, Follow |
payments | Payment |
reviews | TrainerReview |
Nota: Puesto que el módulo admin no posee tablas propias y en su lugar recopila métricas operando sobre las entidades de todo el sistema (como UserProfile, Membership, Trainer, Reservation, etc.), no se incluye un extracto específico del esquema de Prisma aquí. Para ver los modelos de datos exactos, por favor consulta la documentación de sus respectivos módulos.
Endpoints
Section titled “Endpoints”Obtener Estadísticas del Dashboard
Section titled “Obtener Estadísticas del Dashboard”Obtener estadísticas del dashboard con métricas completas sobre el gimnasio.
- URL:
/api/v1/admin/dashboard - Método:
GET - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint calcula y retorna estadísticas completas del dashboard:
-
Cálculo de períodos: Determina el rango de fechas según el parámetro
period(day, week, month, quarter, year) y calcula el período anterior para comparaciones de crecimiento. -
Overview:
totalUsers: Conteo total de perfiles de usuarioactiveMembers: Usuarios con membresía activatotalRevenue: Suma de precios de membresías en el períodorevenueGrowth: Porcentaje de crecimiento respecto al período anterioractiveClasses: Clases conisActive: truetotalReservations: Reservas creadas en el períodoreservationGrowth: Crecimiento de reservas vs período anterioraverageAttendance: Porcentaje de reservas confirmadas sobre el total
-
Memberships:
- Conteo por estado: ACTIVE, EXPIRED, SUSPENDED
expiringThisMonth: Membresías activas que expiran en los próximos 30 díastotalRevenue: Ingresos por membresías en el período
-
Classes:
totalClasses: Clases activastotalSchedules: Horarios de clase activosaverageCapacity: Capacidad promedio de las clasesmostPopularClasses: Top 5 clases por número de reservas confirmadas
-
Trainers:
totalTrainersyactiveTrainerstotalSessions: Sesiones de entrenamiento en el períodoaverageRating: Promedio de valoraciones visiblestopRatedTrainers: Top 5 entrenadores por rating promedio
-
Recent Activity:
recentReservations: Últimas 10 reservas con clase y usuariorecentMembers: Últimos 10 usuarios registrados
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”period: Período de tiempo (day, week, month, quarter, year)startDate: Fecha de inicio personalizada (opcional)endDate: Fecha de fin personalizada (opcional)
Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.dashboard.$get({ query: { period: 'month' }})Obtener Usuarios
Section titled “Obtener Usuarios”Obtener todos los usuarios con filtrado y paginación.
- URL:
/api/v1/admin/users - Método:
GET - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene usuarios con filtros avanzados:
-
Construye filtros dinámicos:
role: Filtra por rol (MEMBER, TRAINER, ADMIN, STAFF)membershipStatus: Filtra por estado de membresíacreatedFrom/createdTo: Rango de fechas de creaciónsearch: Búsqueda por nombre o email (case-insensitive)
-
Consulta paginada que incluye:
- Información del usuario (id, email, emailVerified)
- Membresía (id, type, status, startDate, endDate)
- Contadores de reservas y sesiones de entrenamiento
-
Retorna lista paginada con datos completos del perfil
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”role: Filtrar por rol (MEMBER, TRAINER, ADMIN, STAFF)search: Buscar por nombre/emailmembershipStatus: Filtrar por status de membresíapage: Número de página (por defecto: 1)limit: Resultados por página (por defecto: 10)
Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.users.$get({ query: { role: 'MEMBER' }})Obtener Usuario por ID
Section titled “Obtener Usuario por ID”Obtener información detallada de un usuario específico.
- URL:
/api/v1/admin/users/:id - Método:
GET - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint obtiene el perfil completo de un usuario específico:
- Busca el UserProfile por ID
- Incluye relaciones extensas:
- Información del User (id, email, emailVerified, timestamps)
- Membresía completa
- Perfil de entrenador con contadores (sesiones, reviews)
- Últimas 10 reservas con información de clase
- Últimas 10 sesiones de entrenamiento con info del trainer
- Contadores totales (reservas, sesiones, posts, comentarios)
Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.users[':id'].$get({ param: { id: 'user_profile_id' }})Actualizar Rol de Usuario
Section titled “Actualizar Rol de Usuario”Actualizar el rol de un usuario.
- URL:
/api/v1/admin/users/:id/role - Método:
PATCH - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint actualiza el rol de un usuario:
- Verifica que el usuario existe
- Validación especial para TRAINER:
- Si el nuevo rol es TRAINER, verifica que exista un perfil de entrenador (
Trainer) asociado - Si no existe el perfil de trainer, lanza error 400
- Si el nuevo rol es TRAINER, verifica que exista un perfil de entrenador (
- Actualiza el rol en UserProfile
- Retorna el perfil actualizado con info básica del usuario
Errores Comunes
Section titled “Errores Comunes”400 Bad Request: El usuario debe tener un perfil de entrenador para asignar rol TRAINER
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "role": "TRAINER"}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.users[':id'].role.$patch({ param: { id: 'user_id' }, json: { role: 'TRAINER' }})Activar Membresía Manualmente
Section titled “Activar Membresía Manualmente”- URL:
/api/v1/admin/users/:id/membership/activate - Método:
POST - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint permite al administrador activar la membresía de un usuario de forma manual, útil para gestionar pagos en efectivo o excepciones.
Cuerpo de Solicitud
Section titled “Cuerpo de Solicitud”{ "type": "MONTHLY", "duration": 30, "price": 100, "paymentMethod": "CASH"}Respuesta
Section titled “Respuesta”{ "message": "Membresía activada exitosamente", "data": { "id": "cm...", "status": "ACTIVE", "startDate": "2023-10-27T00:00:00Z", "endDate": "2023-11-26T00:00:00Z" }}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.users[':id'].membership.activate.$post({ param: { id: 'user_id' }, json: { type: 'MONTHLY', duration: 30, price: 100, paymentMethod: 'CASH' }})Eliminar Usuario
Section titled “Eliminar Usuario”Eliminar un usuario del sistema.
- URL:
/api/v1/admin/users/:id - Método:
DELETE - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint elimina un usuario del sistema:
- Verifica reservas futuras: Cuenta reservas CONFIRMED con fecha futura
- Bloquea eliminación si tiene reservas confirmadas pendientes
- Obtiene el UserProfile con el User asociado
- Elimina el User (esto elimina en cascada el UserProfile por la relación)
- Retorna confirmación de eliminación
Errores Comunes
Section titled “Errores Comunes”400 Bad Request: No se puede eliminar porque tiene reservas confirmadas futuras
Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.users[':id'].$delete({ param: { id: 'user_id' }})Obtener Estadísticas de Reportes
Section titled “Obtener Estadísticas de Reportes”Obtener estadísticas de reportes para un período específico.
- URL:
/api/v1/admin/reports - Método:
GET - Autenticación Requerida: Sí Admin
Descripción Interna
Section titled “Descripción Interna”Este endpoint genera un reporte. Retorna los datos solicitados según los filtros especificados.
Parámetros de Consulta de Solicitud
Section titled “Parámetros de Consulta de Solicitud”startDate: Fecha de inicio (YYYY-MM-DD, opcional)endDate: Fecha de fin (YYYY-MM-DD, opcional)period: Período de agrupación (day, week, month, opcional)
Respuesta
Section titled “Respuesta”{ "message": "Reportes obtenidos exitosamente", "data": { "period": "month", "total": 15000, "growth": 5.2, "bySource": [], "byPeriod": [] }}Ejemplo de Cliente Hono
Section titled “Ejemplo de Cliente Hono”import { hcWithType } from '@vitality-gym/api/client'
const client = hcWithType('http://localhost:3000')
const res = await client.api.v1.admin.reports.$get({ query: { startDate: '2023-01-01', endDate: '2023-12-31' }})