Consumiendo Arquitectura Hexagonal en Aplicaciones Node.js con Express
Heads up!
This summary and transcript were automatically generated using AI with the Free YouTube Transcript Summary Tool by LunaNotes.
Generate a summary for freeIf you found this summary useful, consider buying us a coffee. It would help us a lot!
Introducción
En el desarrollo de software moderno, la arquitectura hexagonal se presenta como una potente opción que permite estructurar las aplicaciones de manera que se facilite la mantenibilidad y la escalabilidad. En este artículo, exploraremos cómo implementar la arquitectura hexagonal en una aplicación de Node.js utilizando Express. Este tutorial es ideal para quienes ya tienen conocimientos básicos de programación y desean profundizar en patrones de diseño de software. Si aún no has seguido la series anteriores sobre dominio, aplicación e infraestructura, te invitamos a hacerlo para entender mejor las bases de lo que vamos a construir aquí.
Vamos a utilizar el módulo de usuarios, que hemos creado en videos previos, y en este tutorial, lo llevaremos a la práctica. A través de un ejemplo sencillo, te mostraré cómo manejar las interacciones externas, las peticiones de usuarios y cómo estructurar el código con las capas de dominio y aplicación.
Configurando el Proyecto
Para comenzar, asegúrate de tener el ambiente de desarrollo preparado. Usaremos TypeScript junto con Node.js. Primero, debemos instalar express
, typescript
, y ts-node
como dependencias de desarrollo.
npm install express typescript ts-node --save-dev
Asegúrate de inicializar tu proyecto de TypeScript:
npx tsc --init
Esto generará un archivo tsconfig.json
donde podrás realizar las configuraciones necesarias para tu proyecto.
Estructura de la Aplicación
Al implementar esta arquitectura, es fundamental seguir la separación de responsabilidades, lo que nos permitirá reutilizar los módulos en otras aplicaciones.
Capas de Arquitectura Hexagonal
- Dominio: Contiene la lógica de negocio.
- Aplicación: Se encarga de gestionar las reglas de la aplicación y orquestar las interacciones del dominio.
- Infraestructura: Maneja la comunicación con el mundo exterior (p. ej., bases de datos, APIs externas).
Configuración de Express
Creamos nuestro archivo principal (main.ts
) e importamos Express:
import express, { Request, Response, NextFunction } from 'express';
const app = express();
const PORT = 3000;
app.use(express.json()); // Middleware para parsear JSON
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Creando el Router de Usuarios
Definimos un router para manejar las rutas de usuarios:
import { Router } from 'express';
const userRouter = Router();
userRouter.get('/users', (req, res, next) => {
// Lógica para obtener usuarios
});
// Otros métodos como POST, PUT y DELETE
export default userRouter;
Controladores
Creamos controladores para manejar la lógica de negocio y mapear las respuestas:
class UserController {
async getAll(req: Request, res: Response, next: NextFunction) {
try {
// lógica para obtener a todos los usuarios
} catch (error) {
next(error);
}
}
}
Manejo de Errores
Configura el middleware para manejar errores globalmente:
app.use((err: any, req: Request, res: Response, next: NextFunction) => {
const status = err.status || 500;
res.status(status).json({ message: err.message });
});
Implementación de Casos de Uso
Cada caso de uso debe ser una función que interactúa con el dominio. Podemos implementar un caso de uso para crear un nuevo usuario:
async createUser(data: UserData) {
// lógica para crear un nuevo usuario
}
Realizando Peticiones HTTP
Usaremos una herramienta como Thunder Client para realizar pruebas sobre nuestras rutas y verificar que todo funcione correctamente. Realiza peticiones a las rutas definidas para asegurarte de que lo que implementamos cumple con lo esperado.
Conclusión
Como hemos visto, implementar la arquitectura hexagonal utilizando Express en Node.js es un proceso claro si seguimos un conjunto de pasos bien definidos. Esta arquitectura no solo mejora la mantenibilidad y escalabilidad de la aplicación, sino que también nos permite reutilizar componentes en futuras implementaciones. En futuros tutoriales, exploraremos cómo llevar los mismos conceptos a un entorno de NestJS, permitiéndonos diversificar aún más nuestras aplicaciones.
el día de hoy vamos a ver en un video práctico Cómo podemos consumir arquitectura hexagonal o módulos de
arquitectura hexagonal en una aplicación de no.js específicamente usando Express entonces para este video vamos a usar
todo el módulo de usuarios que hemos creado en los videos anteriores si aún no ha sido te lo voy a dejar en la
descripción o aquí arriba en las tarjetas para que puedas ver el video de dominio aplicación e infraestructura Y
entiendas todo lo que vamos a hacer en este video de acuerdo Entonces este ya viene a ser un video donde vamos a poner
en práctica en una ación real todos los conceptos de arquitectura hexagonal Entonces vamos a ver cómo estará
haciendo lo que vamos a crear este exterior representa todo lo que no es nuestra aplicación pero interactúa con
ella o puede interactuar con ella como puede ser un frontend como puede ser un cliente http o un usuario que está
intentando acceder a nuestros recursos el flujo vendría a ser primero el exterior que ya definimos Qué es vendría
a ser una petición al recurso de usuarios es decir a la URL de usuarios esa petición llegaría al servidor de
Express de nodejs y nodejs a al saber que es de usuarios pues va a saber a qué módulo de arquitectura exuna lo va a
mapear a partir de ahora solo llamaremos módulo ya sabemos que estamos en un curso de arquitectura exagonal entonces
Express lo que haría sería enviarle eh los datos o la petición tal cual al módulo de usuarios de acuerdo al caso de
uso que representa la URL y ya aquí procesaría todo lo que ya hemos hecho hasta este momento de acuerdo tocaría
infraestructura si es necesario aplicación si es necesario y dominio si es necesario una vez que el caso de uso
termine Pues los casos de uso siempre devuelven algo incluso void pero devuelven algo entonces aquí estaría
retornando la respuesta o lanzando el error de acuerdo aquí Express pues lo mapear si no es que ya lo mapeo antes la
infraestructura de usuario en caso de que no lo haya mapeado la infraestructura de usuario y
fuera un error sí se la pasaría a nojs o en caso de que fuera una respuesta exitosa y finalmente el servidor de nojs
con regresaría la respuesta a la a la gente que inició la petición en primer lugar entonces bueno Esto vendría a ser
lo que amo estar desarrollando como les digo este código pues ya lo tienen De hecho si van a github Eh Al que les dejo
en la descripción voy a intentar entrar vemos que aquí en repositorios eh lo tenemos justamente aquí arquitectura
hexagonal y aquí creé otro repositorio de acuerdo vamos a enfocarnos en este en arquitectura hexagonal Tenemos aquí
una rama por cada video que hemos hecho Entonces en este caso vamos a hacer uso del de infraestructura vamos a partir de
esta base de código y lo estaremos cargando en otro repositorio enfocado a nojs y este de aquí es simplemente el
módulo es decir es un módulo de ejemplo de arquitectura hexagonal y lo que tiene este módulo son simplemente las capas de
acuerdo tiene los casos de uso que hemos desarrollado tiene la parte de dominio que hemos desarrollado y en la parte de
implementaciones de acuerdo al framework que esty usando entonces bien Vamos a comenzar lo primero que voy a hacer es
ir al proyecto tal como lo dejamos en el video anterior es documents hexagonal Y a partir de aquí voy a abrir
una Perdón una ventana en visual Studio code voy a hacer zoom y listo aquí ya lo tenemos ya puedo cerrar esto aquí
entonces este es el estado en el que habíamos dejado nuestro proyecto enfocado a nojs de acuerdo aquí voy a
cerrar otros porque no los voy a necesitar y listo voy a hacer la terminal Entonces vamos a comenzar lo
primero que vamos a hacer es crear una aplicación en Express es decir asegurarnos que que Express esté
funcionando para ello eh voy a necesitar typescript porque esto es un Eh pues proyecto de typescript entonces de
momento lo que voy a hacer es instalar como dependencia de desarrollo ts Note y typescript acuerdo voy a necesitar
typescript para compilarlo y que se código de producción y ts node simplemente para ejecutar el el código
eh también lo que voy a hacer es con npm eh Perdón npx ejecutar tsc y- init Esto va a inicializar un proyecto de tpt va a
tener esa configuración voy a hacer algunos ajustes eh primero que nada el base URL va Lo voy a descomentar va a
quedar de esta forma también vamos a buscar por el out Dear que aquí out Dear lo vamos a definir como
dis y finalmente bueno de momento creo que es todo lo que necesitamos Eh bueno vamos a comentar
esta línea de aquí para que no nos dé problemas con Express Al momento de importarlo y listo es todo lo que
necesitamos entonces bien aquí lo que voy a hacer es en el package Jason eh comenzar a definir eh Bueno voy a
ejecutar npm init men y para que me inicialice Aquí está Y entonces aquí lo que voy a hacer es que en los scripts
voy a estar creando un Script que se llame Start y Start lo que va a hacer es que va a ejecutar
eh node de aquí va a ser main.js voy a tener otro llamado build que lo que va a hacer es ejecutar con
this aquí lo tenemos y finalmente vamos a tener dep que lo único que va a hacer es ejecutar npx ts Noe 0c
main.ts entonces perfecto bien ya terminamos con el package json lo que vamos a hacer aquí en nuestro archivo
desde Express aquí lo tenemos Entonces vamos a crear una app que va a ser igual a Express aquí lo tenemos y simplemente
vamos a poner app Listen len que va a escuchar en el puerto 3000 y el callback va a ser que simplemente mande por
consola que está corriendo en el puerto Entonces vamos a probar con npm r listo aquí vemos como ya está
corriendo Y si yo abro esto puedo ver que está funcionando eh justo Como debería ya tenemos nuestro servidor de
Express corriente voy a cerrarlo y lo que voy a comenzar a hacer es definir eh la infraestructura de mi módulo de
usuarios ya que hay unas modificaciones que tenemos que hacer primero que nada nuestros módulos pueden digo nuestros
casos de uso pueden dar error y necesitamos una forma de gestionar esos errores Express nos provee desde la
versión 5 me parece eh la posibilidad de que con asincronismo simplemente definiendo el parámetro next que sea un
este scope de la función este parámetro y lo mapea a un error de Express Entonces lo vamos a agregar en todos
esta forma ya lo estaré mapeando al middleware Principal que se va a encargar de gestionar los errores ent ya
podemos volver aquí y aquí lo que vamos a hacer en Al mismo nivel de Express user controller Pues yo quiero definir
aquí un Express user router de acuerdo Voy defir un Express user router esto para que las rutas pues estén bien eh Es
decir mapear la rutas la ruta user va a equivaler al al caso de uso get all la ruta user y el parámetro ID va equivaler
este caso de uso y así entonces lo que voy a hacer es importar router desde Express y aquí voy a crear un user
router router que va a ser igual a router entonces aquí user router voy a empezar a mapear que va a tener un
método get que aquí va a ser user y aquí lo que va a estar ejecutando va a ser el servidor de El
service container perdón recordemos que el service container es un contenedor de de casos de uso que creamos en el video
pasado y aquí voy a estar accediendo a todos nuestros nuestros casos de uso entonces service container del módulo
user quiero que genere Get out Run y que ejecute ese método entonces aquí Estaría bueno aquí me dice que no es
controlador de Express entonces Aquí voy a crear hasta arriba un const eh controller Y aquí va a ser un New
Express user controller y ahora sí el el container y ahora sí lo tenemos Entonces desde controller ahora sí voy a Acceder
al método Get out Y es de esta forma como lo tenemos que hacer Estamos accediendo directamente al servidor al
contenedor de servicios no es así sino que el router lo que Espera es un controlador Entonces es de esta forma
como se tiene que hacer vamos a copiar y pegar aquí unos cuantos más Ahora aquí en user voy a indicarle que voy aar como
parámetro un ID y este lo va a estar mapeando a el caso de uso get One by ID qué más tenemos tenemos el método create
entonces aquí ya no sería post sino Perdón no sería create sino get sino que sería post y sería simplemente a user
aquí create edit eh También es un caso de uso que tenemos y más de lo mismo aquí sería put en lugar de get y también
a user y finalmente aquí delete para el caso de uso de delete entonces listo aquí ya tenemos listo nuestro router lo
último que voy a hacer es exportar el user router y Listo ya tenemos nuestro mapeo de A qué rutas debe ejecutar qué
caso de uso de nuestro controlador vamos a volver a Main entonces aquí en App le voy a decir que use ese router
justamente user router y Listo ya lo tengo para hac un poco más explícitos le voy a cambiar en lugar de user router
que se llame expr así en mayúsculas Express user router eh Como la convención que hemos estado siguiendo
que lo que se exporta es Exactamente igual que el mismo nombre de aquí entonces aquí no sería user router sino
Express user router y este lo pasamos para acá entonces bien ya lo tenemos qué es lo que falta crear aquí nuestro
middleware que se va a encargar de gestionar los errores entonces aquí vamos a poner app use y aquí eh
justamente aquí nos foto completa vamos a ver si nos da sí Y esto es lo que estaría haciendo de acuerdo error pues
aquí es desconocido ahorita vamos a explicar que es estructura request Pues el tipo request de
Express s lo de esta forma response es de tipo response de Express y finalmente next es igual a
next function de Express también esto pues lo podemos hacer más simple poniendo aquí que también queremos
sí next Me parece que no lo está dando Bueno vamos a ponerlo abajo porque aquí como estamos exportando todo
Express tal vez está dando error entonces import request de Express response de Express y finalmente next
function de Express y Listo Ya lo tenemos para que sea más corto y no tener aquí el Express request y todo eso
entonces aquí el error como vemos que es indefinido lo que vamos a hacer es simplemente decir que si error es
aquí y en caso de que no pues simplemente queremos mandar por consola también lo que dio Pero sabemos que no
es un de tipo error Entonces vamos a mandarlo Así que solamente algo salió mal y aquí si vamos a mandar el mensaje
del error error que nos dio bien Vamos a revisar qué fue lo que hicimos porque escribimos algo de código justamente
este bloque aquí le estamos diciendo a Express que use el siguiente middleware de acuerdo Este es un middleware
especial de Express Express comúnmente nosotros vamos a usar request response y en todo caso next pero cuando te ponemos
el parámetro de error y en son total en total cuatro parámetros lo que hace Express es que sabe que este middleware
solo va a tomar los errores de acuerdo Ahora yo les comentaba que acá agregamos el next para que cuando aquí salte un
error eh Express lo que haga es que pase ese error a la función next y es Entonces cuando se hace el Trigger para
que o sea de esa forma Express sabe que tiene que ejecutar Ah este middleware porque en la función next se está
pasando un error la función next desde acá Nosotros también podríamos hacerlo manualmente y poner algo como next y que
aquí Lance eh un nuevo error y esto prácticamente estaría mapeando al middle Word de acá de acuerdo esto lo hace
aplicación tenga un error primero vamos a revisar como error es por defecto ug Now tenemos que hacer la són de
typescript Entonces tenemos que decir que si error es instancia de error Entonces tenemos acceso al stack que lo
vamos a mandar por consola y de status vamos a mandar un error 500 con el mensaje de acuerdo esto siempre que el
controlador no lo mapee Qué significa que en el caso de aquí como nosotros ya lo estamos mapeando nosotros estamos
devolviendo esa respuesta y este error nunca va a llegar acá porque ya estamos terminando la solicitud caso contrario
si no lo llega a mapear Pues aquí sí va seguir lanzando el error y este error se va a propagar hasta este
middleware entonces aquí en caso de que no sea error Bueno aquí vamos a marcar un return y en caso de que no sea error
pues simplemente vamos a mandar por consola pues qué fue lo que sucedió y vamos a retomar simplemente
something was wrong listo Entonces ya tenemos también nuestro middleware de protección de de errores esto lo podemos
extraer otro archivo no pasa nada si el código se vuelve más complejo si lo vamos a hacer Pero en momento estamos
bien así entonces vamos a ejecutar npm rp y Listo Ya está corriendo ahora vamos a comenzar a hacer nuestras pruebas para
esto voy a ejecutar eh esta extensión de visual Studio code que se llama tunder client si no la tienen se la recomiendo
simplemente buscan Thunder client y viene a ser esta de aquí eh nos permite hacer solicitudes http entonces aquí ya
tengo el endpoint para eh primero Quiero ver los usuarios que tengo de acuerdo voy a dar en Send y me dice que ocurrió
un error que no puedo obtener users okay Porque no es users es user de acuerdo Aunque bien podríamos cambiarlo eh aquí
por users ya esto depende de ustedes eh digo lo podemos hacer perfectamente de hecho pues vamos a hacerlo para que
tengan con mejor semántica ya no va a ser users sino users entonces aquí volvemos a correr el servidor volvemos a
nuestro cliente http corremos y aquí nos dice Bueno es users y aquí nos da un array vacío Esto es lo que esperábamos
sí recordemos que la implementación que estamos usando la tenemos aquí en service container nuestro repositorio es
un repositorio en memoria y por defecto en memoria el array está vacío Entonces por por esa parte todo perfecto ahora
vamos a pasar a crear un nuevo usuario Qué sucede si yo mando así nada más la solicitud sin nada en el body vamos a
verlo me dice que el servidor cerró y aquí me está dando un error de acuerdo aquí me dice que created ad del Body no
está definido entonces este error me lo está dando y está cerrando el servidor entonces significa que este módulo no
está funcionando correctamente vamos a ver qué está pasando de acuerdo Aparentemente lo que está sucediendo es
que no se está haciendo uso esta función lamente o sea en automático entonces lo que vamos a hacer es que
vamos a agregar este mismo TR Catch en todos nuestros controladores de acuerdo simplemente vamos a poner este try Catch
si todo va bien va a devolver la respuesta y caso contrario lo que queremos es con next pasar el error de
acuerdo de esta forma ya estamos haciendo explícito que queremos que este error se ha pasado al middleware de
errores aquí en lugar de lanzarlo contr eh le voy a dar también uso con next listo aquí en create un poco más de lo
mismo vamos a envolver todo en un try Catch de esta forma y ya en el Catch simplemente pasamos el next y el error
en edit más de lo mismo try Catch pasamos todo esto de aquí y simplemente aquí pasamos con el next el error y
finalmente en delete hacemos más de lo mismo de este lado y en el Catch simplemente next de
acuerdo aquí lo tenemos bien eh prácticamente lo que hicimos fue argar un try Catch en todos nuestros
controladores de inicio a fin es decir todo el proceso de lo que debería hacerse se hace en el Catch si hay un
error y lo podemos mapear como este es el caso Aquí vamos a devolver la respuesta y no pasa nada si no lo
podemos mapear entonces también vamos a pasar el error a el middleware de los errores Entonces vamos a probar que esto
esté funcionando voy a correr mpm rundet voy a dar clic aquí y como vemos Ya me está volviendo error pero el servidor ya
no se está deteniendo si yual sigo mandando las peticiones mi servidor no se detiene es decir sigue funcionando
sin ningún problema qué me está diciendo aquí me dice eh De hecho Vamos a darle un mejor formato aquí en el middle World
en lugar de enviar el Send así por si solo Vamos a mandarlo en formato json y vamos a mandar el mensaje de esta forma
iniciar lo que va a suceder cuando yo envíe la petición y me da error es que me lo va a dar en formato json y lo que
me está diciendo es que no puede estructurar propiedad created at de r. Body ya que está indefinida este error
bueno viene a ser Prácticamente la desestructuración de aquí de acuerdo ni siquiera llega nuestro caso de uso el
error está sucediendo Aquí y ahora aquí como les comentaba en el video anterior es importante que metamos validaciones
de acuerdo que tengamos un validador en Express ya sea incluso lo podemos hacer con so hay distintos
validators hay distintos validadores que pueden usar por ejemplo este este Express validator que lo que hace es que
simplemente nos da una herramienta de middleware para poder hacer esas validaciones Si van aquí documentación
lo pueden hacer o incluso pueden hacer el suyo propio ha apoyándose en s s Es una herramienta que nos sirve para tipar
fuertemente y proteger en tiempo de runtime los datos que están ingresando nuestro sistema yo la uso mucho Les
recomiendo que la usen sin embargo en este video no vamos a agregar protecciones ya que no es el foco Eh
Pues de este curso entonces aquí simplemente vamos a agregar los campos que son necesarios nos pide un ID por
tanto vamos a agregar un ID vamos a poner uno de momento vamos a ver qué sucede Voy a agregar un name para crear
el usuario en este caso lo voy a llamar marco el email pues va a ser eh Marco también vamos a ver qué error nos da y
finalmente el created ad bueno Esto va a ser una fecha tiene que ser una fecha real entonces me voy a aper Aquí voy a
ejecutar node y voy a poner un New date simplemente para que me de El String aquí ya lo tengo y este String pues lo
voy a copiar y lo voy a pegar aquí listo si yo mando Esto me da error y me dice que sigue sin poder
desestructurar created ad acuerdo no lo puede estructurar de Body sin embargo aquí si se lo estamos mandando dice que
logro hacer que funcione voy a volver a mi petición voy a enviarla y me sigue diciendo que está indefinido muy bien
Vamos a ver cuál es el problema seguramente va a estar aquí en nuestro controlador vamos a probar Algo vamos a
entonces aquí de nuevo volvemos al servidor damos click en Send y aquí en la consola nos debería salir bueno que
está un definer Ah Perfecto aquí en Main nosotros estamos olvidando indicarle Express que use o que acepte Jason
Express por defecto no acepta Jason Entonces nosotros tenemos que indicarle que lo vamos a usar para eso Express nos
pre de un middleware esto lo tenemos que poner hasta arriba para que todas nuestras rutas puedan acceder a él y
aquí es simplemente De hecho aquí nos autocompleta app.use Express json con esto Express ya va a poder leer los
mensajes json que nosotros envios en nuestras repeticiones Esto es algo muy básico cuando van comenzando el mundo de
node js y Y si usan Express seguramente esto ya lo sabían a mí se me olvidó Pero bueno ya lo puse si doy click en Send
Okay el error es diferente me dice user ID debe ser al menos cinco caracteres de tiene que tener al menos cinco
caracteres de longitud Okay Pues yo aquí el ID pues le pongo cinco caracteres de longitud por ejemplo voy a poner algo
así que este es el id entonces si yo vuelvo a intentar la petición Okay ya no me da el error de user ID pero me dice
user email que tiene que ser una dirección válida Okay vamos a poner una dirección válida marco
@gmail.com por ejemplo si doy enviar listo mi usuario ya ha sido creado ahora esto que me está
mostrando aquí es la petición del Body realmente es esta petición de acá Entonces la voy a borrar para que ya no
me la dé bien Ahora se supone que aquí yo ya he creado mi primer usuario vamos a ver si es cierto voy a dar get users
Send y aquí ya me está devolviendo ese usuario me lo está devolviendo en este formato Por qué Porque recordemos que
nuestra clase nosotros tenemos cada uno de estos son value objects Entonces está volviendo también el valor ahora si
quisiéramos devolver nada más el mapeo de ID y su valor podemos hacerlo podemos ir a domain y en nuestro user Podemos
agregar un servicio de dominio que sea public que sea map to primitives y aquí lo que estaría volviendo serían los
primitivos listo tal que así Entonces nosotros en nuestro Express aquí en en get all no antes por
qué no antes por lo tenemos que hacer hasta estuctura porque si lo hacemos en aplicación aplicación todavía necesita
ser tipado de acuerdo a nuestro dominio infraestructura como ya va de salida No pasa nada entonces aquí users lo que
vamos a hacer es eh aquí Incluso en el json podemos hacerlo va a ser mapear losos y lo que yo quiero es que por cada
user se devuelva user pero con su método map to primitives esto lo que va a hacer es que va a mapear los usuarios a
primitivos voy a reiniciar el servidor y voy a volver a iniciarlo aquí si yo eh pido los datos pues van a estar vacíos
porque como se reinició la memoria del servidor y el repositorio que estamos usando es en memoria Pues es normal que
pase eso entonces voy a primero crearlo listo ahí ya lo creé voy a obtenerlo y vean como aquí ya tengo ese mapeo sin
que sea como una clase es decir tal cual llave valor algo pues un poco más acostumbrado a lo que estamos un poco
más a lo que estamos acostumbrados en ver en las Api este map to primi Yo también lo uso en casi todas mis
aplicaciones porque la gran mayoría aplicaciones que desarrollo son aplicaciones web Entonces es importante
que pues en aplicaciones web cuando estamos comunicándonos con clientes devolvamos respuestas Eh Pues en formato
json tradicional que conocemos que es este Entonces como Ven aquí en Express user controller también se vuelve muy
sencillo de leer Es decir de los usuarios que son usuarios de dominio mapal los a primitivos para que los
puedas devolver hasta la respuesta Jason no antes porque recordemos que durante todo el flujo de nuestra aplicación la
intención es que usemos dominio de acuerdo la el en la el modelado de dominio que definimos ya fuera de la
aplicación cuando va de salida pues no pasa nada lo podemos devolver ahora el de get One by ID va a ser lo mismo el
user lo vamos a tener que mapear a primitivos y me parece que son los únicos que devuelven justo vamos a
probar este endpoint el de get One by ID bueno Aquí yo quiero obtener users pero Quiero obtener el usuario número uno
Enviar Okay me dice que aquí el ID tiene que ser al menos cinco caracteres de largo entonces voy a poner esto enviar Y
noten cómo me da el error 404 es decir no me da el error 500 Por qué me da 404 fácil porque nosotros lo mapeamos aquí
aquí este este servicio está arrojando user not phone error Y como aquí lo estamos mapeando estamos devolviendo 404
y el mensaje del error que si recordamos en este servicio el mensaje del errores user not fone Si volvemos es el mensaje
que vemos acá entonces perfecto voy ahora a buscar un ID que s exista Perdón así Send y me lo arroja ahora también me
está arrojando value bueno voy a reiniciar el servidor porque hice el cambio eh antes de que de que volviera a
correr el servidor entonces voy a mandar post y simplemente voy a mandar ahora sí get obtengo Todos aquí tengo todos
cuando lo obtengo por el ID me lo da por el ID mapeado justo como lo necesito Entonces está perfecto qué más
controladores eh tenemos o mejor dicho qué más endpoints tenemos en nuestra ruta Bueno ya hmos el de users ya hmos
el de users por ID ya hemos la creación de users vamos a intentar actualizar un usuario de acuerdo Entonces aquí yo voy
a decir put y le voy a decir aquí user sí Perfecto aquí pues puedo obviar esto porque en el put ya
viene el ID entonces aquí este ID de este usuario que existe yo quiero mapear a que ya no sea marco sino que sea
Antonio por ejemplo quiero cambiarle el nombre enviar me dice 200 todo perfecto si hago el get por el Todos aquí veo que
ya mi usuario ya se llama Antonio Entonces el endp de actualización también funciona Ahora qué pasa si yo
intento actualizar un usuario que no existe Bueno vamos a probar si aquí le pongo un uno me dice que sí se actualizó
pero realmente se actualizó vamos a hacer el get y no se actualizó no se actualizó nada eso se llama Corner cases
es decir son casos aislados que no contemplamos en el diseño de nuestra aplicación Entonces vamos a contemplarlo
en nuestro caso de uso deed lo que queremos es primero verificar que el usuario existe entonces con user exist
Bueno más bien user va a ser a repository get One by ID y le voy a pasar el user.id pero aquí va a ser user
exist Entonces esto lo que va a hacer es devolver un usuario o nul si no existe el usuario entonces más de lo mismo
puedo lanzar un nuevo error que sea user not Found error y simplemente aquí user not aquí ya estamos Entonces desde el
caso de uso de dit noten como estamos haciendo dos digo uso de dos métodos del repositorio de acuerdo esto que nos dice
que no necesariamente tiene que haber una paridad de un caso de uso y solo un método de repositorio es decir podemos
usar los métodos de repositorio que nosotros necesitemos Entonces si yo hago esto y simplemente lo mando qué va a
pasar que esto me va a lanzar error 500 Por qué vamos a probarlo Ah perdón aquí le di get era put probarlo me da error
500 yo quiero que me dé 404 Qué hace falta Exacto mapear en el controlador entonces aquí en edit lo que vamos a
hacer en el Catch es prácticamente copiarnos la línea de aquí de get One by ID y tal que así si el error que está
lanzando es instancia usern phone devuelve 404 y el error del mensaje voy a tener el servidor voy a volverlo a
correr vuelvo a mi petición yo veo qué usuarios tengo no tengo usuarios por tanto si yo actualizo este usuario con
ID debería fallar lo mando y sí me manda 404 ven qué fácil se vuelve el mapear las respuestas Y hacer que todo esto
funcione Y noten como aquí también la arquitectura hexagonal nos permite alta reutilización de componentes aquí yo no
tuve que crear un nuevo componente para verificar si existía o no el usuario aquí simplemente llama el repositorio
ahora ustedes podrán decir Oye por qué no reutilizas el caso de uso de get One by ID dentro del caso de uso de user
edit porque ahí estaríamos generando dependencia entre de casos de uso y recordemos que en el video de capa de
aplicación nosotros vimos que eso debemos evitarlo a toda Costa lo que sí puedos reutilizar es el repositorio
porque el repositorio Pues para eso está además que sirve como eh aislante de contaminación Entonces por parte del
repositorio pues no pasa nada es sí podemos reutilizarlo pero no reutilice en Casos de uso porque les va a dar más
cuatro funcionan ahora vamos a probar eliminar un usuario Bueno pues para eliminarlo primero tengo que crearlo
entonces eh voy aquí a crearlo Send 21 y finalmente Bueno vamos a hacer todos vamos a obtener todos los usuarios Okay
Ah aquí por ID me lo arroja Okay voy a intentar actualizar uno que no exista Okay me de error sin embargo si
el que existe si lo paso como marco Quiero actualizar su nombre todo perfecto si yo vuelvo a get ya veo que
está actualizado finalmente lo quiero eliminar ya no lo necesito por alguna razón Okay aquí me dice que no se
encontró que no se encontró esta ruta vamos a ver qué tenemos nosotros en nuestro router users Ah Okay nos falta
aquí el parámetro de ID vamos a volver a correr volvemos acá y si yo doy en delete listo ahora Eh
Esto es más de lo mismo en este caso como se reinició el servidor no teníamos nosotros el el usuario es decir no
existía entonces en el delete podríamos hacer lo mismo es decir aquí en delete hacer exactamente la misma validación de
que si el usuario no existe nos elimine de hecho vamos a hacerlo vamos a meterla acá vamos antes de querer eliminar el
usuario asegurarnos de que exista para esto sería New user ID ig ID pero pues mejor lo ponemos acá se está
utilizando dos veces user ID es igual a New user ID entonces este lo pasamos tanto aquí como abajo que sería user ID
y finalmente mapeamos a Us not phone entonces más de lo mismo ahora vamos al controlador agregamos este mapeo aquí en
delete y listo Entonces ya tenemos este mapeo con nuestro método delete vamos a probar si funciona voy a intentar
eliminar algo que no exista primero voy a verificar qué usuarios tengo aquí eh bien no tengo este usuario por ejemplo
voy a intentar eliminarlo y si lo intento Igual me da 404 Entonces vamos a probarlos todos en conjunto primero
Quiero probar el primer método que es que me da todos Okay no tengo nada por tanto voy a crear uno y listo voy a
crearlo con este cuerpo si yo vuelvo a pedir todos los usuarios Aquí los tengo ya tengo uno entonces ahora voy a probar
obtener solamente uno por ID de acuerdo si aquí y doy aquí me da el que pedí por ID voy a intentar ahora actualizarlo y
para actualizarlo solo me pide el ID acá Y en lugar de Marco ahora se va a llamar Antonio y lo cambio me da 204 si yo
vuelvo a obtener todos los usuarios Aquí tengo que ya se llama Antonio finalmente quiero eliminarlo le paso el ID si no
existe el ID Yo sé que aquí me va a dar error sin embargo si le paso el ID correcto se elimina si yo vuelvo a
obtener todos los usuarios ya no tengo usuarios entonces acá vamos de ver cómo es tan fácil el
mapear todas las rutas de nuestro Express con nuestro controlador mismo controlador que ya vive en El dominio De
hecho también el router vive en El dominio es decir Perdón en el módulo no en El dominio vive en infraestructura
pero nuestro módulo vemos como más allá de todo nuestro módulo solo creamos un archivo y este archivo lo único que hace
es inicializar Express eh hacer uso los middle Wars que nos van a permitir comunicarnos con Jason aquí ya es cuando
empieza a traer los routers es decir si tuviéramos otro router de Express no sé de eh clientes a lo mejor esto sería
customer en lugar de user pero pues cuánto se puede extender esto Saben una línea por cada uno de nuestros módulos
tenemos un middle work que esto Igual también lo podremos extraer otro archivo si quisiéramos pero pues es bastante
sencillo Entonces lo vamos a dejar aquí y ponemos a correr nuestro servidor de Express entonces eh Por qué qué metemos
todo en la carpeta user bueno porque si un día queremos reutilizar y noten este este gran valor que nos da la
arquitectura exagonal si un día queremos reutilizar solamente el módulo user bastaría con copiar shared y user si
quisiéramos usar más módulos no sé user y customer por ejemplo Okay sería user customer Y shared por qué siempre shared
pues porque shared es el compartido seguramente va a tener cosas que van a necesitar user entonces por eso pero
bastaría con copiar esto y para la nua aplicación solo necesitaremos construir este Main y ya saben o sea no Tendremos
que hacer mucho más pero tú dirás bueno cada cuanto comparto un módulo user Bueno pero Probablemente sí compartas el
de autenticación en todas tus aplicaciones Entonces ya no tendrías que estar reescribiendo la autenticación o
copiándolo y pegando simplemente copias toda una carpeta la pegas y creas un archivo o generas un archivo si es que
es necesario crearlo aquí ya vimos como para una aplicación completa de Express no nos bastó más que generar un archivo
fuera de los que generamos de módulo y este módulo Ya está listo para ser copiado y pegado en cualquier otro lugar
y funcionar exactamente como nosotros Esperamos que funcione entonces bueno este fue el video donde explicamos voy a
cerrar todos estos partes de aquí fue el video donde explicamos eh Cómo desarrollamos esta parte de aquí y los
beneficios que nos otorga pues tenerlo todo aquí en user model ahora qué pasaría si nosotros cambiáramos de
Express a nestjs por ejemplo Bueno pues eso lo vamos a ver en el próximo video donde estaremos generando eh lo mismo
consumiendo nuestro módulo user pero en un ambiente de njs a partir de ahora estaré generando más videos de este tipo
es decir ya teniendo este módulo de usuarios lo estaremos reutilizando en las distintas implementaciones y el día
de mañana va a ser njs pero otro día podría ser eh igual otra implementación con prisma en la base de datos o con
postgres o con cualquier otra tecnología incluso saliendo del mundo de tpt podríamos llevar estos conocimientos a
php a Java a golang realmente eh las posibilidades pues son ilimitadas estos conceptos que vimos durante esta serie
de videos pues son aplicados a cualquier tecnología entonces bueno espero y les haya gustado Espero hayan aprendido
mucho y nos vemos en el próximo video donde estaremos haciendo una implementación de arquitectura hexagonal