Guía de Arquitectura Limpia (para Jóvenes Desarrolladores)
¡Hola! Entender la Arquitectura Limpia es como aprender a organizar tu cuarto de una forma súper eficiente. Al principio puede parecer mucho trabajo, pero una vez que lo entiendes, todo es más fácil de encontrar, limpiar y añadir cosas nuevas sin desordenar lo demás.
La arquitectura limpia es una forma de organizar tu proyecto para que sea fácil de entender, probar y cambiar sin romper todo. Piensa en capas con reglas claras: la lógica del negocio está en el centro, y todo lo demás (web, base de datos, correo, autenticación) son “detalles” que pueden cambiar sin tocar el corazón.
La Idea Principal: Una Cebolla 🧅 (o un Castillo 🏰)
Imagina que tu aplicación es una cebolla con varias capas, o un castillo con murallas.
- El Centro (Domain): En el corazón de la cebolla o en el centro del castillo están las joyas de la corona: las reglas de negocio. Esto es lo que hace que tu aplicación sea única. Por ejemplo, en tu proyecto, una regla de negocio podría ser “un usuario no puede existir sin una compañía”. Esta capa es la más importante y protegida. No sabe nada del mundo exterior (ni de bases de datos, ni de internet, ni de frameworks).
- Las Capas Exteriores (Application, Data, Infrastructure): A medida que te alejas del centro, las capas se vuelven más “técnicas” y menos “de negocio”. Son los detalles de implementación: cómo muestras las cosas en una web, cómo las guardas en una base de datos, cómo envías un email.
La regla de oro, y lo más importante que debes recordar, es: Las dependencias solo apuntan hacia adentro.
Esto significa que una capa exterior puede conocer a una capa interior, pero una capa interior NUNCA debe saber nada de una capa exterior. El Domain no sabe qué base de datos usas, pero la capa Data (que maneja la base de datos) sí sabe qué es un User del Domain.
Las Capas en tu Proyecto
src/ ├── domain/ # 💎 El Corazón (Las Reglas del Negocio) ├── application/ # 👨💼 El Orquestador (Coordina todo) ├── data/ # 📚 La Biblioteca (Sabe cómo guardar y leer datos) └── infrastructure/ # 🔌 Los Enchufes (Herramientas externas como email, websockets)
- domain (El Corazón 💎)
Aquí vive la lógica pura de tu negocio.- entities/: Son los conceptos clave de tu negocio. Piensa en ellos como sustantivos: User, Role, Company. Son clases u objetos simples que solo tienen datos y lógica que no depende de nada externo.
- usecases/ (Casos de Uso): Son las acciones o verbos de tu negocio: CrearNuevoUsuario, ActualizarRol, CalcularExpiracionDeLicencia. Un caso de uso orquesta las entidades para cumplir una regla de negocio.
Ejemplo: Un CreateUserUseCase podría decir: “Para crear un usuario, necesito su email y contraseña. Debo verificar que el email no exista ya. Si no existe, creo un nuevo objeto User y lo guardo”. Fíjate que dice “lo guardo”, pero no sabe cómo ni dónde se guarda.
- domain (El Corazón 💎)
- application (El Orquestador 👨💼)
Esta capa recibe peticiones del mundo exterior y utiliza los usecases del dominio para hacer el trabajo.- controllers/: Son como los recepcionistas. Atienden las llamadas (peticiones HTTP), recogen los datos (req.body, req.params) y se los pasan al service adecuado. Cuando el trabajo está hecho, devuelven una respuesta.
- services/: Son los gerentes de proyecto. Un controller le dice a un service: “Oye, crea este usuario”. El service sabe qué usecase llamar (CreateUserUseCase) y qué hacer antes o después (por ejemplo, registrar un log de auditoría o enviar una notificación por WebSocket).
- data (La Biblioteca 📚)
Esta capa es la implementación concreta de cómo se guardan y recuperan los datos.- repositories/: El domain define un “contrato” (una interfaz) diciendo: “Necesito algo que pueda guardarUsuario(user) y buscarUsuarioPorEmail(email)“. Aquí, en data, es donde creas la clase que cumple ese contrato.
- models/: Aquí están los modelos de Sequelize. El repository usa estos modelos para hablar con la base de datos. Esta es la única capa que sabe que estás usando MariaDB/MySQL y Sequelize.
- infrastructure (Los Enchufes 🔌)
Todo lo demás que es un detalle técnico y no es lógica de negocio ni de la aplicación.- auth/: Lógica para crear JWTs, hashear contraseñas.
- mail/: Configuración para enviar correos con Nodemailer.
- websocket/: Lógica para emitir eventos con Socket.IO.