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 { try { const tenantId = req.user!.tenantId; const { cerFile, keyFile, password } = req.body as FielUploadRequest; if (!cerFile || !keyFile || !password) { res.status(400).json({ error: 'cerFile, keyFile y password son requeridos' }); return; } // Validate file sizes (typical .cer/.key files are under 10KB, base64 ~33% larger) const MAX_FILE_SIZE = 50_000; // 50KB base64 ≈ ~37KB binary if (cerFile.length > MAX_FILE_SIZE || keyFile.length > MAX_FILE_SIZE) { res.status(400).json({ error: 'Los archivos FIEL son demasiado grandes (máx 50KB)' }); return; } if (password.length > 256) { res.status(400).json({ error: 'Contraseña FIEL demasiado larga' }); 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 { try { const tenantId = req.user!.tenantId; 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 { try { const tenantId = req.user!.tenantId; 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' }); } }