Arquitectura Hexagonal en NestJS | Clean Architecture

แชร์
ฝัง
  • เผยแพร่เมื่อ 24 พ.ย. 2024

ความคิดเห็น • 75

  • @AlbertHernandez
    @AlbertHernandez  5 หลายเดือนก่อน +6

    Os dejo aquî el link al repositorio de Github
    - github.com/AlbertHernandez/nestjs-hexagonal-architecture-example

  • @emilianomolinagonzalez2665
    @emilianomolinagonzalez2665 29 วันที่ผ่านมา

    Albert! Genial el video, lo estoy siguiendo de a poco y minuciosamente. Sería genial ver una demostración de este tipo sin que copilot te predefina las cosas, para entender de mejor forma el por qué de ciertas definiciones e implementaciones.

  • @juanestebanzuluaga2446
    @juanestebanzuluaga2446 9 วันที่ผ่านมา

    Excelente contenido, estoy empezando a usar en mis proyectos la arquitectura Hexagonal en mis proyectos y este tipo de contenido vale oro, actualmente estoy trabajando en un proyecto con bastantes entidades de dominio que se relacionan entre ellas y la duda que aun quisiera resolver es como se integran las entidades entre si, por ejemplo si tuvieramos en este ejemplo productos y los productos tuvieran una relacion de 1 a muchos con los payments, como se implementaria un end-point que me devuelva un producto con todos sus pagos asociados, gracias por este increible contenido y si pudieras ayudarme a aclarar mi duda estaria genial, saludos desde colombia

    • @AlbertHernandez
      @AlbertHernandez  2 วันที่ผ่านมา +1

      Gracias! Pues todo depende de como lo tengas modelado, si son dos entidades distintas que no se conocen salvo por algun identificador, por ejemplo, el payment tiene asociado el id del producto al que va asociado el pago, lo que podrias hacer es desde el propio controlador, llamar a los casos de uso de obtener tanto el producto como los pagos de un producto, luego en el controlador juntarias los 2 modelos y los devolverias.
      Otra opción que tienes es tener 2 endpoints distintos y delegar al cliente que llame a los 2, pero en ciertos casos quieres evitar esto ya que quieres reducir las llamadas que te hacen, asi que delegarlo al controller o a un API gateway puede ser una buena opción

  • @gabrielluna2474
    @gabrielluna2474 4 หลายเดือนก่อน +1

    Hace un par de meses realicé un proyecto donde apliqué la clean y me doy cuenta que estuvo relativamente bien implementada, lo unico que no implementé fueron los dtos tanto de aplication como de infraestructure, en su lugar use meras intefaces lo cual sigue siendo muy parecido, estoy contento con la aplicacion implementada. Gracias por este contenido ❤

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +3

      Fantástico 👏, la primera vez que se implementa siempre surgen dudas, y sobre todo si es en un framework que cuesta el poder separar las cosas y no acoplarse. Yo, por ejemplo, sí suelo separar los DTOs de aplicación y de infra por dolores que he sufrido al no hacerlo, ya que, por ejemplo, la API que estás exponiendo puede ser en snake_case, y luego tú siempre quieres trabajar con camelCase, que es el estándar de NodeJS. Entonces, sería en ese punto donde podríamos hacer toda esa conversión. También serían esos DTOs donde pondríamos cosas como la documentación de Swagger de la API, y tener eso en la capa de aplicación no me termina

  • @keilerguardo2164
    @keilerguardo2164 4 หลายเดือนก่อน +1

    Me viene muy bien este video Albert, muchas gracias.

  • @marcoshernandez6623
    @marcoshernandez6623 4 หลายเดือนก่อน

    Eres el mejor me quedo super claro esta arquitectura y mas el empleo en nest js

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Me alegro de que te quedara todo claro 😁

  • @martinalejandroarganaraz4295
    @martinalejandroarganaraz4295 4 หลายเดือนก่อน

    uff gracias por la explicacion... y gracias a yt por recomendarme el canal jajajajjaajja... hace rato que buscaba algo asi con nestjs(amo el framework ojala perdure y logre afianzarse aun mas) y no encontre casi nada... y con eso me aparecieron muchas dudas... si hacerla de 0 o respetar la que ofrece nest de manera predefinida etc... saludos desde Argentina... vi que tienes varios mas de nestjs voy a ponerme al dia jejejje

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Un placer! Qué bueno que youtube comience a recomendar mas el canal 🚀
      Dale caña, hay varios videos de NestJS en el canal y luego tambien mas generales de Node, que tambien se pueden aplicar al framework hehe
      Lo de respetar la manera de NestJS depende mucho lo que quieras conseguir, puedes desde ir a full con el framework, hasta aislarlo del todo, y luego siempre tienes el punto intermedio que también suele ser muy buena opción hehe

  • @gposoft
    @gposoft 4 หลายเดือนก่อน +2

    estaria bien un video para dokerizar el proyecto con buenas practicas

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Buenas! Pues justo todo el docker que esta en este proyecto si que esta hecho en un video donde explico paso por paso como se crea y se ve en mas detalle hehe, te lo dejo a continuación por si quieres darle un vistazillo, y cualquier feedback o cosa que veas que no queda clara me dices y asi intento hablar de ello en futuros videos :D
      th-cam.com/video/J4J2wgZ8yWE/w-d-xo.html

  • @nonyoo
    @nonyoo 3 หลายเดือนก่อน

    Excelente, sigue trayendo estos videos, son muy buenos!

  • @santiagotrivino7462
    @santiagotrivino7462 4 หลายเดือนก่อน

    Excelente video! Bien explicado. He implementado esta manera de hacer de hacer un proyecto, pero simore tengo unas de como hacer los casos de uso cuando se trabaja con relationes; como por ejemplo la relation one to many o many to many. Me gustaria una explicación de eso

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Gracias 😁 Me apunto eso de las relaciones para traerlo en un próximo video. Si te sirve para ir avanzando la idea es que todo ese tema de relaciones lo puedes ir consiguiendo añadiendo los ids en las entidades que se relacionan, o en en caso de que siempre siempre vaya junto, directamente puedes poner uno dentro de otro, pero hay que tener cuidado luego con esto ya que la idea principal es tener entidades pequeñas

  • @suko8285
    @suko8285 3 หลายเดือนก่อน

    Felicidades por el video Albert. Hice un proyecto bastante parecido al tuyo incluyendo eventos de dominio, testing, base de datos, value objects, etc. Pronto lo subiré a github y te paso el link de medium por si le quieres echar un vistazo :)
    Lo único que me chirría un poco del video es la parte de tener que forzar a tu dominio a crear clases abstractas en lugar de interfaces para evitar el uso del famoso "@Inject('Interfaz')" de inversify en cada constructor. Creo que es algo muy particular del framework nest js y que si mañana cambiáramos de framework quizás no tendría sentido y si utilizar interfaces, no sé, es una reflexión que quería compartir contigo.
    Gracias por compartir el contenido

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน +1

      Gracias! Si cuando lo tengas pasa link y le daré un vistazo, gracias por compartirlo también :)
      Respecto a lo de la clase abstracta si, coincido, al final es el trade-off que estoy pagando por el hecho de no poner el Inject del framework en el dominio, también al usar clases abstractas puedo usar ciertos helpers de jest para generar mocks automáticamente que me vienen bien así que bueno, es un precio que no me sabe tan mal pagar hehe
      Un saludo!

  • @CharlesDv
    @CharlesDv 4 หลายเดือนก่อน

    Excelente video. Tal vez se podría complementar en el mismo sentido de la arquitectura pero sobre testing.

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Gracias! Pues voy a ver si puedo traer algún video de testing en este tipo de arquitecturas, gracias por la sugerencia :D

  • @juanestebancalderon6520
    @juanestebancalderon6520 4 หลายเดือนก่อน +1

    Hola Albert! Un poco tarde pero por aquí siempre, tú sabes jaja. Felicidades, está de lujo el video. Veo que en tu repositorio incluyes ya temas de testing que cubren bastante, crees poder traernos en algún momento testing para este proyecto? Estaría de lujo!

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Hey! Gracias por siempre estar apoyando hehe, pues si, tengo pensado traer cosas de testing en futuros videos pero voy poco a poco que no me da para todo haha pero lo traeré 😁

  • @rodrigoguzman6084
    @rodrigoguzman6084 4 หลายเดือนก่อน +1

    muy bueno el video, bien explicado. A la espera de mas videos sobre arquitectura de software 🤗consulta: que tema de webstorm usas? saludos

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Gracias 😁 Pues uso el tema de Monokai Pro (Filter Machine). Un saludo!

  • @AngelLopez-qf6no
    @AngelLopez-qf6no 4 หลายเดือนก่อน +3

    Buen video, pero me hubiese gustado ver la diferencia entre un caso de uso y un servicio de dominio o para que sueles utilizar los servicios de dominio y poder haber visto un ejemplo

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +3

      Gracias! Me lo apunto para ver si puedo traer un video aparte explicando lo de los servicio de dominio

  • @juanestebancalderon6520
    @juanestebancalderon6520 3 หลายเดือนก่อน

    Albert, espero estes bien. Regreso de un buen tiempo luego de haber visto y aplicado el video (que por cierto, gracias, está muy valioso como todos) y me surgió una duda cuando mencionaste el tema de crear un decorador Transactional, cómo sería una implementación de transacciones en arquitectura hexagonal? Podrías de pronto hablar de eso en un video? Gracias nuevamente!

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน +2

      Muy buenas Juan!
      Pues para implementarlo hay varias opciones, una de ellas es en la capa de infrastructure crearte tu decorador transactional, los tipicos de Typescript y ahi que sea donde creas la transaccion y cuando ha acabado que haga el commit y en caso de que falle el rollback, he encontrado esta libreria que ya da una posible implementacion de este transactional por si le quieres dar un vistazo: www.npmjs.com/package/typeorm-transactional
      De todas formas, lo mas probable que en un futuro video hable de todo esto y como lo podemos implementar nosotros mismos si
      Un saludo

  • @johanvargasaranda444
    @johanvargasaranda444 4 หลายเดือนก่อน

    En el dominio suelo dejar los, puertos, dtos, class validators, entidades, y domain service, en la parte de app solo casos de usos y en infra lo divido con primary y secondary. Y utilice los module he inject para facilitar las inyecciones

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +2

      Tambien se puede hacer como comentas, al final todo es evaluar hasta que punto queremos desacoplarnos del framework y cuanto le queremos dejar entrar, gracias por compartir como lo sueles hacer, seguro que a muchos compañeros les es util 😁

    • @johanvargasaranda444
      @johanvargasaranda444 4 หลายเดือนก่อน

      @@AlbertHernandez excelente contenido

    • @raubelguerra9749
      @raubelguerra9749 4 หลายเดือนก่อน

      @@AlbertHernandez Gracias por el video. En mi caso también me gusta poner las validaciones en el dominio porque si llamo al caso de uso desde otro lugar que no sea el controlador me aseguro que se valide la entrada.

  • @Bleibruk
    @Bleibruk 4 หลายเดือนก่อน

    Muy buen contenido! Desconozco un poco Nestjs. pero si me interesa ver como propones usar un controller para abstraer el decorador de @transaction..
    Y GRPC, kafka o Rabbit no estaría mal para darle continuidad a este vídeo, y casi casi, una saga

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Gracias! Mas que en el controller lo del transaction igual lo meteria en un middleware, ya sea de http o incluso si estamos en CQRS en uno de buses, ya depende de lo que nos interese
      Me apunto lo de traer esos videos 😁 Un saludo!

    • @Bleibruk
      @Bleibruk 4 หลายเดือนก่อน

      @@AlbertHernandez gracias por la info!
      Pondré en práctica el vídeo y estaré pendiente a los vídeos!

  • @gposoft
    @gposoft 4 หลายเดือนก่อน

    excelente albert gracias saludos!

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Gracias 💪😁 Un saludo!

  • @Deus-lo-Vuilt
    @Deus-lo-Vuilt 4 หลายเดือนก่อน

    Buenisimo

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Muchas gracias! 💃💃

  • @pabloqv10
    @pabloqv10 4 หลายเดือนก่อน

    Hola, que buen video, muchas gracias. Que fuente y tema usas en WebStorm?

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Gracias ^^ Pues uso la de Jetbrains Mono y el tema de Monokai Pro (Filter Machine)

  • @jovelasquez23
    @jovelasquez23 3 หลายเดือนก่อน

    Hola Albert, queria saber como manejas las relaciones entre modelos dentro de la architectura, por ejemplo, la relacion entre User -> Payment y viceversa.

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน

      Pues va a depender mucho del caso pero si uno no puede existir sin el otro, por ejemplo, un pago siempre va asociado a un usuario, puedes guardar el id del usuario en tu modelo de pago

    • @jovelasquez23
      @jovelasquez23 3 หลายเดือนก่อน

      Gracias por responder​@@AlbertHernandez, ciertamente todo depende del caso, pero me queda la incertidumbre porque si las entidades estan a lo mas interno de la arquitectura, como se comunican cuando necesitas tener informacion de pago de un usuario tomando en cuenta que los contextos son /users y el otro es /payments

    • @breystonbarton4024
      @breystonbarton4024 3 หลายเดือนก่อน

      @@AlbertHernandez También tengo dicha duda, estaría bueno un video que explicara como se integran dichos servicios y buenas practicas, ya que considero que el problema de la arquitectura hexagonal es que puede llegar a ser un enredo cuando toca interactuar entre modelos, ejemplo tener que llamar un modelo dentro de otro.

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน +1

      Si, lo entiendo, puede llegar a ser muy confuso sobretodo si es la primera vez que se ve, intentaré traer algun video donde se vea como se puede solucionar todo esto

    • @jovelasquez23
      @jovelasquez23 3 หลายเดือนก่อน

      @@AlbertHernandez Muchísimas gracias!

  • @beidan8392
    @beidan8392 4 หลายเดือนก่อน

    excelente video! estas utilizando visual studio code? me parece muy distinto el editor que mostras

    • @usarral.
      @usarral. 4 หลายเดือนก่อน

      es intellij

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      En realidad es WebStorm hehe se me acabó la licencia de IntelliJ pero me dieron de WS 😁

  • @kmiiloberrio-dev
    @kmiiloberrio-dev 4 หลายเดือนก่อน

    Siempre me ha dificultado entender los contextos para cuando trabajo con microservicios.
    En qué casos existiría más contextos?, en tu ejemplo gestionas todo lo de payments que también lo podríamos entender como un microservicio, pero tiene sentido envolverlo en contextos sabiendo que solo manejaremos payments?

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Buenas! Pues depende de como diseñemos esos microservicios, si solamente vamos a tener un contexto por microservicio y repositorio si que podríamos quitar esta carpeta, aquí ya va a depender mucho de lo que tengamos. Lo bueno de tener esto de contextos es que nos va a permitir tener:
      - Un monolito modular, donde se despliegue todo junto pero teniendo esta separación de responsabilidades en distintas piezas, donde en un futuro si quisiéramos desplegarlas por separado lo tendríamos más sencillo
      - Podríamos ir con una solución de monorepo, donde cada contexto si que sea un microservicio pero tengamos todo en el mismo repositorio
      Como te comento, al final esto depende mucho de como queramos estructurar los proyectos, lo mejor es que al final es solo una carpeta donde podemos comenzar sin tenerla si creemos que no la vamos a necesitar y si luego vemos que si, ahí ya crearla en un momento y hacer un pequeño refactor

  • @fabioalbertomayorgaduarte5733
    @fabioalbertomayorgaduarte5733 2 หลายเดือนก่อน

    Considero que Hexagonal tiende a la sobreingenieria, y es solo aplicable a proyectos en donde trabajaran muchos desarrolladores.

    • @AlbertHernandez
      @AlbertHernandez  2 หลายเดือนก่อน

      No creas, yo lo he aplicado tanto a proyectos con pocos desarrolladores como de mayor escala. Si que es cierto que añade complejidad pero a cambio de flexibilidad de cambio y evolución, si tenemos un proyecto pequeño lo mas probable que no sea la mejor arquitectura, pero para otros si

  • @kmiiloberrio-dev
    @kmiiloberrio-dev 4 หลายเดือนก่อน

    Solo por despejar mi duda, no estaríamos rompiendo algún principio cuando creamos los pagos?, al enviarlo por post y a su vez devolver el resultado de la entidad creada? Cuál sería el principio que rompemos ?

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Buenas! No se si te refieres a que si esta mal que un método Post devuelva datos, pero si es eso yo no lo veo mal, es muy habitual que devuelva datos que luego necesite el cliente para saber los resultados de la operación, aqui podriamos incluir cosas como el identificador del recurso, url de donde se puede encontrar y asi luego poder utilizarla o incluso si estamos asumiendo datos por defecto luego podrias devolverlo en la propia respuesta para que el cliente los conozca

  • @PraexorVS
    @PraexorVS 28 วันที่ผ่านมา

    Los repositorios van en infraestructura

    • @AlbertHernandez
      @AlbertHernandez  24 วันที่ผ่านมา

      La implementación si pero lo que es la interfaz o clase abstracta donde se define el contrato va en la capa de dominio, ya que sino implicaria que cuando fueras a utilizarlos, tu caso de uso estaria hablando directamente con la infraestructura

  • @santiagousca
    @santiagousca 3 หลายเดือนก่อน

    algo q siempre e leido es q el dominio debe ir desacoplado de cualquier framework libreria etc pero aca veo q estas usando la libreria uuid dentro del dominio para generar los id ?

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน

      Si, en este caso uuid es un formato universal independiente del lenguaje y es lo que uso como identificador en mi dominio.
      Aqui tenemos dos posibles soluciones, implementar nuestro propio creador de ids usando este standard o usar alguna libreria de terceros que nos de esto, en este caso suelo preferir usar la libreria de tercero. Lo ideal es luego centralizar en un unico punto esto y si cambia la libreria que solo cambiemos una cosa de nuestra app

  • @gabrielluna2474
    @gabrielluna2474 4 หลายเดือนก่อน

    Hola Albert
    Voy a empezar un proyecto nuevo parecido al de mi comentario anterior y me gustaría utilizar ese template, si pudieras revisarlo y ver el error te agradecería mucho.
    Estoy teniendo problemas con el template de tu github nestjs-hexagonal-architecture-example
    Monté el contendor de docker pero en los logs tiene un problema con el logger de pino
    se que es algo que puedo quitar al ser un logger custom, pero tiene interceptores y todo, me gustaria conservarlo.

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Buenas! Dale un vistazo mas que a los example a los que tengo de template, esos están mas pulidos y creo que ya no te encontraras esos problemas
      De todas maneras le dare un vistazo a ese de example para ver si me pasa lo mismo que comentas

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน

      Hola @gabrielluna2474! Estoy revisando y me esta levantando el contenedor de docker bien, no se que te pueda estar pasando. Si ves que te sigue pasando crea mejor una issue en el repositorio y lo manejamos mejor ahí, que al final tenemos mas herramientas para compartir código / imágenes y otros compañeros pueden ayudar a investigar también

  • @santiagousca
    @santiagousca 3 หลายเดือนก่อน

    context se lo pdria llamar? modules

    • @AlbertHernandez
      @AlbertHernandez  3 หลายเดือนก่อน

      Si, no habría problema, el nombre que mejor te encaje al final es una nomenclatura de equipo

  • @isturizz
    @isturizz 4 หลายเดือนก่อน

    ¿Qué editor de código utilizas?

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Buenas! Pues utilizo WebStorm 😁

  • @RafaelJurado-u3o
    @RafaelJurado-u3o 2 หลายเดือนก่อน

    ¿Las entidades no deberían tener las validaciones de sus atributos?

    • @AlbertHernandez
      @AlbertHernandez  หลายเดือนก่อน

      Si, eso lo podríamos hacer por ejemplo con value-objects, pero eso ya sale de lo que es la arquitectura hexagonal, pero se suele usar de manera conjunta ya que compaginan muy bien

  • @savehunters4873
    @savehunters4873 4 หลายเดือนก่อน

    Nah este video me lo veo porque me lo veo

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +1

      Haha dale a tope, ya me dices que tal cuando te lo acabes 😁

  • @emanuelpalacio-q3l
    @emanuelpalacio-q3l 4 หลายเดือนก่อน

    No tiene sentido estod videos, hacelo con express pero forzar una arquitectura distinta a la q propone nest es mala idea.
    Es como ir a jugar al futbol a una cancha de básquet.

    • @AlbertHernandez
      @AlbertHernandez  4 หลายเดือนก่อน +3

      No coincido con lo que dices, la arquitectura de una aplicación va en base a las necesidades del proyecto y del equipo que tengamos, lo bueno que tiene NestJS es que es flexible y se puede adaptar a distintas maneras de trabajar, podemos empezar con la propuesta del framework que para muchos casos va bien pero si lo necesitamos podemos ir a una hexagonal o la que sea necesario.
      Es mas, hasta la propia NestJS en sus cursos oficiales como en el de arquitectura y patrones avanzados (courses.nestjs.com/#architecture), muestra como plantean ellos el uso de Hexagonal o DDD en el propio framework