MVRCO AG
MVRCO AG
  • Видео 8
  • Просмотров 19 488
🧪 Agregando TESTING a nuestra API de EXPRESS JS con ARQUITECTURA HEXAGONAL
Enlaces 🖇️
Código: github.com/mvrcoag/nodejs-express-hexagonal-architecture
Herramientas recomendadas: github.com/mvrcoag/clegen
¡Bienvenidos a un nuevo video en el canal de mvrcoag! En este tutorial, te mostraré cómo agregar pruebas automatizadas a una API de Express utilizando Jest y Supertest, todo esto en un entorno de TypeScript y siguiendo la arquitectura hexagonal.
¿Qué aprenderás en este video?
🔹 Introducción a Jest y Supertest: Conoce las herramientas líderes en testing para aplicaciones JavaScript.
🔹 Configuración de TypeScript: Ajusta tu proyecto para que funcione perfectamente con TypeScript.
🔹 Arquitectura Hexagonal: Aplica principios de arquitectura hexagonal para un código más lim...
Просмотров: 721

Видео

Creando una APP en REACT y VITE JS con ARQUITECTURA HEXAGONAL
Просмотров 6 тыс.3 месяца назад
Enlaces 🖇️ Código: github.com/mvrcoag/react-hexagonal Herramientas recomendadas: github.com/mvrcoag/clegen ¡Bienvenidos a un nuevo video en el canal de mvrcoag! En este tutorial, te mostraré paso a paso cómo crear una aplicación web en React utilizando la arquitectura hexagonal para lograr un código más limpio, modular y mantenible. ¿Qué aprenderás en este video? 🔹 Componentes y Hooks: Cómo uti...
Creando una API en NestJS con TypeORM, Supabase y Arquitectura Hexagonal
Просмотров 3,6 тыс.4 месяца назад
Enlaces 🖇️ Código: github.com/mvrcoag/nestjs-typeorm-supabase-hexagonal Modulo de User: github.com/mvrcoag/hexagonal-architecture-module-example Generador de modulos (Clegen): github.com/mvrcoag/clegen ¡Bienvenidos a un nuevo video en el canal de mvrcoag! En este tutorial, te mostraré paso a paso cómo crear una API robusta y escalable utilizando NestJS, TypeORM, Supabase y la arquitectura hexag...
MEJORA TU API DE NODE JS CON ARQUITECTURA HEXAGONAL
Просмотров 3,1 тыс.5 месяцев назад
Enlaces 🖇️ Código: github.com/mvrcoag/nodejs-express-hexagonal-architecture Generador de modulos (Clegen): github.com/mvrcoag/clegen En este video veremos cómo podemos mejorar nuestras APIs de Node JS y Express haciendo uso de la arquitectura hexagonal. Usaremos como base el modulo de usuarios que desarrollamos en los 3 videos anteriores, por lo que este video vendría a ser el "proyecto final" ...
APRENDE ARQUITECTURA HEXAGONAL | Cap. 3 Infrastructure
Просмотров 1,6 тыс.5 месяцев назад
Enlaces 🖇️ Código: github.com/mvrcoag/arquitectura-hexagonal/tree/3-infrastructure Generador de modulos (Clegen): github.com/mvrcoag/clegen En esta tercera parte de la serie de arquitectura hexagonal veremos la capa de infraestructura, crearemos dos repositorios, uno en memoria y otro en Postgres, además de un controlador HTTP usando Express. Podremos relacionar las 3 capas de nuestro módulo "U...
APRENDE ARQUITECTURA HEXAGONAL | Cap. 2 Application
Просмотров 1,4 тыс.5 месяцев назад
Enlaces 🖇️ Código: github.com/mvrcoag/arquitectura-hexagonal/tree/2-application Generador de modulos (Clegen): github.com/mvrcoag/clegen En esta segunda parte de la serie de arquitectura hexagonal nos adentraremos en la capa de aplicación, entenderemos qué son los casos de uso, veremos los beneficios de los repositorios y los value objects en nuestros metodos, además conoceremos los errores de ...
APRENDE ARQUITECTURA HEXAGONAL | Cap. 1 Domain
Просмотров 2,9 тыс.5 месяцев назад
Enlaces 🖇️ Código: github.com/mvrcoag/arquitectura-hexagonal Generador de modulos (Clegen): github.com/mvrcoag/clegen En esta serie de videos estaremos entendiendo la arquitectura hexagonal, y formas en las que podemos aplicarla para llevar nuestro código al siguiente nivel. En este primer video exploraremos la capa de dominio, la más central de todas y la que representa el corazón de nuestra a...
¡MEJORA tu código de NEST JS con EVENTOS!
Просмотров 5908 месяцев назад
A lo largo de nuestro desarrollo como profesionales nos enfrentamos a retos más allá de la lógica. Nos enfrentamos a problemas de arquitectura. ¿Qué sucede cuanto tenemos muchas responsabilidades dentro de una misma función? Es entonces cuando debemos buscar el desacoplamiento para alcanzar la mayor calidad, escalabilidad y claridad en nuestro código. Mejora tu código de Nest JS con eventos. 00...

