Files
HoruxDespachosNuevo/apps/api/src/controllers/admin-clientes.controller.ts

47 lines
1.9 KiB
TypeScript

import type { Request, Response, NextFunction } from 'express';
import * as svc from '../services/admin-clientes.service.js';
import { isPlatformStaff } from '../utils/platform-admin.js';
import { AppError } from '../middlewares/error.middleware.js';
async function requireStaff(req: Request) {
if (!req.user?.userId) throw new AppError(401, 'No autenticado');
const isStaff = await isPlatformStaff(req.user.userId);
if (!isStaff) throw new AppError(403, 'Acceso restringido a staff de plataforma');
}
/**
* Stats de gestión de clientes.
*
* Query params:
* - `from` (YYYY-MM-DD): inicio del rango. Default: primer día del mes en curso.
* - `to` (YYYY-MM-DD): fin del rango. Default: último día del mes en curso.
*/
export async function getStats(req: Request, res: Response, next: NextFunction) {
try {
await requireStaff(req);
const now = new Date();
const defaultFrom = new Date(now.getFullYear(), now.getMonth(), 1);
const defaultTo = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, 999);
const fromStr = String(req.query.from || '').trim();
const toStr = String(req.query.to || '').trim();
const from = fromStr ? new Date(fromStr + 'T00:00:00') : defaultFrom;
const to = toStr ? new Date(toStr + 'T23:59:59.999') : defaultTo;
if (isNaN(from.getTime()) || isNaN(to.getTime())) {
return next(new AppError(400, 'Rango de fechas inválido'));
}
const stats = await svc.getClientesStats({ from, to });
return res.json(stats);
} catch (err) { return next(err); }
}
export async function listUsuarios(req: Request, res: Response, next: NextFunction) {
try {
await requireStaff(req);
const tenantId = String(req.params.tenantId || '');
if (!tenantId) return next(new AppError(400, 'tenantId requerido'));
const usuarios = await svc.getTenantUsuarios(tenantId);
return res.json({ data: usuarios });
} catch (err) { return next(err); }
}