- Add FIEL controller with upload, status, and delete endpoints - Add SAT controller with sync start, status, history, and retry - Add admin endpoints for cron job info and manual execution - Register new routes in app.ts - All endpoints protected with authentication middleware Endpoints added: - POST /api/fiel/upload - GET /api/fiel/status - DELETE /api/fiel - POST /api/sat/sync - GET /api/sat/sync/status - GET /api/sat/sync/history - GET /api/sat/sync/:id - POST /api/sat/sync/:id/retry - GET /api/sat/cron - POST /api/sat/cron/run Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
import type { Request, Response } from 'express';
|
|
import { uploadFiel, getFielStatus, deleteFiel } from '../services/fiel.service.js';
|
|
import type { FielUploadRequest } from '@horux/shared';
|
|
|
|
/**
|
|
* Sube y configura las credenciales FIEL
|
|
*/
|
|
export async function upload(req: Request, res: Response): Promise<void> {
|
|
try {
|
|
const tenantId = req.headers['x-tenant-id'] as string;
|
|
if (!tenantId) {
|
|
res.status(400).json({ error: 'Tenant ID requerido' });
|
|
return;
|
|
}
|
|
|
|
const { cerFile, keyFile, password } = req.body as FielUploadRequest;
|
|
|
|
if (!cerFile || !keyFile || !password) {
|
|
res.status(400).json({ error: 'cerFile, keyFile y password son requeridos' });
|
|
return;
|
|
}
|
|
|
|
const result = await uploadFiel(tenantId, cerFile, keyFile, password);
|
|
|
|
if (!result.success) {
|
|
res.status(400).json({ error: result.message });
|
|
return;
|
|
}
|
|
|
|
res.json({
|
|
message: result.message,
|
|
status: result.status,
|
|
});
|
|
} catch (error: any) {
|
|
console.error('[FIEL Controller] Error en upload:', error);
|
|
res.status(500).json({ error: 'Error interno del servidor' });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene el estado de la FIEL configurada
|
|
*/
|
|
export async function status(req: Request, res: Response): Promise<void> {
|
|
try {
|
|
const tenantId = req.headers['x-tenant-id'] as string;
|
|
if (!tenantId) {
|
|
res.status(400).json({ error: 'Tenant ID requerido' });
|
|
return;
|
|
}
|
|
|
|
const fielStatus = await getFielStatus(tenantId);
|
|
res.json(fielStatus);
|
|
} catch (error: any) {
|
|
console.error('[FIEL Controller] Error en status:', error);
|
|
res.status(500).json({ error: 'Error interno del servidor' });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Elimina las credenciales FIEL
|
|
*/
|
|
export async function remove(req: Request, res: Response): Promise<void> {
|
|
try {
|
|
const tenantId = req.headers['x-tenant-id'] as string;
|
|
if (!tenantId) {
|
|
res.status(400).json({ error: 'Tenant ID requerido' });
|
|
return;
|
|
}
|
|
|
|
const deleted = await deleteFiel(tenantId);
|
|
|
|
if (!deleted) {
|
|
res.status(404).json({ error: 'No hay FIEL configurada' });
|
|
return;
|
|
}
|
|
|
|
res.json({ message: 'FIEL eliminada correctamente' });
|
|
} catch (error: any) {
|
|
console.error('[FIEL Controller] Error en remove:', error);
|
|
res.status(500).json({ error: 'Error interno del servidor' });
|
|
}
|
|
}
|