Комментарии

  • @juancarlosuribebedoya7761
    @juancarlosuribebedoya7761 День назад

    Este material está genial, es oro! En el archivo main.ts alrededor del minuto "11:30" en la línea 9 siempre me sale un error que no he logrado corregir, he investigado bastante y no le encuentro solución dice así: No overload matches this call. The last overload gave the following error. Argument of type '(err: unknown, res: Response, req: Request, next: NextFunction) => express.Response<any, Record<string, any>>' is not assignable to parameter of type 'PathParams'. Alguien sabe cómo lo puedo solucionar? Tambien me sucede en el archivo ExpressUserRouter.ts, en cada router tuve que poner 'controller.getAll as any' por que de lo contrario sale el mismo error. Gracias de antemano!

  • @aldairmanzanosanchez8538
    @aldairmanzanosanchez8538 4 дня назад

    Me gusto tu explicación. Pero aun tengo dudas de la arquitectura me justaría que explicaras que pasa cuando tienes una entidad User y una entidad Rol como aplicarías la arquitectura hexagonal en esta situación.

    • @mvrcoag
      @mvrcoag 19 часов назад

      @@aldairmanzanosanchez8538 hola! Muchas gracias 🙌 Claro que si, vamos con el ejemplo: Aquí estamos hablando de una situación en la que se requiere que en una vista (por ejemplo) necesitemos ver datos de un usuario al igual que su rol, pero a nivel de código y base de datos estos son cada uno un módulo distinto, ¿que hacemos? Fácil. Le damos al front lo que quiere. Si estamos accediendo a esa información desde el módulo de User pero en el objeto User necesitamos información del Role, podemos entonces agregar las propiedades que necesitemos (roleId, roleName, o incluso una propiedad role que dentro de sí tenga un objeto de tipo Role). Ahora, ¿dónde se hace esto? En dos lugares: 1. Modelado de dominio, aquí agregaremos las propiedades que nos hagan falta a nuestro User, y no hay tanto problema porque gestiones específicas de Role las seguimos llevando en ese módulo y aquí User solo se relaciona con Role para consulta 2. Capa de infraestructura (ver video Cap. 3), dado que ahora para instanciar un objeto User se necesitará nueva información, debemos hacer las relaciones necesarias a nivel de base de datos en el repositorio para poder cumplir con los datos que pedimos en nuestro modelado de dominio Avísame si tienes dudas, un saludo 🙌

    • @aldairmanzanosanchez8538
      @aldairmanzanosanchez8538 10 часов назад

      Hola @mvrcoag, muchas gracias por tu respuesta. Después de analizar tu sugerencia, entiendo que propones convertir el rol en un Value Object dentro del usuario, lo que facilitaría la gestión. Además, como mencionas, sería la capa de infraestructura la encargada de devolverme esos datos. Esto funciona bien en el caso en que solo se requiera lectura, pero, ¿Qué ocurre si también necesitamos escritura y lectura? Por lo que entiendo de tu código, estás aplicando DDD (Diseño Dirigido por el Dominio), lo que nos permite modularizar el código siguiendo ese patrón. Ahora, supongamos que tienes una orden de pago que, al crearse, también debe generar un pago simultáneamente. Dado que estamos utilizando un enfoque DDD, deberíamos tener dos agregados: uno para Orders y otro para Payments. En este caso, ¿Cómo modelarías las entidades para reflejar esta relación y cómo gestionarías la obtención de la orden junto con sus pagos asociados?, Además ¿Cómo garantizarías que ambas acciones sean transaccionales? Finalmente, ¿Dónde aplicarías esta relación, considerando que mencionaste que la idea es evitar dependencias entre los casos de uso? ¿Quedaría esta relación también en la capa de infraestructura?

  • @juanjzb
    @juanjzb 10 дней назад

    Super recomendado. Una de las mejores explicaciones que he podido encontrar, y eso que he buscado muuuuuchos videos.

    • @mvrcoag
      @mvrcoag 19 часов назад

      @@juanjzb me alegra que te haya servido! Un saludo Juan 🙌

  • @enzofrias1367
    @enzofrias1367 13 дней назад

    muy Bueno! en el caso que quieras usar alguna libreria para validar igual crearias los value objects?

    • @mvrcoag
      @mvrcoag 19 часов назад

      @@enzofrias1367 muchas gracias! 🙌 Aquí como en todo, depende. Si será una aplicación pequeña-mediana en la que como máximo solo 3 personas estarán trabajando, de pronto los value objets no nos compensan, para este ejemplo mejor optaría por validaciones directas usando librerías como Zod pero siempre encapsulandolas en archivos pertenecientes a capas de dominio

    • @enzofrias1367
      @enzofrias1367 10 часов назад

      ​@@mvrcoagbuenismo! Muchas gracias!

  • @maximoporcile81
    @maximoporcile81 20 дней назад

    Muy buen video!, me gustó TS, sigo utilizando PHP para el back y tengo ganitas de probar cosas nuevas

    • @mvrcoag
      @mvrcoag 17 дней назад

      Hola! Muchas gracias Yo también comencé con PHP, es un gran lenguaje que sin duda permite hacer cosas increíbles, ¿Lo usas con o sin framework? Me da gusto que te encuentres probando, ¿Alguna tecnología que te gustaría que exploráramos en el canal? Un saludo!

  • @feli7487
    @feli7487 22 дня назад

    Saludos desde Colombia, me ayudaste bastante a aprender esta arquitectura. Espero pronto conseguir un empleo como desarrollador y agradecerte de alguna forma por tu sabiduría y conocimiento.

    • @mvrcoag
      @mvrcoag 21 день назад

      Mucho éxito en tu trayectoria como desarrollador, para mi es un placer ayudar a otros con mi experiencia a lo largo de los años. Un saludo desde México!

  • @juancarlosuribebedoya7761
    @juancarlosuribebedoya7761 22 дня назад

    Hola MVRCO excelente explicación, me aclaró muchas dudas, pero me generó otra jeje. En la capa de aplicación cuando llamamos las dependencias en el constructor por que se debe llamar como private 'constructor(private repository: UserRepository) {}' si no falla typescript con el siguiente error Property 'repository' does not exist on type 'UserGetAll'? Agradecería mucho si alguien me ayuda a clarificar esto, ya que he buscado un buen rato y no encuentro que puede ser. Gracias!

    • @mvrcoag
      @mvrcoag 21 день назад

      Hola Juan, ¿Cómo estás? Verás, la sintaxis que usamos en esa línea se llama "parameter properties", que permite definir y asignar automáticamente propiedades de clase en el constructor de forma concisa Si no quisieras establecer el private en el mismo constructor, lo que podrías hacer es declarar una propiedad por separado y luego asignarla en el constructor, que funciona, pero personalmente me parece que se escribe más código Ahora, si tu duda esta en la palabra clave "private", se utiliza para definir el nivel de acceso de una propiedad o método dentro de una clase. Cuando declaras una propiedad o un método como private, significa que solo puede ser accedido desde dentro de la misma clase en la que fue definido, y no desde fuera de la clase o desde otras clases que hereden de ella Hazme saber si te quedan dudas, ¡Un saludo!

  • @JaveritoPe
    @JaveritoPe 25 дней назад

    Se desvía mucho del tema central 😢. Como el 99% sobre el tema y otros temas de programación cuando queremos enseñar 😅.

  • @mctribals
    @mctribals 27 дней назад

    Marco, Exelente la explicacion de los 3 videos, me ayudo entender el concepto de la arquitectura. Saludos desde Brasil!

    • @mvrcoag
      @mvrcoag 21 день назад

      Hey, muchas gracias! Saludos desde México

  • @ElYorWTF
    @ElYorWTF Месяц назад

    No es por nada, pero no estas usando los conceptos de drivers y drivens que dice alickstar cockburn y jmgarrido en su libro. Veo que estas haciendo una especie de onion architecture con uno que otro concepto de ports and adapters. Corrigeme si me equivoco

  • @zjimenez110492
    @zjimenez110492 Месяц назад

    Crack!!!! 🚀 Muy buen ejemplo.. me quedó super clarísimo, muy bien explicado. Te agradezco por este tipo de contenido claro y conciso.

    • @mvrcoag
      @mvrcoag 21 день назад

      ¡Que bueno que te haya gustado! ¿Algún tema en especifico que te gustaría que exploremos? Un saludo

  • @ferminriadi
    @ferminriadi Месяц назад

    Excelente video explicativo de la Arquitectura Hexagonal y lo bueno que hace en el desacople. Ahora bien quisiera saber cual extensión tienes instalada de autocompletar código? Nuevo suscriptor! Saludos!!

    • @mvrcoag
      @mvrcoag Месяц назад

      ¡Hola Fer! Muchas gracias En mi caso uso Github Copilot, te dejo el enlace por si te interesa: github.com/features/copilot ¡Un saludo!

  • @alejandroospina5409
    @alejandroospina5409 Месяц назад

    Muy bien explicado, tengo una pregunta en la part1 del dominio cuando mencionas que un servicio muta o cambia la data no debería de retornar nada, ¿Que tna estricto es esto?, porque tenía entendido que la buena práctica era que retornara como se guardó en DB o se actualizò etc... PD: Me gusta como explicas, me gustaría ver vídeos acerca de Clean Arquitecture

    • @mvrcoag
      @mvrcoag Месяц назад

      ¡Hola Alejandro! Es tan estricto como tu aplicación lo requiera. Se considera una buena practica seguir el principio de "responsabilidad única". Bajo esta premisa un método debería hacer solo una cosa y no más. Continuando con el ejemplo, si un método guarda en la base de datos y además devuelve el resultado tendría dos responsabilidades, y si bien podemos dejarlo pasar aquí ya hay algo que nos puede decir que las cosas no están del todo bien, ya sea el flujo de nuestra aplicación o la arquitectura de la misma. Hay casos donde por ejemplo requieres el ID del recurso que se acaba de crear y es por esto que necesitas que el método devuelva el objeto una vez lo crea. Para lo anterior una buena practica es no delegar a la base de datos la responsabilidad de generar identificadores sino generar el ID desde nuestro código, con este cambio la necesidad de devolver el recurso recién creado carece de sentido debido a que nosotros sabemos con qué datos se crea ya que le pasamos la información completa, además de que tenemos mucho más control sobre nuestro aplicativo al no depender de terceros (en este caso la base de datos para generación de IDs). Claro que todo lo anterior funciona solo bajo el "depende", pero siempre es bueno conocer la mayor cantidad posible de puntos de vista para que llegado el momento tomemos la mejor decisión. ¡Un saludo!

  • @Foo678
    @Foo678 2 месяца назад

    hola, gracias por el contenido es muy didactico. Tengo una consulta, si quiero usar una libreria de terceros como por ejemplo zod para validar mis value objects (dominio), tendria que implementar un repository de zod y lo mismo para cualqiuer otra libreria

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Hola! Para el caso de validaciones podríamos usarlas directamente en dominio siempre que asumamos la responsabilidad de no cambiabilidad a lo largo del tiempo, es decir, asumir que Zod en este caso será el estándar de validación a lo largo de todo nuestro proyecto y tratarlo como un paquete interno del lenguaje. Al final la opción del repositorio (o de cualquier forma de implementación de interfaces de dominio) es válida, pero entendemos que puede ser mucho código y abstracciones para algo tan sencillo como validar datos. Aquí habría que poner en una balanza si realmente necesitamos esa separación de conceptos tan estricta o si bien podemos asumir la responsabilidad de estandarización de Zod y usarlo directamemte en nuestros value objects. Al final, como casi todos los casos, dependerá del contexto del proyecto, al final la arquitectura hexagonal más que ser una estricta guía es una serie de patrones que se adaptarán más o menos a nuestro contexto, lo importante es conocer todas nuestras herramientas y saber para qué casos resulta mejor usarlas. Si tienes dudas quedo pendiente, ¡Un saludo!

    • @Foo678
      @Foo678 Месяц назад

      @@mvrcoag Todo claro, muchas gracias. Resumiendo deberia usar ZOD como middleware para validar si los TIPOS DE DATOS y alguna que otra regex cumplen con lo que necesita mi controllador. Y la validacion de los value object es solo para hacer validaciones a la entidad de nuestra logica de negocio, como por ejemplo un descuento en una prenda de vestir, una divisa local, igv, etc.

  • @abelagustinandrademejia4621
    @abelagustinandrademejia4621 2 месяца назад

    Si deseo cambiar de Orm tocaria modificar el UserModule

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola Abel! Justo ese es uno de los puntos más fuertes de la mayoría de arquitecturas limpias, y es que puedes cambiar las tecnologías de terceros (como el ORM) sin afectar gran parte de tu aplicación, sino solo donde este se instancia ya que las interfaces nos funcionan como intermediarios. Es decir, para este caso solo tendrías que crear tus nuevas implementaciones de los repositorios para el nuevo ORM (tal como se hizo con TypeORM) e instanciarlo en donde quieras consumirlo, de esta forma ni la capa de aplicación y mucho menos la de dominio se verán afectadas. Si tienes dudas sigo pendiente, un saludo! 👋

  • @suko8285
    @suko8285 2 месяца назад

    Buen video 🎉 Creo que la parte de binding del user.module.ts es poco escalable, por que en este caso de uso solo se necesita un repositorio pero imagina que tenemos que usar N repos 😅 o por ejemplo que en los tests quiero inyectar un FakeUserRepository, necesitare añadirle el @Injectable en capa de dominio. Tambien se pierde la gracia del contenedor de inyección de dependencias. Creo que nestJs debe solucionar la parte del Injectable de inversify y autoinyectar en un AppServiceProvider como hace Laravel. Como solucion alternativa puedes hacer un helper de dominio en la carpeta shared y llamarlo Injectable para añadirlo en las clases que lo necesites

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Hola! En cuanto a tu primer punto me llama la atención y coincido en que el binding se vuelve verboso, aquí sacrificamos conveniencia por separación de conceptos al definir estrictamente qué repositorio usará cada caso de uso para de esta forma no llevarnos la directiva "@injectable" de Nest JS (infrastructure) a capas de application o de domain, ¿De qué forma lo solucionarías tú sin contaminar capas internas con código o dependencias de infraestructura? Te leo Continuando, totalmente de acuerdo, Nest JS maneja la inyección de dependencias de tal forma que se vuelve difícil hacer una implementación sin acoplarnos directamente al framework, cosa que en arquitecturas limpias nos interesa evitar. En cuanto al ejemplo del FakeUserRepository, al ser esta una implementación de "UserRepository" yo no lo pondría en domain sino en infrastructure, y no lo pondría en el código "src" sino en el código de "tests", esto para tener bien separados los conceptos de código de producción y código de testing. Un saludo!

    • @suko8285
      @suko8285 2 месяца назад

      @@mvrcoag En los proyectos donde aplico hexagonal y DDD intento buscar un equilibrio entre codigo que es 100% desacoplable y herramientas del framework donde puedo asumir un pequeño acople para no perder facilidad en el manejo del mismo. Para este caso yo me acoplaría al @injectable o intentaría hacer un helper como ya dije en shared. Por la parte del @inject en los constructores utilizaría clases abstractas que si se pueden instanciar y el framework puede inyectar sin necesidad de un Symbol. Por la parte del FakeUserRepository, aun que sea un repo de test esta claro que no cambiara segun mi implementacion real, es decir, si mañana cambio la implementacion de produccion el fake del teste no deberia tener ningun cambio

  • @AlejandroRL868
    @AlejandroRL868 2 месяца назад

    bro, buenas de nuevo, para cuando un video de Docker y Kubernetes? disculpa las molestias, es que explicas genial

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola Alejandro, últimamente he estado algo ocupado con temas del trabajo, sin embargo Docker es una tecnología bastante interesante y que se puede aprovechar muy bien en flujos de trabajo modernos y claro que me interesa la idea de hacer un video al respecto! Aún así si tienes dudas especificas siempre puedes contactar conmigo por mis redes sociales, casi siempre suelo estar más activo por LinkedIn por lo que si necesitas algo con gusto trataré de ayudarte. ¡Un saludo y pronto volverán los videos!

    • @AlejandroRL868
      @AlejandroRL868 Месяц назад

      @@mvrcoag gracias bro, por el apoyo, es que no hay manera que yo logre entender el kubernetes, y entonces como te entiendo tan bien, queria ver si lo entiendo, solo eso, gracias por los videos!

  • @nythe3009
    @nythe3009 2 месяца назад

    En la parte de generateId no seria buena idea meter eso en una carpeta shared/utils para asi hacer uso de ella en domain sin afectar la hexagonal architecture? De esta manera si en un futuro queremos cambiar la libreria de generacion de ids, seria solo editar la funcion de utils y no la de cada Entidad que utilizo un generateId

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola! Es correcto, para proyectos donde no solo existe un módulo (la mayoría) es correcto optar por centralizar las funciones o clases compartidas como esta que comentas. La solución que personalmente uso en mis proyectos y equipos es generar el archivo en la carpeta /lib/Shared/domain/Id. De esta forma mi código sigue dentro de mi carpeta principal "lib", y a partir de "Shared" cualquier otro módulo puede acceder a esas utilidades globales. ¡Un saludo!

  • @Josevi-f8w
    @Josevi-f8w 2 месяца назад

    ¡Excelente trabajo el que realizas! Gracias por ayudarnos a ampliar conocimientos. Saludos desde España.

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Me alegra mucho que te haya funcionado! Saludos desde México 👋

  • @alonsogarcia2580
    @alonsogarcia2580 2 месяца назад

    Pues me pareció MUY BUENA TU EXPOSICIÓN, felicidades por tu dominio del tema. Creo que es un gran balance entre los conceptos y su implementación, un gran equilibrio entre profundidad conceptual y practicidad de implementación. Estoy retomando mi carrera de desarrollador, por caprichos del destino ahora tengo que desarrollar una tienda en línea o aplicación de "e-commerce". En forma directa y práctica, tengo dos opciones: Wordpress (woocommerce) o Joomla, entonces pensé: "cómo puedo aplicar la arquitectura hexagonal para aislar el framework y que en algún momento pueda cambiar entre éstos", ¿cómo puedo aplicar ésta arquitectura para aislar la base de datos?". Me parece interesante éste escenario porque se trata de aplicar ésta arquitectura hexagonal en un entorno donde de entrada yá se me impone un framework (o un par de ellos) y por otra parte se tiene que aplicarla a un framework con TODO su sistema de clases, objetos, mecanismos, etc., es decir, ya no parto de cero como en ésta gran exposición que díste.

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola Alonso! Bienvenido de vuelta al software! Suena bastante interesante el proyecto, especialmente porque nunca he tocado temas de Wordpress o parecidos, me sería muy interesante saber cómo aplicas estos conceptos a esas tecnologías. Muy interesante tu análisis para el proyecto que llevas, te deseo mucho éxito! Un saludo 👋

  • @L3anAv
    @L3anAv 2 месяца назад

    No soy de comentar mucho en videos, pero este se lo merece. La verdad, excelente toda la serie de videos acerca de como implementar algo con esta arquitectura. Justo estaba queriendo hacer una app de notas para incorporar typescript y todo esto me viene genial para agregarle algo más. Muchisimas gracias por compartir tus conocimientos! la verdad se agradece, sos muy claro al explicar y tus videos estan muy bien estructurados, te felicito!. Nada más que decir. Saludos y que sigas bien!

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola! Qué bueno que te gustó, y espero que te funcione de maravilla en este y los próximos proyectos que desarrolles, mucho éxito! Saludos! 👋

  • @Josevi-f8w
    @Josevi-f8w 2 месяца назад

    ¡Excelente! Muchas gracias por tu esfuerzo y explicaciones. Saludos desde España.

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Muchas gracias! Saludos desde México 👋

  • @Josevi-f8w
    @Josevi-f8w 2 месяца назад

    !Muy bueno! Gracias por el aporte.

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Muchas gracias! Un saludo 👋

  • @santiagousca
    @santiagousca 2 месяца назад

    algo q no entendi por q usar un value object para validar si existen librerias para ese tipo de validacones

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola Santiago! La idea del value object es primero que funcione como entidad de modelado de nuestro dominio y de esta forma lograr que sea más expresivo, y segundo que funcione como validador de nuestra aplicación y así no depender directamente de validadores de terceros. Ahora, perfectamente podemos usar librerías en nuestros value objects para el tema de validación *siembre que asumamos la responsabilidad de mantenimiento a lo largo del tiempo de estas librerías*. Es decir, podrías tener un value object que se apoye en Zod para las validaciones, pero tu aplicación ni cuenta se dará de que usas Zod, solo conocerá al value object. Saludos! 👋

    • @santiagousca
      @santiagousca 2 месяца назад

      @@mvrcoag gracias me puse a leer u poco más y tienes razón el correcto es q el domain no se acople a librerías externas por q llega a tener dependencia

  • @santiagousca
    @santiagousca 2 месяца назад

    el por que todo el codigo dentro de la carpeta lib?

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola Santiago! Es una practica para tener todo el código de nuestra lógica de negocio ahí, podrías tener otro nombre como "modules" o "sections", personalmente me gusta llamarlo "lib". Otro beneficio que nos aporta es que al tener todo contenido en una sola carpeta si el día de mañana queremos reutilizar nuestros módulos en un nuevo proyecto es tan fácil como copiar, pegar e ir llamando los módulos donde los necesitemos. Un saludo 👋

  • @oOserg1Oo
    @oOserg1Oo 2 месяца назад

    Es valido en la parte de valuesObjets utilizar alguna validador como zod ?

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola! Sí, siempre que asumamos la responsabilidad de que Zod no cambiará en nuestro modulo es valido usarlo como agente de validaciones para nuestro dominio. Un saludo! 👋

  • @celestialblink3308
    @celestialblink3308 2 месяца назад

    Crack x3

  • @jesusmanuelhernandezvillat7796
    @jesusmanuelhernandezvillat7796 2 месяца назад

    Muchísimas gracias por el vide muy buena explicación hace un cuatri lleve esto en la uni pero el profe no supo impartír las clases no sabes la ayuda que esto representa

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Me alegra que te haya servido Jesus! Un saludo 👋

  • @gerardopacheco9521
    @gerardopacheco9521 2 месяца назад

    wooa excelente!!!! es un nuevo enfoque para mi todo esto...muchas gracias

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Qué bueno que te gustó! Un saludo 👋

  • @celestialblink3308
    @celestialblink3308 2 месяца назад

    Crack!!!

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Muchas gracias! Un saludo

  • @moy_4520
    @moy_4520 2 месяца назад

    Yo empecé a aprender lo hace apenas 2 semanas, me gustó mucho hasta el momento ya he comprendido bien el funcionamiento y más porque le implementó vertical slice y streaming arquitectut

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola! Justamente vertical slicing y screaming architecture son dos técnicas que mejoran aún más la claridad del software, gracias por tu aporte!

  • @fdovazqc
    @fdovazqc 2 месяца назад

    A tu entidad en lugar de ponerle el método mapToPrimitive le puedes poner toJSON y ya no necesitarías invocar el método en tu respuesta en automático al mandar el objeto a la respuesta se parsea, gracias por tus tutoriales muy buenos 👍🏼

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Hola! Lo que propones es un muy buen enfoque, sin embargo hay ocasiones en las que requerimos de datos primitivos que JSON no puede manejar (como el objeto Date) para trabajarlos dentro del mismo flujo antes de enviar la respuesta al cliente. Si bien esto no aplica a todos los casos, estoy de acuerdo en que mientras más sencillo sea el software mejor, y toJSON lo hace bastante bien. ¡Muchas gracias por tu aporte!

  • @lucianoleyria
    @lucianoleyria 2 месяца назад

    Excelente video! La verdad que después de buscar mucha información sobre la arquitectura hexagonal, creo que en esta serie de videos fueron muy bien explicado cada uno de los conceptos. Muchísimas gracias! Estaría bueno si pudieras hacer un video en donde le agregues un middleware con validaciones y otro con un manejador global de errores.

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Muchas gracias Luciano! Excelente idea, tal vez podamos hacer un video dedicado a errores y cómo aprovecharlos, ¡Gracias por el aporte!

  • @cristophercl3685
    @cristophercl3685 2 месяца назад

    Hola que tal, una pregunta en una parte del vídeo mencionaste que ningun modulo puede ser tocado por otro pero tengo una gran duda en cuánto cuando hay relaciones entre módulos/entidades cómo se maneja esa parte? En que parte creariamos las clases para relacionar las tablas? Y como se haria las inserciones de tablas relacionadas? De antemano agradezco la respuesta y seguiré viendo el siguiente video, exelente explicación la mas completa que he visto 👌🏻, Gracias,

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Hola! Lo que intentas de hacer es tarea del repositorio, ya que si bien dentro de dominio no debería haber contaminación con otros dominios de otros módulos, el repositorio sí puede interactuar directamente con la base de datos y con las tablas que necesite, y es este el que se encargaría de hacer las relaciones necesarias ya sea para lectura o escritura de datos. Aquí el dominio solo tendría que tener los datos necesarios tanto para lectura o escritura, y en caso de que no pudieran ser iguales (por ejemplo, porque para leer un usuario no necesitas su roleId pero para crearlo sí) entonces podríamos tener dos clases, una de read model (UserReadModel) y otra de write model (UserWriteModel) y que estás se usen de acuerdo a las necesidades. Si tienes dudas quedo pendiente, ¡Un saludo!

  • @Miscafer
    @Miscafer 2 месяца назад

    Holaaa, soy desarrollador angular y de hecho implementé esta arquitectura en un proyecto, pero siénndote sincero nunca lo había entendido tan bien hasta hoy. ¡Buen video!

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Es un placer! 🙌 Qué bueno que te gustó! Saludos 👋

  • @rbjmalca2
    @rbjmalca2 2 месяца назад

    Y si necesito el id generado de mi usuario? En caso sea un serial o autoincrementable?

    • @mvrcoag
      @mvrcoag 2 месяца назад

      Podrías agregarlo a tu modelado de dominio y a partir de ahí menejarlo a lo largo de toda la aplicación. El hecho de que sea un serial o autoincrementable carece de importancia a nivel de modelado ya que eso lo decidirás en el dominio para terminar afectando la base de datos, realmente puedes usar cualquiera de los dos! 🙌 En el canal tenemos varios videos llevando estos ejemplos a casos reales utilizando distintas tecnologías, aún así si quedan dudas házmelo saber! Un saludo! 👋

  • @eladioquinterolopez8020
    @eladioquinterolopez8020 3 месяца назад

    Buen video, desconocía el uso de esta arquitectura en TS, excelente

  • @emanuelpalacio-q3l
    @emanuelpalacio-q3l 3 месяца назад

    No entiendo porque aplicar hexagonal y complicarte siendo que nest es opinionado y usa otro patron. Para eso create tu sistema con express

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@emanuelpalacio-q3l hola! 🙌 Tienes toda la razón, y comparto tu opinión, la arquitectura hexagonal no es para todos los proyectos. ¿Donde sí lo aplicaría? Por ejemplo, en proyectos grandes donde los equipos sean mayores a 2 personas y el proyecto tenga proyección a futuro. De esta forma aprovechamos todas las ventajas de la arquitectura hexagonal y la complejidad ya nos compensa. Es cierto que para proyectos menos complejos la arquitectura hexagonal puede traer más problemas que beneficios, y aquí optaría por frameworks con soluciones out-of-the-box como Nest que ya tiene sus opiniones respecto a como hacer y estructurar el proyecto. Mi intención es compartir los conocimientos y experiencia que he adquirido al trabajar en distintos tipos de proyectos, agradezco mucho tu punto de vista! Un saludo 👋

  • @sanchezcarlos1986
    @sanchezcarlos1986 3 месяца назад

    Experience video! Muy bien explicado, lo cual se agradece mucho porque estos ya son temas avanzados y en español poco se encuentra en RUclips. Muy buen trabajo, que siga creciendo el canal, nuevo suscriptor por acá!

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@sanchezcarlos1986 Muchas gracias Carlos! 🙌 Me alegra que te haya gustado! Saludos 👋

  • @andres-kj9hg
    @andres-kj9hg 3 месяца назад

    Excelente contenido, una duda si quiero implementar un orm como deberia hacerlo ?

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@andres-kj9hg ¡Muchas gracias! 🙌 En cuanto al ORM es sencillo, lo puedes aislar a su propia carpeta en la capa de infraestructura. Por ejemplo, si quieres usar TypeORM en un módulo de "User" podrías crear una carpeta en User/infrastructure/TypeOrm y aquí por ejemplo archivos como TypeOrmUserRepository y TypeOrmUserEntity. Esto variará en función del ORM que uses, aunque aquí ya que se trata de infraestructura tenemos más flexibilidad a la hora de definir como creamos, nombramos, y relacionamos los archivos entre sí. En el canal hay un vídeo de Nest JS + TypeORM, tal vez ese ejemplo te pueda ayudar, y si tienes más dudas házmelo saber! Un saludo 👋

  • @Deus-lo-Vuilt
    @Deus-lo-Vuilt 3 месяца назад

    De casualidad no tienes pensado hacer algun mini proyecto completo que integre tanto backend y frontend usando arquitectura y ver como funcionaria todo ya mas completo ? quizas junto a github actions o etc para desplegarlo

    • @mvrcoag
      @mvrcoag 2 месяца назад

      ¡Tú idea me parece excelente, suena como un video largo sin embargo la idea me emociona mucho! Muchas gracias por tu aporte, un saludo

    • @Deus-lo-Vuilt
      @Deus-lo-Vuilt 2 месяца назад

      @@mvrcoag estaría genial 🙌

  • @wjmmk
    @wjmmk 3 месяца назад

    Excelentes Videos parce, solo falta con microservices en Nest & Hexagonal.

    • @mvrcoag
      @mvrcoag 3 месяца назад

      Qué gran idea! 🙌 En el canal ya tenemos un vídeo de Nest JS con Hexagonal, pero la parte de microservicios me parece bastante interesante para cubrirla en un vídeo, un saludo! 👋

    • @wjmmk
      @wjmmk 3 месяца назад

      @@mvrcoag, definitivamente broth. Ya que la comunicacion entre los distintos modulos y la configuracion varia un poco.

  • @AndresSuarez-zd3oe
    @AndresSuarez-zd3oe 3 месяца назад

    Totalmente agradecido por este valioso conocimiento que compartes! además, revisé tus respuestas de otros comentarios y aprendí muchas otras cosas, se nota el interés que tienes por compartir honestamente tus saberes. Gracias!

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@AndresSuarez-zd3oe muchas gracias Andrés! 🙌 Es un placer compartir mis experiencias y conocimientos con las personas, un saludo! 👋

  • @AndresSuarez-zd3oe
    @AndresSuarez-zd3oe 3 месяца назад

    Muy buen video! me hacía falta un contenido así de bien explicado, con buenas prácticas y que ayude a subir el nivel de nuestros proyectos. Gracias!

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@AndresSuarez-zd3oe muchas gracias! 🙌 Que bueno que te aportó, un saludo! 👋

  • @eduardovielma7205
    @eduardovielma7205 3 месяца назад

    Excelente! muchas gracias por este aporte es brutal!!!

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@eduardovielma7205 muchas gracias! 🙌 Un saludo! 👋

  • @Deus-lo-Vuilt
    @Deus-lo-Vuilt 3 месяца назад

    Un material muy interesante , se agradece compa como siempre!

    • @mvrcoag
      @mvrcoag 3 месяца назад

      @@Deus-lo-Vuilt muchísimas gracias! 🙌 Un saludo! 👋

  • @davidllanes1019
    @davidllanes1019 3 месяца назад

    Muy buen video, gracias 🤩. ¿Tienes pensando hacer algún video donde utilices microservicios con arquitectura hexagonal? Sería genial si también incluyeras Docker :)

    • @mvrcoag
      @mvrcoag 3 месяца назад

      Hola David, me alegra que te haya gustado! 🙌 La idea me gusta, microservicios funciona de maravilla con la arquitectura hexagonal, y qué mejor que tener un ambiente local tan organizado como Docker lo permite. Muchas gracias por tu aporte y sugerencia, un saludo! 👋

  • @danielagudelo1126
    @danielagudelo1126 3 месяца назад

    Hola, el contenido me ha sido de mucha utilidad. Una duda. Si tengo una interfaz que quisiera compartir entre varias clases de distintas dominios, ¿Esta se puede crear en la carpeta shared/domain/nombre.interface.ts y ahí importarla desde los dominios que la use?

    • @mvrcoag
      @mvrcoag 3 месяца назад

      Hola Daniel! 🙌 Qué gusto que te haya aportado. En cuanto a tu duda, sí, es totalmente posible, aunque hay que tener cuidado en abusar de la carpeta "Shared" ya que podría volverse la carpeta donde terminemos metiendo todo y entonces perdería sentido la división de módulos que justamente propone la arquitectura hexagonal. Si tienes más dudas quedo pendiente, un saludo! 👋

  • @AlejandroRL868
    @AlejandroRL868 3 месяца назад

    saludos bro, gracias por el video, siempre atento! gracias de veras

    • @mvrcoag
      @mvrcoag 3 месяца назад

      Es un placer Alejandro! 🙌

  • @davidestebanmoralesnustes2041
    @davidestebanmoralesnustes2041 3 месяца назад

    Excelente video mi hermano, super útil. Estaría genial si pudieras hacer un video explicando conceptos de CQRS y DDD en arquitectura hexagonal.

    • @mvrcoag
      @mvrcoag 3 месяца назад

      Me parece muy buena idea, creo que podría complementar muy bien los videos que existen en el canal! 🙌 Muchas gracias por el aporte David, un saludo 👋