# GuΓ­a de Desarrollo - Nexus ## πŸ—οΈ Arquitectura La aplicaciΓ³n sigue una arquitectura limpia y modular: ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ index.ts (Entry Point) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ core/Application.ts β”‚ β”‚ (OrquestaciΓ³n y ciclo de vida) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Services β”‚ β”‚ Utils β”‚ β”‚ (LΓ³gica de β”‚ β”‚ (Helpers) β”‚ β”‚ negocio) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ“ Crear un Nuevo Servicio ### 1. Crear el archivo del servicio ```typescript // src/services/MiServicio.ts import logger from '../utils/logger'; import { ServiceResponse } from '../types'; export class MiServicio { async hacerAlgo(parametro: string): Promise> { try { logger.debug('MiServicio procesando...', { parametro }); // Tu lΓ³gica aquΓ­ const resultado = `Procesado: ${parametro}`; return { success: true, data: resultado, timestamp: new Date(), }; } catch (error) { logger.error('Error en MiServicio:', error); return { success: false, error: error instanceof Error ? error.message : 'Error desconocido', timestamp: new Date(), }; } } } ``` ### 2. Usar el servicio en tu aplicaciΓ³n ```typescript // src/index.ts import { MiServicio } from './services/MiServicio'; const servicio = new MiServicio(); const resultado = await servicio.hacerAlgo('datos'); ``` ## πŸ”§ Agregar Configuraciones ### 1. Agregar variables de entorno ```bash # .env MI_VARIABLE=valor ``` ### 2. Actualizar el tipo AppConfig ```typescript // src/types/index.ts export interface AppConfig { // ...existentes miVariable: string; } ``` ### 3. Cargar la configuraciΓ³n ```typescript // src/config/index.ts export const config: AppConfig = { // ...existentes miVariable: process.env.MI_VARIABLE || 'default', }; ``` ## πŸ› οΈ Utilidades Comunes ### Logger ```typescript import logger from './utils/logger'; logger.debug('Mensaje de depuraciΓ³n'); logger.info('InformaciΓ³n'); logger.warn('Advertencia'); logger.error('Error', error); ``` ### Manejo de Errores ```typescript try { // cΓ³digo } catch (error) { logger.error('DescripciΓ³n del error:', error); throw error; // o manejar de otra forma } ``` ## πŸš€ Agregar API REST (Opcional) ### 1. Instalar Express ```bash npm install express npm install -D @types/express ``` ### 2. Crear servidor HTTP ```typescript // src/core/Server.ts import express from 'express'; import { config } from '../config'; import logger from '../utils/logger'; export class Server { private app = express(); constructor() { this.setupMiddleware(); this.setupRoutes(); } private setupMiddleware() { this.app.use(express.json()); } private setupRoutes() { this.app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date() }); }); } async start() { return new Promise((resolve) => { this.app.listen(config.appPort, () => { logger.info(`🌐 Servidor escuchando en puerto ${config.appPort}`); resolve(); }); }); } } ``` ### 3. Integrar en Application.ts ```typescript // src/core/Application.ts import { Server } from './Server'; export class Application { private server?: Server; async initialize(): Promise { // ...cΓ³digo existente this.server = new Server(); await this.server.start(); } } ``` ## πŸ—„οΈ Agregar Base de Datos ### PostgreSQL con Prisma ```bash npm install @prisma/client npm install -D prisma npx prisma init ``` ### MongoDB con Mongoose ```bash npm install mongoose npm install -D @types/mongoose ``` ## πŸ§ͺ Agregar Tests ### 1. Instalar Jest ```bash npm install -D jest @types/jest ts-jest ``` ### 2. Configurar Jest ```javascript // jest.config.js module.exports = { preset: 'ts-jest', testEnvironment: 'node', roots: ['/src'], testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'], }; ``` ### 3. Crear tests ```typescript // src/services/__tests__/ExampleService.test.ts import { ExampleService } from '../ExampleService'; describe('ExampleService', () => { it('deberΓ­a procesar correctamente', async () => { const service = new ExampleService(); const resultado = await service.execute('test'); expect(resultado.success).toBe(true); expect(resultado.data).toContain('test'); }); }); ``` ## πŸ“¦ Buenas PrΓ‘cticas 1. **Siempre usa tipos TypeScript** - No uses `any` 2. **Registra eventos importantes** - Usa el logger liberalmente 3. **Maneja errores apropiadamente** - Nunca dejes un catch vacΓ­o 4. **Escribe cΓ³digo limpio** - Usa prettier y eslint 5. **Documenta funciones complejas** - Usa JSDoc 6. **Separa responsabilidades** - Un servicio, una responsabilidad 7. **Usa variables de entorno** - Para configuraciones sensibles ## πŸ”„ Flujo de Trabajo Recomendado 1. **Desarrollo**: `npm run dev` 2. **Linting**: `npm run lint` 3. **Formateo**: `npm run format` 4. **CompilaciΓ³n**: `npm run build` 5. **ProducciΓ³n**: `npm start` ## πŸ“š Recursos Adicionales - [TypeScript Handbook](https://www.typescriptlang.org/docs/) - [Node.js Best Practices](https://github.com/goldbergyoni/nodebestpractices) - [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)