UNPKG

ci-validation

Version:

🇺🇾 Complete TypeScript/JavaScript library for validating Uruguayan CI (Cédula de Identidad) with official algorithm and government service integration

279 lines 10.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CiController = void 0; class CiController { constructor(ciValidator, ciService) { this.ciValidator = ciValidator; this.ciService = ciService; } /** * Health check endpoint */ async healthCheck(req, res) { try { const healthResponse = { status: "ok", timestamp: new Date().toISOString(), uptime: process.uptime(), version: process.env.npm_package_version || "1.0.0", }; res.status(200).json(healthResponse); } catch (error) { const errorResponse = { status: "error", timestamp: new Date().toISOString(), }; res.status(500).json(errorResponse); } } /** * Valida una cédula de identidad uruguaya */ async validateCi(req, res) { // Start timing const startTime = Date.now(); try { const { ci } = req.body; if (!ci) { const executionTime = Date.now() - startTime; const errorResponse = { success: false, error: 'El campo "ci" es requerido', code: "MISSING_CI", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: 0, }, }; res.status(400).json(errorResponse); return; } // Start validation timing const validationStartTime = Date.now(); // Validar formato básico if (!this.ciValidator.validateFormat(ci)) { const executionTime = Date.now() - startTime; const validationTime = Date.now() - validationStartTime; const errorResponse = { success: false, error: "Formato de cédula inválido. Debe contener entre 7 y 8 dígitos numéricos", code: "INVALID_FORMAT", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: validationTime, }, }; res.status(400).json(errorResponse); return; } // Validar cédula completa const isValid = this.ciValidator.validate(ci); if (!isValid) { const executionTime = Date.now() - startTime; const validationTime = Date.now() - validationStartTime; const errorResponse = { success: false, error: "Cédula inválida: dígito verificador incorrecto", code: "INVALID_CI", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: validationTime, }, }; res.status(400).json(errorResponse); return; } // End validation timing, start query timing const validationTime = Date.now() - validationStartTime; const queryStartTime = Date.now(); // Si es válida, consultar información const normalizedCi = this.ciValidator.normalize(ci); const queryResult = await this.ciService.queryCiInfo(normalizedCi); // End query timing const queryTime = Date.now() - queryStartTime; const totalExecutionTime = Date.now() - startTime; const validationData = { ci: ci, isValid: true, normalizedCi: normalizedCi, info: queryResult.success ? queryResult.data : queryResult.error, }; const response = { success: true, data: validationData, timestamp: new Date().toISOString(), executionTime: { total: totalExecutionTime, validation: validationTime, query: queryTime, }, }; res.status(200).json(response); } catch (error) { const totalExecutionTime = Date.now() - startTime; const errorResponse = { success: false, error: "Error interno del servidor", code: "INTERNAL_ERROR", timestamp: new Date().toISOString(), executionTime: { total: totalExecutionTime, validation: 0, }, }; console.error("Error en validateCi:", error); res.status(500).json(errorResponse); } } /** * Valida una cédula de identidad uruguaya mediante query parameter */ async validateCiQuery(req, res) { // Start timing const startTime = Date.now(); try { const ci = req.query.ci; if (!ci) { const executionTime = Date.now() - startTime; const errorResponse = { success: false, error: 'El parámetro "ci" es requerido en la query string', code: "MISSING_CI", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: 0, }, }; res.status(400).json(errorResponse); return; } // Start validation timing const validationStartTime = Date.now(); // Validar formato básico if (!this.ciValidator.validateFormat(ci)) { const executionTime = Date.now() - startTime; const validationTime = Date.now() - validationStartTime; const errorResponse = { success: false, error: "Formato de cédula inválido. Debe contener entre 7 y 8 dígitos numéricos", code: "INVALID_FORMAT", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: validationTime, }, }; res.status(400).json(errorResponse); return; } // Validar cédula completa const isValid = this.ciValidator.validate(ci); if (!isValid) { const executionTime = Date.now() - startTime; const validationTime = Date.now() - validationStartTime; const errorResponse = { success: false, error: "Cédula inválida: dígito verificador incorrecto", code: "INVALID_CI", timestamp: new Date().toISOString(), executionTime: { total: executionTime, validation: validationTime, }, }; res.status(400).json(errorResponse); return; } // End validation timing, start query timing const validationTime = Date.now() - validationStartTime; const queryStartTime = Date.now(); // Si es válida, consultar información const normalizedCi = this.ciValidator.normalize(ci); const queryResult = await this.ciService.queryCiInfo(normalizedCi); // End query timing const queryTime = Date.now() - queryStartTime; const totalExecutionTime = Date.now() - startTime; const validationData = { ci: ci, isValid: true, normalizedCi: normalizedCi, info: queryResult.success ? queryResult.data : queryResult.error, }; const response = { success: true, data: validationData, timestamp: new Date().toISOString(), executionTime: { total: totalExecutionTime, validation: validationTime, query: queryTime, }, }; res.status(200).json(response); } catch (error) { const totalExecutionTime = Date.now() - startTime; const errorResponse = { success: false, error: "Error interno del servidor", code: "INTERNAL_ERROR", timestamp: new Date().toISOString(), executionTime: { total: totalExecutionTime, validation: 0, }, }; console.error("Error en validateCiQuery:", error); res.status(500).json(errorResponse); } } /** * Endpoint de demostración con una cédula de ejemplo */ async demo(req, res) { try { // Cédula de ejemplo válida (esta es ficticia pero con formato correcto) const demoCi = "19119365"; const isValid = this.ciValidator.validate(demoCi); const normalizedCi = this.ciValidator.normalize(demoCi); let info = "Cédula de demostración - Sin consulta real al servicio"; // Si la cédula es válida, podemos intentar la consulta real if (isValid) { const queryResult = await this.ciService.queryCiInfo(normalizedCi); if (queryResult.success) { info = queryResult.data || info; } } const validationData = { ci: demoCi, isValid: isValid, normalizedCi: normalizedCi, info: info, }; const response = { success: true, data: validationData, timestamp: new Date().toISOString(), }; res.status(200).json(response); } catch (error) { const errorResponse = { success: false, error: "Error en el endpoint de demostración", code: "DEMO_ERROR", timestamp: new Date().toISOString(), }; console.error("Error en demo:", error); res.status(500).json(errorResponse); } } } exports.CiController = CiController; //# sourceMappingURL=CiController.js.map