"use strict"; /** * Server Entry Point * MVP Sistema Administración de Obra e INFONAVIT * * @author Backend-Agent * @date 2025-11-20 */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const express_1 = __importDefault(require("express")); const cors_1 = __importDefault(require("cors")); const helmet_1 = __importDefault(require("helmet")); const morgan_1 = __importDefault(require("morgan")); const dotenv_1 = __importDefault(require("dotenv")); const typeorm_config_1 = require("./shared/database/typeorm.config"); // Cargar variables de entorno dotenv_1.default.config(); const app = (0, express_1.default)(); const PORT = process.env.APP_PORT || 3000; const API_VERSION = process.env.API_VERSION || 'v1'; /** * Middlewares */ app.use((0, helmet_1.default)()); // Seguridad HTTP headers app.use((0, cors_1.default)({ origin: process.env.CORS_ORIGIN?.split(',') || '*', credentials: process.env.CORS_CREDENTIALS === 'true', })); app.use((0, morgan_1.default)(process.env.LOG_FORMAT || 'dev')); // Logging app.use(express_1.default.json()); // Parse JSON bodies app.use(express_1.default.urlencoded({ extended: true })); // Parse URL-encoded bodies /** * Health Check */ app.get('/health', (_req, res) => { res.status(200).json({ status: 'ok', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV || 'development', version: API_VERSION, }); }); /** * API Routes */ const controllers_1 = require("./modules/construction/controllers"); const auth_controller_1 = require("./modules/auth/controllers/auth.controller"); const users_controller_1 = require("./modules/users/controllers/users.controller"); const controllers_2 = require("./modules/budgets/controllers"); const controllers_3 = require("./modules/progress/controllers"); const controllers_4 = require("./modules/estimates/controllers"); const controllers_5 = require("./modules/hr/controllers"); const controllers_6 = require("./modules/hse/controllers"); const controllers_7 = require("./modules/inventory/controllers"); const controllers_8 = require("./modules/purchase/controllers"); const controllers_9 = require("./modules/infonavit/controllers"); const controllers_10 = require("./modules/quality/controllers"); const controllers_11 = require("./modules/contracts/controllers"); const controllers_12 = require("./modules/reports/controllers"); const controllers_13 = require("./modules/admin/controllers"); const controllers_14 = require("./modules/bidding/controllers"); // TEMPORARILY DISABLED - Finance module requires structural fixes // import { createAccountingController, createAPController, createARController, createCashFlowController, createBankReconciliationController, createReportsController } from './modules/finance/controllers'; // Root API info app.get(`/api/${API_VERSION}`, (_req, res) => { res.status(200).json({ message: 'API MVP Sistema Administración de Obra', version: API_VERSION, endpoints: { health: '/health', docs: `/api/${API_VERSION}/docs`, auth: `/api/${API_VERSION}/auth`, users: `/api/${API_VERSION}/users`, proyectos: `/api/${API_VERSION}/proyectos`, fraccionamientos: `/api/${API_VERSION}/fraccionamientos`, etapas: `/api/${API_VERSION}/etapas`, manzanas: `/api/${API_VERSION}/manzanas`, lotes: `/api/${API_VERSION}/lotes`, prototipos: `/api/${API_VERSION}/prototipos`, conceptos: `/api/${API_VERSION}/conceptos`, presupuestos: `/api/${API_VERSION}/presupuestos`, avances: `/api/${API_VERSION}/avances`, bitacora: `/api/${API_VERSION}/bitacora`, estimaciones: `/api/${API_VERSION}/estimaciones`, anticipos: `/api/${API_VERSION}/anticipos`, 'fondos-garantia': `/api/${API_VERSION}/fondos-garantia`, retenciones: `/api/${API_VERSION}/retenciones`, puestos: `/api/${API_VERSION}/puestos`, empleados: `/api/${API_VERSION}/empleados`, capacitaciones: `/api/${API_VERSION}/capacitaciones`, incidentes: `/api/${API_VERSION}/incidentes`, requisiciones: `/api/${API_VERSION}/requisiciones`, consumos: `/api/${API_VERSION}/consumos`, comparativos: `/api/${API_VERSION}/comparativos`, derechohabientes: `/api/${API_VERSION}/derechohabientes`, asignaciones: `/api/${API_VERSION}/asignaciones`, inspections: `/api/${API_VERSION}/inspections`, tickets: `/api/${API_VERSION}/tickets`, contracts: `/api/${API_VERSION}/contracts`, subcontractors: `/api/${API_VERSION}/subcontractors`, reports: `/api/${API_VERSION}/reports`, dashboards: `/api/${API_VERSION}/dashboards`, kpis: `/api/${API_VERSION}/kpis`, 'cost-centers': `/api/${API_VERSION}/cost-centers`, 'audit-logs': `/api/${API_VERSION}/audit-logs`, settings: `/api/${API_VERSION}/settings`, backups: `/api/${API_VERSION}/backups`, opportunities: `/api/${API_VERSION}/opportunities`, bids: `/api/${API_VERSION}/bids`, 'bid-budgets': `/api/${API_VERSION}/bid-budgets`, 'bid-analytics': `/api/${API_VERSION}/bid-analytics`, accounting: `/api/${API_VERSION}/accounting`, 'accounts-payable': `/api/${API_VERSION}/accounts-payable`, 'accounts-receivable': `/api/${API_VERSION}/accounts-receivable`, 'cash-flow': `/api/${API_VERSION}/cash-flow`, 'bank-reconciliation': `/api/${API_VERSION}/bank-reconciliation`, 'financial-reports': `/api/${API_VERSION}/financial-reports`, }, }); }); // Construction Module Routes app.use(`/api/${API_VERSION}/proyectos`, controllers_1.proyectoController); app.use(`/api/${API_VERSION}/fraccionamientos`, controllers_1.fraccionamientoController); // Auth y Users Module Routes - Se inicializan después de la conexión a BD let authController; let usersController; /** * 404 Handler */ app.use((req, res) => { res.status(404).json({ error: 'Not Found', message: `Cannot ${req.method} ${req.path}`, }); }); /** * Error Handler */ app.use((err, _req, res, _next) => { console.error('Error:', err); res.status(500).json({ error: 'Internal Server Error', message: process.env.NODE_ENV === 'development' ? err.message : 'Something went wrong', }); }); /** * Inicializar Base de Datos y Servidor */ async function bootstrap() { try { // Conectar a base de datos console.log('🔌 Conectando a base de datos...'); await typeorm_config_1.AppDataSource.initialize(); console.log('✅ Base de datos conectada'); // Inicializar Auth Controller (requiere DataSource) authController = (0, auth_controller_1.createAuthController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/auth`, authController); console.log('🔐 Auth module inicializado'); // Inicializar Users Controller (requiere DataSource) usersController = (0, users_controller_1.createUsersController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/users`, usersController); console.log('👥 Users module inicializado'); // Inicializar Construction Controllers (requieren DataSource para auth) const etapaController = (0, controllers_1.createEtapaController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/etapas`, etapaController); const manzanaController = (0, controllers_1.createManzanaController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/manzanas`, manzanaController); const loteController = (0, controllers_1.createLoteController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/lotes`, loteController); const prototipoController = (0, controllers_1.createPrototipoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/prototipos`, prototipoController); console.log('🏗️ Construction module inicializado'); // Inicializar Budgets Controllers (requieren DataSource para auth) const conceptoController = (0, controllers_2.createConceptoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/conceptos`, conceptoController); const presupuestoController = (0, controllers_2.createPresupuestoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/presupuestos`, presupuestoController); console.log('💰 Budgets module inicializado'); // Inicializar Progress Controllers (requieren DataSource para auth) const avanceObraController = (0, controllers_3.createAvanceObraController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/avances`, avanceObraController); const bitacoraObraController = (0, controllers_3.createBitacoraObraController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/bitacora`, bitacoraObraController); console.log('📊 Progress module inicializado'); // Inicializar Estimates Controllers (requieren DataSource para auth) const estimacionController = (0, controllers_4.createEstimacionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/estimaciones`, estimacionController); const anticipoController = (0, controllers_4.createAnticipoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/anticipos`, anticipoController); const fondoGarantiaController = (0, controllers_4.createFondoGarantiaController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/fondos-garantia`, fondoGarantiaController); const retencionController = (0, controllers_4.createRetencionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/retenciones`, retencionController); console.log('📝 Estimates module inicializado'); // Inicializar HR Controllers (requieren DataSource para auth) const puestoController = (0, controllers_5.createPuestoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/puestos`, puestoController); const employeeController = (0, controllers_5.createEmployeeController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/empleados`, employeeController); console.log('👷 HR module inicializado'); // Inicializar HSE Controllers (requieren DataSource para auth) const capacitacionController = (0, controllers_6.createCapacitacionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/capacitaciones`, capacitacionController); const incidenteController = (0, controllers_6.createIncidenteController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/incidentes`, incidenteController); console.log('🦺 HSE module inicializado'); // Inicializar Inventory Controllers (requieren DataSource para auth) const requisicionController = (0, controllers_7.createRequisicionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/requisiciones`, requisicionController); const consumoObraController = (0, controllers_7.createConsumoObraController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/consumos`, consumoObraController); console.log('📦 Inventory module inicializado'); // Inicializar Purchase Controllers (requieren DataSource para auth) const comparativoController = (0, controllers_8.createComparativoController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/comparativos`, comparativoController); console.log('🛒 Purchase module inicializado'); // Inicializar Infonavit Controllers (requieren DataSource para auth) const derechohabienteController = (0, controllers_9.createDerechohabienteController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/derechohabientes`, derechohabienteController); const asignacionController = (0, controllers_9.createAsignacionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/asignaciones`, asignacionController); console.log('🏠 Infonavit module inicializado'); // Inicializar Quality Controllers (requieren DataSource para auth) const inspectionController = (0, controllers_10.createInspectionController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/inspections`, inspectionController); const ticketController = (0, controllers_10.createTicketController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/tickets`, ticketController); console.log('✅ Quality module inicializado'); // Inicializar Contracts Controllers (requieren DataSource para auth) const contractController = (0, controllers_11.createContractController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/contracts`, contractController); const subcontractorController = (0, controllers_11.createSubcontractorController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/subcontractors`, subcontractorController); console.log('📄 Contracts module inicializado'); // Inicializar Reports Controllers (requieren DataSource para auth) const reportController = (0, controllers_12.createReportController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/reports`, reportController); const dashboardController = (0, controllers_12.createDashboardController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/dashboards`, dashboardController); const kpiController = (0, controllers_12.createKpiController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/kpis`, kpiController); console.log('📈 Reports module inicializado'); // Inicializar Admin Controllers (requieren DataSource para auth) const costCenterController = (0, controllers_13.createCostCenterController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/cost-centers`, costCenterController); const auditLogController = (0, controllers_13.createAuditLogController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/audit-logs`, auditLogController); const systemSettingController = (0, controllers_13.createSystemSettingController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/settings`, systemSettingController); const backupController = (0, controllers_13.createBackupController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/backups`, backupController); console.log('⚙️ Admin module inicializado'); // Inicializar Bidding Controllers (requieren DataSource para auth) const opportunityController = (0, controllers_14.createOpportunityController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/opportunities`, opportunityController); const bidController = (0, controllers_14.createBidController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/bids`, bidController); const bidBudgetController = (0, controllers_14.createBidBudgetController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/bid-budgets`, bidBudgetController); const bidAnalyticsController = (0, controllers_14.createBidAnalyticsController)(typeorm_config_1.AppDataSource); app.use(`/api/${API_VERSION}/bid-analytics`, bidAnalyticsController); console.log('📋 Bidding module inicializado'); // TEMPORARILY DISABLED - Finance module requires structural fixes // Inicializar Finance Controllers (requieren DataSource para auth) // const accountingController = createAccountingController(AppDataSource); // app.use(`/api/${API_VERSION}/accounting`, accountingController); // const apController = createAPController(AppDataSource); // app.use(`/api/${API_VERSION}/accounts-payable`, apController); // const arController = createARController(AppDataSource); // app.use(`/api/${API_VERSION}/accounts-receivable`, arController); // const cashFlowController = createCashFlowController(AppDataSource); // app.use(`/api/${API_VERSION}/cash-flow`, cashFlowController); // const bankReconciliationController = createBankReconciliationController(AppDataSource); // app.use(`/api/${API_VERSION}/bank-reconciliation`, bankReconciliationController); // const financialReportsController = createReportsController(AppDataSource); // app.use(`/api/${API_VERSION}/financial-reports`, financialReportsController); console.log('💵 Finance module DISABLED - pending structural fixes'); // Iniciar servidor app.listen(PORT, () => { console.log('🚀 Servidor iniciado'); console.log(`📍 URL: http://localhost:${PORT}`); console.log(`📍 API: http://localhost:${PORT}/api/${API_VERSION}`); console.log(`📍 Health: http://localhost:${PORT}/health`); console.log(`🌍 Entorno: ${process.env.NODE_ENV || 'development'}`); }); } catch (error) { console.error('❌ Error al iniciar servidor:', error); process.exit(1); } } // Iniciar aplicación bootstrap(); exports.default = app; //# sourceMappingURL=server.js.map