amigos vamos a darle cañita ya os digo que tenemos aquí el código y voy a abrir por aquí el curso abrimos aquí el curso vale abrimos las clases y fíjate que tenemos clase 1 clase 2 clase 3 nos quedamos en la clase 3 y en la clase 3 en la clase 3 hicimos una Rest Api vale No solo hicimos una resta y para crear actualizar con recursos os explicaré que es una resta y todo esto sino que además además arreglamos el tema de Kors y te expliqué desde cero Qué es cors por qué te da
problemas Y por qué no es un problema que ocurra en el servidor sino que es un tema de seguridad del navegador vale Y cómo solucionarlo correctamente y cómo no poner un asterisco y tal muchas veces 10.000 millones de veces os habéis quejado de las cosas y os puedo asegurar que no os ha explicado nadie el tema de las cosas como lo expliqué yo en la anterior clase Porque mucha gente os dice no pone aquí course pones un asterisco esa regla Y eso eso no es que entiendas que es cosa esos que te han dicho cómo
arreglarlo no como no para que lo entiendas Así que importante Si eso Échale un vistazo a la siguiente clase y te va a quedar clarinete clarinete de hecho os expliqué incluso qué es esto de cosplay cuando ocurre madre mía si es que luego me dicen que no hacemos contenido avanzado y esto hay senos que tienen 10 años de experiencia que yo en la última empresa no tenía ni idea que era esto no lo sabían dicho esto esto todo esto que hicimos todo esto está muy bien vale entonces hicimos esquemas hicimos validaciones las hicimos con zood
estuvo buenísimo pero no lo desplegamos a producción y he pensado hostias pues lo podíamos desplegar Así que lo primero que vamos a hacer es desplegar a producción nuestra Api OK Vamos a utilizar FL 0 FL cero que fijaos que se llama backing de Play backen applications avases in minutes Por qué os recomiendo ahora este servicio que claro estas cosas Como pasan a veces cambia la cosa pero tal no Pero por qué ahora es interesante FL cero FL 0 en el pricing tienen una capa gratuita que al final tienes aquí cero dólares al mes cero dólares
al mes y lo importante que tenemos es que ni siquiera hay que poner la tarjeta de crédito veremos esto cambia Y tal Pero la capa gratuita es generosa es muy buena y Vais a poder tener un proyecto 100% gratis con estas limitaciones vale 256 megas de ram compartida la cpu Obviamente que le vamos a hacer 10 GB de transferencia storage de un giga no tiene autoescalings o faltaba Claro ya es increíble pero está bastante bastante bien vale pues le vamos a dar a singing Ok y vamos a ver qué nos ofrece aquí esto creo que
le vamos a dar a github iniciamos sesión con github más rápido más rápido no me tiréis flc ahora que os conozco muy bien entonces yo no tengo ningún proyecto todavía Así que vamos a ello vamos a crear un nuevo proyecto y vamos a llamarle aquí resta y que es la que hicimos la semana pasada creamos un nuevo proyecto y aquí tenéis dos opciones una es para desplegar directamente una base de datos postgre que ya veremos en más adelante añaden otras y tenéis la de diploy code with github O sea que podéis crear un repositorio de
github en el que podáis poner ahí vuestra aplicación y desplegarlo pues vamos a ir a github Vale y vamos a crear aquí un proyectito le damos Aquí voy a decir que lo uner soy yo Rest Api deploy voy a llamarle vale venga sí que lo tengo para para desplegar la Api de Note a FL 0 vale público bla bla bla ahora mismo está la vacío y lo que voy a hacer es pues este repositorio lo voy a clonar vale lo voy a clonar aquí mismo vale git Clon me pego esto por aquí cede rust Api
deploy muy bien Ahora abro aquí el editor este proyecto está vacío obviamente entonces vamos a desplegar nuestra Api vamos a volver al código vamos a volver al código que tenemos aquí en el curso de node Vale y aquí la clase 3 la voy a abrir en el finder vale me voy a bajar por aquí y me voy a traer todo este contenido por aquí copy folders quiero copiar las faldas Vale qué es lo que he hecho básicamente lo que he hecho es copiar el contenido que teníamos en la clase 3 me lo he traído aquí
y aquí Bueno ahora revisar el packagelock tendríamos las dependencias que necesitamos cors Express vale en lugar de clase 3 vamos a poner Rest Api y aquí que puede ser interesante es que le pongamos un Start vale Y el Start será note app.js la verdad no sé qué Script necesita para ejecutarse Ah lo miraremos vale Pero lo importante es que tengamos como un Script que sea para inicializar nuestra Api ejecutamos con node nuestro archivo A punto js que es el que tenemos aquí que es justamente el que tiene todo nuestro código de la Api ahora bien
importante una cosa básica que hagáis despliegues a cualquier servicio es Exacto revisar esta parte de aquí vale porque porque a veces hay hacéis esto si hacéis esto Esto puede ser problemático vale por qué porque normalmente el puerto lo está metiendo por variable de entorno el servicio donde lo vamos a hospedar vale Así que es súper importante que siempre siempre hagáis Esto vale entonces qué es lo que estamos diciendo Oye si me viene por variable de entorno el puerto porque el puerto lo va a asignar de forma automática el Hosting que nosotros vamos a utilizar utiliza
ese y si no utiliza por defecto este lo digo porque muchas veces me he encontrado con el problema que mucha gente dice es que no sé por qué no me funciona y es porque hacéis esto que siempre utilizo un puerto o que utilice un puerto Random y claro lo que necesitáis siempre siempre es utilizar la variable entorno del proceso qué más Ah vamos a poner aquí un gui para que no pegue el nuevo modules vale no modules fuera y en principio yo creo que con esto ya Lo tendríamos no vamos a vamos aquí al resto
y vamos a hacer un en pie mistol simplemente para que nos aseguremos y ya está porque en mayúscula me ha pasado a veces que lo dejo en minúscula y no funciona efectivamente el Port este las variables de entorno siempre son en mayúscula importante Por qué no funciona pues es muy fácil es muy fácil Por qué no funciona Porque si tú no pones Si tú no utilizas el puerto que te está asignando el Hosting el Hosting tú le dices No es que yo utilizo el 1 2 3 4 claro Esto está muy bien en tu máquina
el local porque tú sabes tú sabes que en tu máquina el puerto 1 2 3 4 está libre os lo puedes utilizar o tienes permisos para utilizarlo pero en el Hosting cuando tú vas a hospedar tu Api tú no sabes que cuál es Cuál es el parking en el que te vas a poner no no tendrías ni idea Así que tienes que decirle que te lo dejen el Hosting que te lo diga y así es como te lo dice te lo dice por varia muy bien Vamos a pulsear los cambios de nuestra Api vamos a
deploy Api tu fl0 vale Confirmamos y ahora nos aseguramos que hacemos aquí el Push para que lo llevemos muy bien revisamos que aquí tengamos todo el tema tenemos el packageon perfecto no le he puesto un ritmo tampoco hace falta Ok y ahora lo que vamos a necesitar es ir a fl0 Nos vamos aquí al diploy code with github Ok y aquí nos va a permitir Supongo que si es la primera vez que entra seguramente podría ser que te pida permisos Por qué Porque a lo mejor no tienes permisos por defecto para listar todos los proyectos
Entonces ahora sí fíjate que además de los ordena por cuál es el más reciente y ya no sale el primero Así que le vamos a dar Connect para que conecte esto nos pregunta cuál es la rama Efectivamente es Main que es la que tenemos aquí ves aquí es donde queremos tener el código que vamos a desplegar de forma que cada vez que nosotros hagamos un cómic y Push a esta rama se va a volver a desplegar a producción luego la región bueno Australia nos pilla un poco lejos pero ahora mismo Parece ser que la única
Así que vamos a tener que dar Australia vale Y fíjate que pone at en farminghables y dice have fun.eng aquí pone por defecto Esto me lo ha puesto por defecto esto yo no lo he puesto así que me voy a fiar me voy a fiar Porque si miramos aquí yo no tenía un punto él no no te dan punto O sea que por defecto Me está poniendo el 80 80 veis lo que os decía vosotros no sabéis en principio Cuál va a ser el puerto que vamos a poder utilizar Así que nada Vamos a darle
diplo y llorar aunque tengo dudas porque una cosa que tengo dudas es del Script O sea no me ha preguntado por qué es lo que tiene que ejecutar y todo esto a ver blog Express mira aquí veo que tienen un ejemplo vamos a ver el momento vale hay un Start vale normalmente esto es una cosa que muchas veces no lo comentan pero en los scripts deberíais tener un comando Start y por defecto suelen mirar eso hay veces que es o configurable o que te lo preguntan aquí ni me lo preguntan así que por defecto ya
veis que está haciendo Este vale muy bien le vamos a dar a desplegar y vamos a ver qué hace vale Ya está detectando cositas y está haciendo aquí un Star build la forma en la que funciona es bastante bastante similar a como como era heroku de hecho utiliza Bill pack que es algo parecido a lo que utilizaba eroku vale pues fijaos que tenéis aquí el de plugin este sería pues la rama que ha desplegado y si no me equivoco Este es el último commit que hemos hecho Efe sí es este ves F7 9 este justamente
es el cómic que está desplegando ahora que es lo que tenemos por aquí mira ahora ya está funcionando veis ya ha hecho el diploy me ha puesto un check me ha dicho la URL que la tenemos justamente aquí vale la URL vamos a mirar la URL y a ver qué pasa vale la URL me ha redirigido directamente donde le ha dado la gana o sea que no ha ido muy bien Vamos a ver Blue locks a ver los logs parece que funcionan funcionan pero me parece ahora vale Yo creo que la url ahí esta no
es correcta o que había tardado y todavía no la tenía No mira ya tenemos la Api desplegada cuánto hemos tardado no hemos tardado ni dos minutos no entonces ya Lo tendríamos aquí justamente en producción nuestra Api vale para revisar Pues aquí podríamos ver que ha ido todo bien perfecto podríamos ver los usach metrix esto pues puede tardar un poquito vale enables se puede hacer algo con server left functionsell va rapi Sí pero es que de nuevo es que no es lo mismo podéis hacer server les funcions que al final son funciones en la nube que
es algo más parecido a Edge functions que no tiene nada que ver con tener un servicio Como este o sea son cosas diferentes Pero obviamente Sí si os referís a que podéis desplegar una Api Sí pero desplegar un servicio Como este así no se puede hacer Exactamente igual en en versell para bien y para mal Bueno y tendréis los logs también una cosa interesante es que podéis aquí no tenemos muchos logs pero en el caso de que vuestra aplicación tuviese un log aquí podríais ver logs vale ya sea de de lo que sea así que
muy chulo Mira el usach metrics a veces alguna cosa bueno casi no lo hemos usado pero alguna cosa sí que sale No se ve casi pero aquí ya tendríais por ejemplo veis 20 megas de memoria RAM y el límite 256 lo cual está bastante bien y ya está o sea ahora cada vez que hagamos un cambio por ejemplo cada vez que mira aquí vamos a intentar utilizar Esto vale veis funciona perfectamente lo podríamos meter hacerle un post del put el delete podríamos hacerlo todo y funcionaría correctamente y os dejo este repositorio por aquí vale os
dejo este repositorio para aquí por si tenéis ideas o queréis no sé tenéis dudas de ostras cómo se despliega en producción Bueno pues ya lo sabéis vale os dejo también el enlace de FL 0 creo que era puntocom vale para que no os lo perdáis y así lo tengáis ahí pues ya tenemos la clase 4 vamos a partir de la clase 3 vale Así que hemos hecho la copia y ya tenemos Exactamente lo mismo que teníamos en la clase 3 vamos a revisar un poquito lo teníamos aquí pero qué problemas nos nos vamos encontrando con
nuestra resta ipial que es la que hemos desplegado pues tenemos diferentes problemas primero que fíjate que tenemos aquí todo como juntado tenemos juntado la validaciones el control del input el donde se recuperan los datos y todo este tipo de cosas vale Total que lo tenemos aquí todo mezclado lo que vamos a hacer y en lo que vamos a trabajar ahora es en el hecho de decir ostras vamos a ver si esto lo separamos mejor pero antes de hacer la separación una cosa que te comenté el otro día era el tema de common Yes en no
Yes tenemos dos formas de trabajar con las dependencias vale tenemos como Yes que sería esta que tienes aquí y tendríamos la de Emma screen modules Mira tenemos common Yes vale sistema de módulos de no significa un sistema de módulos Pues es lo que nos permite justamente compartir código para no repetirlo tenemos por un lado common vale lo vamos a poner rojo y tenemos por otro lado Es más este diríamos que es el clásico el clásico es el de toda la vida y este lo que tiene sería el require y el module punto Xbox vale esto
es como funciona este de aquí Este es el clásico es el que hemos utilizado hasta ahora pero hoy vamos a migrar nuestra aplicación hay más cream modules y te preguntaré es por qué lo vamos a hacer porque vamos a hacer Esto bueno por dos cosas vale primero porque es más que modules es el moderno y recomendado recomendado en diferentes cosas uno de que siempre que puedas es el que deberías utilizar porque es el que es parte de la especificación de javascript y también recomendado porque al final es el que se está utilizando en todos sitios
y esto sería import export vale Y esta serían las dos formas de tener sistemas de módulos en hasta ahora hemos visto este de aquí hemos visto este de aquí pues hoy lo que vamos a hacer es pasar de 1 a otro Pero tiene algún reto que es bastante interesante que está muy bien que la prendas para que te suene vale Así que vamos a verlo fíjate tengo lo primero que tenemos que hacer para pasar un proyecto de common Yes a enmascreen modules the Note 10 es ir a nuestro packason y aquí le podemos indicar el
tipo del proyecto por defecto el tipo de proyecto es Este vale Este sería el default commons por eso no hace falta ponerlo para que funcione como common Yes pero si quieres cambiarlo en masking modules y quieres que todos tus ficheros se comporten como en macrimo modos y por lo tanto puedes utilizar los simples y los expos sin necesidad de cambiar extensiones ni nada raro aquí podrías decirlo tipo módulo Vale qué pasa con esto que una vez que hacemos este cambio Si yo ahora intento vamos a la clase 4 vamos a la clase 4 y yo
intento ejecutar mi proyecto Fíjate que ya me empieza a petar y me dice oye require no está definido en el scope de los en maximles puedes utilizar import en su lugar bueno no pasa nada Para eso nos vamos a la punto js y te voy a enseñar el truco del almendruco para que no te pongas como un loco ahí a escribir y los Sims y tal fíjate ves que hay aquí tres puntitos ves ahí tres puntitos no le das aquí y haces Comando punto vale Y ves que te pone aquí convertir en módulo egg más
clip Así que le damos aquí y te voy a explicar una cosa ha ido bien Hasta cierto punto ha ido regulinchis porque ha ido regulinchis porque esto sí que lo ha hecho bien Esto también lo ha hecho bien Esto también lo ha hecho bien este también lo ha hecho bien pero este no lo ha hecho bien la línea 5 la ha hecho mal por qué Porque el import movies él ha creído que como el movies era una Rey también estaba importando del movies punto Jason también está importando los métodos filter y tal o sea lo
ha hecho bastante bien pero tampoco tanto O sea que lo que vamos a hacer para arreglarlo del todo es que vamos a buscar donde ha utilizado filter vale Este filter por ejemplo lo vamos a tener que buscar y vamos a tener que utilizar ponerle justo antes el correcto vale Este find por lo mismo donde se ha utilizado el find Pues el fine resulta que en realidad sí que es de movies porque es un Jason Pero bueno Esto luego luego verás por qué estoy haciendo esto y por qué igualmente esta línea nos va a pero es
muy interesante porque muchas veces mucha gente que pasa hay macri modules se encuentra estos problemas y así lo vas a solucionar vale venga vamos a hacer el find Index un momento aquí le tenemos que poner movies porque es que movies es un Jason vale No no se estaba importando esto como la dependencia y aquí tendríamos el movies y ya nos queda solo el splice vale muy bien Vamos con el splice splice entonces movies punto splash y ya está con esto ya lo tenemos vamos a ver si hasta aquí funciona nos vamos a encontrar algún problema
más así que vamos a ver cuál es el problemita vamos a hacer Note a punto js tenemos algún problema más Y es que nos dice que no puede encontrar el módulo de esquemas movies.js otro cambio muy importante fíjate aquí no tenemos la extensión vale no teníamos la extensión el cambio que tenemos es que cuando utilizamos el sistema de common Yes las extensiones no son obligatorias Por qué Porque Note tiene internamente una cosa que se llama resolver que lo que hace es resolver la extensión e intenta diferentes extensiones y diferentes diferentes salidas qué es lo que
intenta aquí por ejemplo aquí intentaría punto esquemas barra movies barra index.js vale punto esquemas movies.js va intentando diferentes Vale hasta que lo encuentra en este caso con Emma modules No tenéis que hacer Esto vale tenéis que hacer punto js le tenéis que poner la extensión Entonces sabéis qué pasa que el no poner la extensión es una mala práctica que estamos acostumbrados por desgracia tanto por empaquetadores como malas decisiones de type como un montón de cosas y no es parte de la especificación la especificación indica que hay que poner siempre la extensión por desgracia hay cosas
que hacen magia y no nos hemos tenido que preocupar de Esto vale dicho esto hasta aquí bien vale en el archivo de esquemas también como era javascript tenemos que cambiar esto así que lo lo convertimos en un módulo en este caso lo voy a hacer a mano para que no me haga cosas raras importe set from aquí vale Y tenemos que exportar las funciones en lugar de utilizar módulo exports Nos vamos aquí export function export function y ya con esto ya tenemos todo el javascript preparado Pero queda una cosa muy importante vamos a probar vale
a ver si ahora funciona me sigue petando Pero ahora mi Peta por otra cosa Vale me peta por el movies punto Jason dice que necesita una sección de tipos de Jason vale Qué significa esto y esto te lo explico porque esto te va te va a servir para toda la vida para javascript vale el tema es que esto no es válido no puedes importar jasons en enmascript modules así tal cual porque no es tan parte de la especificación por desgracia Entonces qué es lo que pasa pues que necesitamos necesitamos decirle Qué tipo de archivo es
el que estamos importando en este caso en este caso le tenemos que decir Oye ves que la sintaxis no la soporta ahora te explico por qué vale Pero te lo explico porque esto es algo que es bastante experimental que está a punto de llegar no ha llegado del todo pero que es importante que sepas lo que está pensando aquí es que le tenemos que decir anoche Es que este archivo lo tiene que importar Como si fuese del tipo Jason porque si no se equivoca y va a intentar importarlo Como si fuese un javascript entonces si
yo esto Ahora lo intento ejecutar vale nota punto js fíjate que ahora funcionar funciona pero me da un aviso me dice experimental Warning importa asertions no es todavía una que sea estable en el lenguaje de javascript Así que intenta evitar apoyarte de este comportamiento y esta sintaxis porque puede cambiar en el futuro y quieres saber una cosa quieres saber una cosa sorpresa ya ha cambiado o sea este Warning tiene todo el sentido del mundo porque la realidad es que esta sintaxis esta sintaxis no existe por eso que te lo quería avisar porque puedes encontrarte que
está gente utilizando esta sintaxis y tal como ves será experimental y no existe no deberías utilizarla Por qué pasa esto Bueno desde 39 propausal asert vamos a verlo aquí tendríamos los import atributos si esto eran los import asertions vale Fíjate que pone aquí ahora pone with no pone asert Y es que la sintaxis ha cambiado te voy a dar una buena noticia la buena noticia es que no va a cambiar más porque ahora ya está en la fase 3 ya ha iniciado o sea ha avanzado bastante la especificación parece que ahora sí que está bastante
estable y por lo tanto esta Parece ser la sintaxis que va a ser definitiva Así que esta sintaxis era experimental no funciona o sea funciona pero se va a romper eventualmente porque va a dejar de funcionar Luego si ponemos Wiz esta no la soporta a día de hoy por desgracia ves no la soporta y por lo tanto podemos diferentes formas de hacer esto mejor no que sea algo que sepamos que no se va a romper solo así que no lo vamos a hacer así hay dos formas de hacerlo vale una sería utilizando fs como lo
hemos hecho en algunas clases no importar fs from Note fs Bueno fs e importar este archivo de forma podemos read vale barra movies y aquí tendríamos el movies Lo que pasa que esto también además tenemos que pasearlo vale Y ya está esto podríamos hacerlo no lo he hecho muy rápido vale funcionar funciona Fíjate si nos vamos aquí barra movies debería funcionar vale No está mal Qué es lo que hemos hecho lo que hemos hecho es importar el file System de no Yes y lo que hacemos Es leer de forma sincrona el fichero movies punto Jason
le decimos que la codificación stop f8 y esto lo tenemos que transformar parsear a un Jason vale esta sería una forma No está mal pero como puedes uno te obliga a hacer un Jason pass luego tienes que utilizar el fire System read file tienes que hacer ahí como unas cosas no esta podría ser una forma yo te la voy a dejar comentada por si la quieres utilizar porque no está mal vale Cómo leer un Jason en macri modules vale esta sería una vale hay otra que también es engorrosa O sea no voy a decir no
súper bien pero seguramente a día de hoy sería como yo creo la más correcta en el máximo modules vale Cómo leer un Jason en smoodles recomendado por ahora vale por ahora Pues lo que tenéis que hacer es crear un require y esto Esto es bastante interesante muy poca gente lo lo conoce pero el requal que hemos visto hasta ahora en todas las clases Vale cuando estamos estos requals ves Este require fíjate que este require ves que tiene paréntesis eso qué quiere decir si estamos llamándolo entre paréntesis eso qué quiere decir que es una función verdad
Entonces si es una función Qué significa Pues que podemos justamente crear esa función y no Yes tiene una forma en la que podemos crear una función Por qué Porque no podemos utilizar el require aquí esto está prohibido vale pero sí que podemos importar el create require de Note module y podemos crear un require diciéndole vale créame un reward utilizando el import.meta punto urell esto el import como ves es una palabra reservada que tenemos aquí en el macri modus que no solo te permite para importar módulos sino que también tiene información sobre nuestro propio proyecto en
este caso el import.meta punto urell lo que tiene es el la dirección del archivo actual por lo tanto podemos crear un require que le digamos Vale pues quiero traer movies de este reward que he creado que es del archivo actual y tienes que ir a punto barra movies punto Jason y aquí con esto ya le estamos diciendo De dónde se supone que tiene que sacar este archivo del movies punto Jason hemos creado un método requal y lo hemos creado nosotros por qué te enseño esto es súper necesario no sé qué A ver te enseño esto
porque si en alguna vez te estás encontrando la transición de common Yes I'm masking modules te vas a encontrar un montón de estos problemas hay veces que puede ser que necesites crear tu propio para cositas así y a veces puede ser buena idea y en este caso en concreto de utilizar un Jason puede ser buena idea intentar evitar utilizar el fire System y seguir utilizando el cual que de forma nativa ya ya eres capaz de comerse los Jason al menos hasta que tengamos y funcionen perfectamente los Jason a la hora de importarlos vale Así que
esta podría ser otra forma yo la recomiendo porque aquí al final lo que estáis haciendo es utilizar el Jason parks esto sería seguramente una cosa mucho más lenta que no utilizando esto que es la forma nativa que tienen hoy es y ya está compilado estos módulos internos a la hora de pasear la información cualquiera de las dos funciona pero sobre todo para Jason que sean lo suficientemente grande yo os recomiendo que si no lo soporta todavía utilicéis esta y con esto a ver vamos a ver si lo hemos hecho bien veis a ver papá un
dos tres cuatro barra movies vale Y aquí tenemos Exactamente lo mismo OK Así que ahí tenéis las dos formas de hacer y de importar los Jason y con esto ya hemos migrado nuestro pedazo de proyecto hay más creativos vale crees que hagan el import de forma más práctica de la actual en mucho rollo sí lo de hecho ya lo he comentado no el import será así vale el import del futuro va a ser así import Movies From movies Jason with a type Jason vale Esto será así y será una sola línea esto es como va
a ser pronto todavía no ha llegado pero llegará O sea que no os preocupéis lo que pasa es que por ahora pues hay que hacer o leyéndolo así o creando vuestro propio requal que esto lo podéis crear una vez que no hace falta que esto lo estéis creando constantemente quiero decir esto lo podéis tenéis podéis tener aquí una función que sea exports read Jason vale Y que sea así ya está Y entonces cada vez que queráis leer un Jason Reason y lo repetís y punto entendéis o sea esto lo extraéis a un útil por ejemplo
útil O como le quieras llamar beautys no sé qué Y ya no lo veis más lo dejáis aquí exportáis esto papá y ahora lo malo Aquí es que seguramente Ah no estaría bien Rick Jason vale Y ya está no tenéis Por qué saber cómo se ha hecho por dentro el que está en la idea vale está la idea básicamente no que estéis constantemente creando el require con que lo hagáis una vez ya está Vale pues hasta aquí ya tenemos todo el sistema de en macri modules y tal venga vamos con el tema de El vbc
mvc vamos a mejorar un poco nuestras rutas vale Porque fíjate todo lo que tenemos aquí buff esto es un rollo vamos a empezar a ir separando capa por capa y lo primero que vamos a separar antes de entrar a la arquitectura de mvc vamos a separar las rutas para eso creamos a carpeta roots y a mí personalmente aquí cada una que cada persona que haga lo que quiera pero a mí me gusta ponerle el nombre de la ruta hay gente que pone movie roots hay gente yo recomendaría mejor así pero a mí me gusta que
sea el nombre de la ruta y no me gusta repetir constantemente el nombre de la carpeta Estos son es algo subjetivo pero a mí me gusta que si de roots voy a hacer la ruta de movies pues le llamo movies vale Y no lo hago en O sea no lo hago en singular sino que lo hago realmente como en la ruta fíjate que tenemos todas las rutas aquí puestas y tal Qué vamos a hacer vamos a importar router y esto lo vamos a hacer de ahora que tenemos hemos importado router de la dependencia de Express
router es una clase un poquito especial que en lo que nos va a permitir es crearnos un enrutador a partir del cual vamos a poder responder todos los pads Cómo funciona esto Pues imagínate vamos a crear aquí router y hacemos router vale Y en este router podríamos tener Vale cuando en este router vaya a la raíz entonces respondemos con esta función de aquí y aquí le llega Exactamente lo mismo que hemos visto en nuestra aplicación vale Fíjate que nuestra aplicación teníamos la request y la response pues esto mismo lo tenemos Aquí request y response ahora
qué es lo que queremos Que responda cuando estén la raíz de las rutas de movies Pues solo tenemos que mirar aquí fíjate a punto get barra movies pues esto que hemos hecho aquí nos lo vamos a traer aquí dentro vale vamos a mover esto para papá y nos lo ponemos aquí ahora que nos falta Fíjate que nos Faltan algunas cosas el movies este que habíamos hecho el no sé qué no sé cuánto este Rick Jason pues esto lo vamos a tener que mover de sitio Así que nada lo movemos de sitio Vale qué pasa seguramente
aquí ahora Bueno ahora veremos si nos falla porque a lo mejor no lee el fichero tenemos que cambiar la ruta Pero bueno por ahora lo dejamos y esto lo seguimos haciendo con todas las rutas vale vamos a hacer pequeño esto para que no moleste por ahora ves ya tendríamos aquí el get del movies aquí nos faltaría nos faltaría algo así que vamos a poner aquí un tutú solo ponerme se me quede en rojo Vale y seguimos con la siguiente ruta Pero qué pasa con esta ruta esta ruta Fíjate que es barra movies barra dos puntos
ID Bueno pues lo mismo Solo que aquí vamos a hacer barra ID barra dos puntos ID y aquí es donde ponemos esto lo importante es que no ponemos aquí el movies porque luego verás por qué Porque lo que vamos a hacer Es que todas las rutas que sean barra movies van a responder a este router que nosotros estamos creando es como que estamos separando una rama de todo nuestro enrutador en un archivo totalmente separado y lo que nos va a permitir es tener en nuestro archivo app las rutas mucho más fáciles de entender y todo
lo que tenga que ver con barra movies tenerlo totalmente separado y esto Pues nada lo repetimos nos vamos por aquí vale vamos a poner aquí el tudú también y volvemos a hacer router. post barra y aquí no hace falta poner tampoco el barra movies vale no hace falta poner barra movies porque es el que es por debajo Hola hola qué opinas de él y harías un curso conozco quick y de hecho trajimos aquí al creador de quick O sea que imagínate si lo conozco Imagínate si lo conozco haremos un curso más adelante pero ahora mismo
el otro día lo estuve probando y tampoco O sea me gusta pero hay cosillas todavía que creo que hay que hay que afinar un poco no sé y me parece el principio la curva aprendizaje me parece un poco exagerada No sé no me gusta que deje tantos archivos ahí en medio me gusta más el estilo de Netflix Y me sorprendió un poco el como por ahora lo tienen lo tienen hecho no sé pero más adelante seguro que hacemos alguna cosa en quick Bueno me he traído los inpos estos de los esquemas vale porque los vamos
a necesitar también me he importado el Random uid que lo editamos aquí vale Y ya solo nos quedaría vamos a poner el que tú tú tú el Direct Así que nos traemos el delete de hecho una cosa podría hacer es para que veáis la diferencia No aquí en lugar de a pondríamos el router y aquí lo que nos tenemos que asegurar es que quitamos el móvil y ya está se queda exactamente lo mismo y aquí ponemos el tuduo y aquí el Patch Pues lo mismo voy a copiarme todo este Patch Vale y lo extraemos también
en el router Aunque ahora esto es el primer paso Y a partir de aquí luego haremos la arquitectura con mvc vale quitamos esto por aquí vale el Patch y ahora importante ahora que Hemos llegado a este punto que ya lo tenemos todo lo que tenemos que hacer es un export y tenemos que exportar podríamos exportar por defecto el router o podríamos ponerle un nombre podríamos hacer lo que queramos vale De hecho que le hemos creado aquí como router podríamos directamente en realidad podríamos exportar el router este y llamarle movies router vale Y entonces todos los
routers estos que hemos hecho para que quede mucho mejor vale el nombre vamos a hacer esto movie router y ya no hacemos un export de Fall al final y lo hacemos con un ex por nombrado que seguramente quedará mucho mejor vale Y entonces vamos a dejar este como tudu vale tudo vale vamos a quitar los importes que ya no necesitamos y vamos a importar este movie router from router roots movies js ahora tenemos que utilizar este router este enrutado que no vale para utilizar este enrutado lo único que tenemos que hacer es decir bueno dónde
queremos utilizar esto Pues fíjate que aquí teníamos a punto get a punto get a punto post a punto delete Pero esto ya lo tenemos aquí realmente veis que tenemos aquí a mus punto router esto ya lo tenemos aquí Así que lo único que le vamos a decir es Oye lo que quiero es que mi aplicación vamos a hacer app.lus cuando accedo a Barra movies voy a cargar todas las rutas que tengo en movies router vale Así que ahora lo que estamos haciendo es separando totalmente todas las rutas que tienen que ver con barra movies que
este va a ser como el prefijo Y entonces lo que va a hacer la aplicación de expreses Vale cuando yo detecte que en la URL al entrar y hacerla rico es hay un barra movies me voy al movie router Y si dentro del barra movies hacen un get a la barra entonces respondo con todo esto si hacen un barra dos puntos ID entonces hago Esto vale con esto ya hemos hecho estamos como aplanando cómo es nuestra aplicación Y fíjate que ya porque tengo aquí las explicaciones estas de los inpos de los Jason No pero fíjate
que excepto por el cors que esto también lo podríamos separar porque ya podríamos empezar a tener aquí myd Wars vale podríamos poner aquí course punto js y fíjate fíjate que incluso al poner mydelwers mi sistema de directorios detecta y te pone una carpeta especial vale Bueno pues aquí con este cors podríamos hacer esto lo podríamos extraer y este apius podríamos hacer exports vale que esto básicamente fuese que nos devuelva esto importamos course vale para tenerlo solo aquí este cosmiderware tendríamos que importarlo y ejecutarlo y ya Lo tendríamos fíjate ahora esto lo quitamos y ya tenemos
las rutas y los totalmente separados lo que he hecho con el cors lo que he hecho es crear una función que al ejecutarla me devuelva justamente la funcionalidad de Coss Por qué Porque a veces puede ser interesante que aquí le podamos inyectar opciones no Y a partir de las opciones estas que le pasaríamos aquí como por ejemplo los Host y todo esto le podamos cambiar la información que tenemos aquí por ejemplo los accepted origins pues esto puede ser el valor por defecto vale lo podemos mover fuera ahora que lo tenemos totalmente externalizado no que no
está en mitad del fichero así que por valor por defecto tendríamos esto tendríamos que poner aquí que valor por defecto también sea aquí de esto el valor por defecto es una llave vacía un objeto vacío porque si no le pasamos sino esto para tarea petaría y aquí le podríamos pasar el abster origins le podrías pasar lo que tú quieras no lo necesitamos porque ya tenemos el que por defecto funciona bien pero podría ser una una posibilidad vale Este aceptero origins lo utilizamos aquí y ya está O sea ya estaríamos teniendo una forma de configurar corse
desde fuera y esto ya lo tenemos totalmente separado no así que esta sería un poco la idea a la hora de empezar a extraer lo que sería tanto mydelwers como rutas por qué mvc A ver por diferentes razones la primera es que Express es un framework que está muy pensado para utilizarlo con mvc lo segundo es que mbc es un patrón de arquitectura hay mucha discusión si es un patrón de diseño o si es una arquitectura yo la verdad es que me quedo con que está más cerca más cerca de la arquitectura que patrón de
diseño vale Pero es verdad que no es una arquitectura que lo engloba todo porque no te explica Como por ejemplo dentro de la vista tienes que tienes que hacer las cosas ahora os explicaré que se mueblece vale pero mvc es un patrón de arquitectura muy conocido muy utilizado en mucho lenguaje de programación y en muchos frameworks Entonces yo creo que es muy interesante que lo aprendáis por eso por eso lo digo vale Y en bici significa modelo vista controlada diferencia entre patrón y diseño arquitectura un patrón de diseño sería un repetible fácil de hacer para
solucionar una cosa en concreto y un arquitectura vendría a ser ya algo más de toda tu aplicación de cómo arquitecturas toda tu aplicación Vale y un patrón de diseño en realidad sería algo un patrón repetible en una parte de tu código Vale entonces por ejemplo puedes tener patrón observer patrón Factory patrón módulos de hecho aquí podéis ver un patrón de diseño que estamos utilizando aquí es el patrón módulo esto es un patrón pero no es la arquitectura de nuestra aplicación verdad porque aquí tenéis un patrón que estamos utilizando el patrón módulo que es el de
import y export es una forma es un patrón de diseño que se puede repetir constantemente para solucionar el compartir código pero no dirías que es una arquitectura vale la arquitectura es replicable pero es replicable a nivel de toda la aplicación entendéis O sea la arquitectura no se replica dentro de la arquitectura contempla la infraestructura Por supuesto que sí puede contemplar la infraestructura O al menos cómo te comportas con la infraestructura no tanto qué infraestructura utilizas sino cómo te comunicas con ella mvc mvc es un acrónimo de modelo vista controlador y es un patrón de arquitectura
que se utiliza muchísimo ampliamente utilizado en el desarrollo de software especialmente en aplicaciones web y móviles vale también en móviles por qué Porque durante mucho tiempo se ha utilizado en Android mucho Franco ya están preparados para eso pero bueno también te puedes encontrar un montón de frameworks en web que no significa frontend sino en frontend también teníamos por ejemplo Bad Bunny Pero ha habido también pues rubion rails hay un montón de frameworks que se basan en modelo vista controlador porque esta arquitectura de alguna forma te proporciona una estructura que te obliga a separar tu aplicación
en tres componentes interconectados esenciales y que separan las preocupaciones de tu aplicación y son estos tres componentes que le dan nombre a la arquitectura modelo vista y controlador hay un montón a partir de mvc han existido un montón de mutaciones modificaciones mejoras evoluciones como le quieras llamar No pero hoy vamos a intentar basarnos a hablar en el que digamos el más puro o el más parecido al clásico tendríamos Aquí vamos a hacer el modelo y vamos a hacer aquí en modelo verde el modelo representa la lógica del negocio La Estructura de datos las reglas que
tiene el negocio de forma interna no y es que el que se encarga por ejemplo de acceder a la base de datos o de actualizar la información correctamente o de ver si la integridad de los datos es correcta Por ejemplo si vas a crear una ID que esa ID no exista este tipo de cosas vale representa la lógica del negocio Así que importante ahora otra parte importante el controlador que es el que controla es el que actúa como un intermediario entre el modelo y la vista que es el que está respondiendo a las entradas del
usuario cada vez que el usuario pues está utilizando nuestra página web nuestra aplicación o lo que sea estamos está dando enviando entradas y antes de llegar al modelo el controlador es el que se está encargando de responder ver esas entradas tratar esas entradas y ver si tiene que solicitarle al modelo que haga operaciones A qué modelo le tiene que pedir Y qué le tiene que pedir vale el orquestador me gusta el orquestador orquestador y orquestador y trata vamos a poner que trata actúa como intermediario tenemos finalmente la visual la más importante para el usuario Claro
porque el usuario directamente no puede ir ni a la modelo ni a la vista ni al controlador va a la vista y qué es lo que hace en la vista es poder interactuar representar la interfaz que el usuario va a utilizar presentarle los datos Mostrar estos datos enviar desde la vista vamos a poder enviar las acciones que queremos hacer así que esto sería la interfaz del usuario ya ves una estructura en la que se están separando aquí diferentes capas y en las que podemos ver además Cómo interactúan cada una ahora bien estas son como las
tres partes obviamente las tres partes para que funcionen correctamente tienen que interactuar entre ellas de alguna forma el controlador primero debería iniciar la vista es lo primero que se hace lo primero que hace es iniciarla no porque le tenemos que iniciar con los datos Así que primero iniciar cuando la vista claro para iniciar antes lo que tenemos que hacer es que el modelo te dé los datos y todo esto pero pongamos que el controlador ya le ha pedido la información a la de los datos vale el modelo le envía aquí los datos vamos a poner
por aquí Vale entonces lo primero que hacemos Es iniciar luego a partir de esto la vista el usuario pues enviará acciones no lo que dirá es hoy pues quiero hacer alguna actualizar interaccionar lo que sea y al usarlo el controlador lo que dirá es bueno esto ha pasado tal ha hecho lo otro y lo que va a hacer aquí es pedirle ya sea modificar leer modificar lo que sea no O recuperar actualizar y directamente aquí tendríamos no que le está enviando los datos vale enviando los datos Y ya Lo tendríamos esto sería un poco lo
que está haciendo desde la vista no puedes no puedes que no sé por qué hay en algunos sitios que he visto que hace algo así no da pues directamente a la vista esto no está bien Sí que es algo que pasa de forma digamos indirecta vale de forma indirecta podríamos entender que la vista interacciona con el modelo pero no se hace nunca directamente de verdad nunca la vista va a tener acceso directo al modelo a la lógica de negocio siempre va a tener este tipo de conexión Porque siempre pasa por el controlador que va a
ser el que va a cuando la vista hace algún tipo de acción o cuando el modelo se actualiza y le tiene que enviar esa información a la vista vale siempre pasa por el controlador nunca desde la vista desde la interfaz del usuario vamos directamente a tirar contra el modelo eso no va a ocurrir y lo Vais a ver en el código que vamos a hacer con un ejemplo bastante claro ahora para que os hagáis una idea en la vista tendríamos por ejemplo podría ser reac podría ser nexi es directamente la vista aunque con exys es
un poco complicado porque next y este claro como como es un framework normalmente ya tiene lo podrías llegar a hacer pero tendrías que Esforzarte mucho para hacer un modelo vista controlador porque al ser un framework ya tiene algunas decisiones que te complica el hecho de poder hacerlo Exactamente igual pero lo podrías hacer tendríamos yo que sé podrías utilizar Jason al final también podrías el Jason podrías considerarlo como una vista porque es una forma de representar los datos que el controlador ha recuperado del modelo más ejemplos Pues aquí por ejemplo tendríamos Pues mysql que modelo lo
que hace es acceder directamente el modelo está pues preguntándole a un hay una conexión aquí con mysql o también puedes con mongodb o puede haber el modelo se puede conectar en un montón de sitios y lo importante es que el modelo como tiene la lógica de negocio siempre sea igual siempre se comporte igual y eso lo vamos a ver en código y lo vas a entender Ya verás cómo vale puede ser local puede ser lo que tú quieras vale podríamos poner también aquí que sea hongo de B lo que sea de hecho hoy vamos a
ver con mongodb y el local ahora antes de seguir Cuál es la ventaja de esto no porque Para qué sirve esto obviamente la ventaja principal es separar la lógica de negocio el modelo porque la lógica de negocio es lo más importante que vas a tener en tu aplicación a la hora de Cómo se conecta una base de datos todo esto Claro si tú lo tienes eso mezclado en tu código a la hora de ya sea usarlo en otro sitio y tirarlo arreglarlo lo que sea va a ser bastante complicado Así que es importante preparar tanto
la interfaz y el controlador del la lógica de negocio luego también esto te ayuda a la administración la escalabilidad y las pruebas también lo veremos no sé si hoy no dará tiempo pero seguramente la semana que viene haremos testing y vamos a ver cómo nos ayuda Esto vale Y obviamente al no tener esto medio Fíjate que la vista todo el día de mañana puedes cambiaría Puedes cambiar Y en lugar de utilizar react ahora utilizas View y no has tenido que tocar ninguna de estas dos partes Vale has cambiado View por react y todo esto lo
sigue reutilizando Exactamente igual esta justamente es una de las grandes una de las grandes glorias el hecho de que puedes hacer cambios en el modelo que no afectan a la vista en el controlador que no afecta el modelo a la vista que cambian la vista y no afecta al modelo vale o sea que es súper importante y en el contexto del desarrollo web como te digo framewords y tal yango asp.net que también asp.net mvc y muchos otros adoptan justamente por la facilidad que te da de tener una separación de conceptos que hay gente que te
dirá que no es la mejor Pero al menos es una separación de concepto y para el código vamos a crear primero ya nuestras carpetas vamos a crear por un lado nuestra carpeta y más adelante porque esto es lo típico no lo de las carpetas que vamos a tener controles vamos a tener models y vamos a tener views Pero más adelante en una clase más adelante Te voy a enseñar lo que es screaming arquitecture y lo haremos justamente con este proyecto para que veas cómo se le puede dar un poco la vuelta a la estructura de
carpetas que estamos haciendo Y la que seguramente es la mejor estructura de carpetas recomendada por grandes arquitectos del mundo del Software pero por ahora vamos a hacer esta vale vamos a empezar con los modelos vale vamos a hacer los modelos un poco especiales para que veas también la gracia de los modelos Así que vamos a poner los modelos vamos a poner movie movie.js lo decimos ahora en singular vale porque el modelo es de movie y lo que vamos a hacer aquí es separar la información que tenemos aquí en roots vale Fíjate que cuando vamos aquí
en roots aquí tenemos que si hay un género la recupera todas que no sé qué claro esto es un poco es un poco rollo no porque aquí está la información de cómo cómo se filtra se filtran los datos Y de dónde de dónde se recuperan no está aquí en medio esto lo podemos mejorar vamos a crear aquí una clase que vamos a exportar le vamos a llamar muy model y vamos a tener diferentes métodos estáticos vamos a tener método estático que sea get all para recuperar todas las películas y que se le puedan pasar filtros
pues se puede pasar aquí el género voy a hacer una cosa me la muy bien que tengo que copiar Gracias por ahora hay que hacer esto no que sería lo mismo que tenemos aquí Fíjate lo mismo Tenemos aquí me lo ha copiado básicamente aquí me lo ha adaptado un poquito de dónde sacamos las movies Bueno Este modelo por ahora vamos a seguir haciendo que sea como como esto no que lo esté sacando del jaso que teníamos por aquí Así que hacemos el read Jason lo traemos de a sutiles esto ahora lo vamos a tener que
sacar de Punto a Punto barra beautys y esto punto punto barramudius.json Ah no sé si esto funcionará Pero bueno lo probaremos a ver si esto igual este import no le gusta o si le gusta Ah lo veremos el tema este movies tiene el Jason y aquí le decimos cómo tiene que recuperarlos todos Ahora en lugar de tener que hacer esto que hemos hecho aquí vale por ahora voy a dejar este movies aquí pero voy a ir quitando los que no necesitamos por ejemplo esto no esto Ahora no vamos a hacer aquí al Rest Jason y
todo esto sino que simplemente lo que vamos a hacer es decir vale vamos a traernos El Movie model y vamos a recuperarlos todos vale Y esto lo que me debería devolver son las películas pero yo no sé Yo no sé cómo lo hace yo simplemente sé que me las devuelve Fíjate que aunque parece una tontería el hecho de tú en este en esta parte ya no sabes cómo se filtra Cuál es la lógica que se utiliza para filtrar y además esa lógica de filtrar obviamente no va a ser la misma en este modelo que es
de la película en local con el Jason como la de mongodb va a ser totalmente distinta pero esa lógica la tenemos aquí y ya no nos tenemos que preocupar de realmente cómo se tiene que hacer Imagínate que tenemos aquí peiches obset que tenemos un montón más de filtros esta lógica en lugar de tenerla dentro de esta función y este callback lo que estamos haciendo es extraerla a nuestro modelo para que sea el que se encargue de saber cómo se tienen que tratar estos datos a esto se le llama lógica de negocio porque es esta lógica
que es lo que está haciendo especial tu función o tu función tu aplicación tu negocio de que sabes cómo se tienen que filtrar las cosas como se tienen que ordenar Cómo se pagina no es lo mismo como se Fil los tweets de Twitter a como se pueden filtrar los posts de Instagram puede ser que muchas veces parece que puede ser similar Pero no es lo mismo hay muchas reglas de negocio ahí que a lo mejor un usuario eso puede filtrar 20 post que puede filtrar de diferentes géneros que puede filtrar diferentes formas y ese tipo
de cosas tienen que estar totalmente separadas de donde se está haciendo esto vale Así que cuando hablamos muchas veces de arquitectura y tal estamos hablando de esto tiene que ser forzosamente la clase no no tiene que ser forzosamente una clase de hecho también podríamos hacer exports No sé qué Pero por qué va a ser una clase o lo voy a comentar porque es interesante no vamos a hacer que sea una clase porque está es interesante el hecho de que tenga un contrato podríamos tener un contrato también Obviamente con módulos exportar aquí un get old y
no sé qué pero la clase más adelante Cuando esto lo pasemos a typescript nos va a ayudar al hecho de poder tipar perfectamente cómo tienen que ser nuestros modelos para que sean intercambiables Y eso lo entenderás un poquito más adelante Ahora cuando continuemos vale por ahora ya tenemos aquí el guetol Pero antes de esto antes de esto vamos a hacer un cambio sutil pero importante para el día de mañana para lo que haremos más adelante porque fíjate que este método estático es síncrono y el hecho de que sea sincrono está mal por qué lo vamos
a hacer a síncrono vale el hecho de hacerlo simple o no es que entonces sabemos es como que sabemos que el modelo por dentro va a tratar siempre con datos sincronos no Y esto está mal porque realmente No deberíamos saber cómo trabaja el modelo desde desde fuera o sea desde desde este punto No deberíamos saber que el guetol va a darme los datos de forma sincronos vale Así que vamos a ponerle aquí una White y vamos a pasar esto como una SIM Kawaii y lo que podemos hacer aquí es que esto también sea un asinc
vale Así que lo pasamos a y así directamente qué es lo que nos vamos a asegurar que siempre que creamos modelos de nuestras películas y tal lo que podemos hacer es que siempre tengan exactamente el mismo contrato Que todos tengan que devolver una promesa Aunque independientemente de que nosotros sepamos que la implementación es síncrona Pero eso no importa porque al final lo importante es que el día de mañana sea asíncrono o asíncrono va a ser compatible con todas las soluciones por eso es súper importante el hecho de pensar en algo que sirva para todo y
no para lo específico que tenemos ahora Ok entonces ahora ya podríamos ir static a sync get ID Por cierto que he hecho aquí con el igual pero no es obligatorio o sea Podrías poner en la SIM que aquí delante get by ID vale esto lo podrías hacer así también Bueno lo voy a dejar sin sin el Arrow function porque no es obligatorio y porque tampoco necesitamos que sea Arrow function y así quedará un poco más claro y poquito menos de código entonces aquí pues nada movie fine Y si tenemos película La devolvemos que aquí de
si no devolvería no sé podríamos mirar aquí el geta ID vale si tiene película entonces Jason movie Vale pues devolvemos directamente la película estática sync el create aquí le pasaríamos el input no sé si en realidad el input Debería ser así vale Lo que pasa es que no sabemos que tener el input y aquí Viene un tema de debate e importante pero yo te lo voy a explicar después el tema de las validaciones vale el create lo tenemos aquí vale Y ves Fíjate que lo que hace aquí en este post vale fíjate que tenemos aquí
la validación del rico es punto Body y aquí si el resultado no ha estado bien hace esto y finalmente es aquí donde se está haciendo lo de la base de datos digamos no pues esto mismo sería la parte que vamos a hacer directamente en nuestro modelo o sea lo vamos a hacer aquí solo que este Random whd sí que es una parte del modelo que la idea Pues hay veces que la maneja la base de datos o hay veces que la manejamos nosotros que la creamos en este caso necesitamos crearla pues tiene sentido que la
creemos no pasa nada es lógica de negocio y justamente en esta lógica nos está diciendo que es que es él el que se encarga de crearla Pero lo importante es que esté aquí porque es quien sabe cómo se crea la idea y todo esto no tenemos que tener fuera Vale y este y resoldito simplemente va a ser el input este input ya Lo tendríamos aquí y así es como actualizaríamos nuestra base de datos ahora mismo luego tendremos otra base de datos un poquito más en condiciones y la haremos de otra forma y finalmente devolvemos el
new movie que esto entonces para ir migrando vale para que vayamos migrando por ejemplo aquí tendríamos movie await movie model punto get by ID entonces todo esto esto ya lo podemos quitar de aquí y esto lo tengo que pasar a sin Kawaii vale ya tenemos este lo tenemos hecho este lo acabo de hacer ahora vamos con el post el post que tendríamos todo esto en base de datos ahora esto ya lo podríamos hacer a wait model punto create con el resulte Data y esto sería el new movie Vale entonces ya nos no sabemos cómo lo
hace pero lo hace vale esto ya lo tenemos Ahora nos faltaría el delete no que tenemos aquí el movie Index no sé qué no sé cuánto Bueno pues lo mismo vamos con el static asínk delete le pasamos la idea vale una cosa importante que a lo mejor estás diciendo esto no sé qué no sé cuánto Mira una cosa importante es que fíjate que los parámetros estoy utilizando siempre objetos vale estoy utilizando siempre objetos porque el día de mañana si tú le pasas delete ID sería como más difícil de extender Y entonces tendrías que ponerle aquí
no sé qué no sé cuánto si le pasa directamente objetos será mucho más fácil descender el día de mañana si por lo que sea tienes que pasarle otra cosa aquí retum count o yo que sé lo que sea bueno aquí no tiene mucho sentido Pero si tuvieses que ponerle una opción Solo que sea y mucho más fácil además te obliga directamente el hecho de que cuando si dices el delete sepas y sea más fácil de descubrir que eso es una idea con tabski no es tanto problema pero con javascript es bastante más recomendado vale que
sí que lo utilices vale el moving Index Esto sí que lo necesitamos luego aquí vale si esto si esto es tal pues pasamos hacemos un false y si no pues aquí vamos a hacer el splice para modificar la base de datos de películas quitando esta película y ya podemos hacer devolver el true y ahora nos faltaría ya el update update que le pasamos la ID y el input Ah mira por eso ves por eso es interesante por eso es interesante pasar el input así así que en el post le vamos a pasar el input que
creo Creo que tiene sentido Ves Es que yo me he traicionado porque digo hay que utilizar objetos y en el de antes no lo he utilizado Claro porque tiene sentido porque así le puedes pasar el ID y el input a la vez y ya está Y así todos te quedan Exactamente igual vale me voy a fiar más o menos de lo que ha hecho hija porque entiendo que me lo está copiando del de al lado movie Index vale lo está actualizando y todo esto así cupdate vale perfecto movies Entonces vamos a actualizar aquí el create
Ya lo tenemos arreglado el delete este delete que ha hecho todo esto vamos a hacer aquí no muy Index no movie model punto delete por ID awake y aquí podemos tener el resolve vale tenemos que hacer esto que sea a SIM Kawaii y aquí si el resultado si el resultado es false vale esto lo podríamos mejorar que el resultado te volviese un objeto Y tal Pero tampoco lo quiero empezar a liar muy a saco vale Así que vamos a dejarlo un poquito así Si es false que nos encontró la película porque no la puedo borrar
y finalmente aquí en el Patch Pues un poco lo mismo aquí Toda esta parte que tenemos por aquí Toda esta parte vale tendríamos la updated movie de a wade movie model punto update se le pasa la ID input del y esto lo tenemos que pasar a sin Kawaii Vale y a the movie es lo que devolvemos vale ya hemos separado toda la parte que sería del modelo la hemos separado directamente de todas las rutas vale fíjate que ahora ya no necesitamos esto tampoco necesitamos esto tampoco necesitamos esto ya hemos simplificado todo lo que sería la
parte de el modelo todo lo que es el movie Fíjate que aquí no tenemos nada o sea hacemos una web movie model que cómo se tiene que crear le pasamos el input y este movie Porque es importante porque es interesante esto porque lo que estamos haciendo aquí es que esto ahora es son como tres cajas negras cada una hace una cosa pero que cada una de ellas no sabe cómo la hace esa Esa es la clave del mundo de la arquitectura y el código limpio cuando hablamos de separación por capa separación de conceptos Olvídate de
las implementaciones Olvídate de todo esto lo importante realmente porque hay muchas veces que nos volvemos locos como es que Clean code es que Clean arquitectura es que no sé qué lo importante realmente es que las capas no tienen que saber la implementación por dentro por eso es súper importante vale no tener en ningún sitio el hecho de decir ostras es que aquí sabe cómo tienes si está haciendo sincrono si está utilizando una base de datos si está utilizando es que no tienes por qué saberlo y eso lo importante porque ahora Este modelo podría cambiar totalmente
y ya no tendrías ningún tipo de problema lo podrías cambiar no deberías tener ningún problema si esto lo pasas a la base de datos o lo que sea ahora que ya tenemos todo esto y ya lo tenemos más un omigrado una cosa que deberíamos hacer para asegurarnos que esto realmente robusto como ahora Estamos empezando a utilizar a synka wade deberíamos esto todo lo deberíamos podríamos llevarlo a diferentes puntos pero una cosa que deberíamos hacer es volverlo todo en un try Catch Y si tenemos algún error además un error inesperado porque lo mejor que podríamos hacer
aquí es manejar los errores de forma mucho más interesante por ejemplo el Modelo Si quisiéramos en lugar de que siempre responda con errores de los que hay que hacer un Catch lo mejor que se podría hacer es utilizar algún tipo de sistema en el que devolviese por un lado el error y por otro lado el resultado y así asegurarte que puedes tener un try Cat más a nivel de que tu aplicación está apretando por algo muy gordo que es un error del servidor y por otro lado tener aquí por ejemplo un resolve en el que
al final en el resol si el resolve es Access Vale pues puedas tener el Jason movies y por otro lado puedas manejar el error de una forma mucho más granular vale lo vamos a hacer por ahora sí porque no da tiempo pero básicamente para que te hagas a la idea Esto del try Catch estaría interesante porque al final lo que estamos haciendo es decir ostras es que tenemos un problema de que todas las todos son así Kawaii obviamente hacer un try Catch constantemente en todos los en points es un poco rollo Así que lo que
haremos también en lugar de hacer esto para que sea mucho más ágil lo que haremos es manejar este try Catch directamente en un mailware eso lo haremos más adelante porque ahora vamos a seguir con el vc pero esa es la razón por la que podemos no hacer el try Catch lo hacemos en el maidelwer Y al menos Ahí sí que tenemos la capacidad de decir Bueno vamos a evitar que el proceso y ya está pero es súper importante nos acordemos que los asienca web si hay una singate necesitamos también manejar los errores vale que no
se nos olvide porque si no lo que hacemos Es que nos la aplicación Sin Control Y eso es lo peor que no puede pasar vale centralizaremos el manejo de excepciones en un sitio y ya lo tendremos ahora que ya tenemos los modelos podemos continuar con los controladores un tema de las validaciones como ves las validación la estoy dejando aquí hay dos tipos de validaciones vale o sea os voy a contar un poco Bueno voy a hacer primero el código y luego os comento lo de las validaciones lo tenemos que hacer aquí en los controles Pues
nada vamos a crear un poco lo mismo vamos a crear aquí controles vamos a poner movies punto js a mí la verdad que la clase a mí me gusta bastante me gusta bastante porque te obliga de alguna forma a tener como la seguridad de que el contrato y tal yo voy a continuar haciendo con la clase Ahora qué es lo que se le llega aquí aquí no vamos a tener por ejemplo el Jane aquí el controlador lo que estamos entendiendo por controlador en cada uno O sea qué ha pasado aquí ahora lo que estamos entendiendo
por controlador en cada uno es en realidad esta parte de aquí esta parte de aquí es la que vamos a sacar vale esta parte request no sé qué no sé cuánto esto de aquí es lo que realmente vamos a sacar aquí Así que ahora podemos tener por un lado que el móvil controller cuando quiero recuperarlos todos recuperar a request y la response es lo que tenemos allí en medio y es el que decide además qué es lo que renderiza que en este caso en la vista podríamos tener un Jason pero también podríamos estar devolviendo un
html al que le estuviésemos inyectando los datos y cualquier cosa que también lo Seguiremos haciendo más adelante y el movie model pues ya sabemos De dónde podemos sacar lo más interesante que tenemos en este punto es que este movie model y lo vas a ver después solo cambiando una línea de código puedes hacer que toda tu aplicación cambie entre tirar de local o una base de datos vale Y eso lo vas a ver después y te va a llamar un montón la atención vamos a ir sacando esto rápidamente vale Tenemos aquí a sync Y fíjate
que ahora en lugar de utilizar esto lo que vamos a hacer es que el movie router no va a tener la información de cómo hace el control sino que simplemente aquí le decimos movie controller punto getton vale sino que ya directamente tenemos el controlador de las películas y es lo que vas a llamar aquí que el día de mañana Sólo queremos tocar el controlador pues tenemos que ir aquí y ya sabemos cómo tiene que funcionar y esto lo tenemos que hacer con todos Exactamente igual No tendríamos aquí con Kawaii vale esto lo sacamos de aquí
esto lo movemos aquí y aquí pues igual movie controller punto get fíjate ahora ya Cómo está quedando Esto está quedando como para lamerlo no un poquito O sea ya no tiene nada que ver con lo que con lo que era antes vale esto por aquí el valle de movie las validaciones esto te lo explica ahora lo de las validaciones Por qué las dejamos estas validaciones aquí y qué tipo de validación es más o menos irían cada una vale esto ya ponemos por aquí movie controller punto create vale Ya quitamos Aquí esta validación de aquí tendríamos
el delete Así que igual en este caso yo les estoy llamando igual no es obligatorio que el controlador y el modelo tengan métodos que se llamen Exactamente igual De hecho no tiene por qué en este caso yo lo estoy haciendo porque visualmente para nosotros nos va a ayudar un montón a la hora de asociarlos pero no tiene nada que ver o sea el modelo puede tener nombres totalmente diferentes de hecho será lo más normal porque en el muchas veces desde el controlador puedes llamar a más de un modelo por ejemplo a lo mejor cada vez
que insertas una película Pues resulta que a la vez que insertas la película también insertas un director y cada vez que insertas una película Pues hay que incrementar un contador en otro sitio que no sé qué no sé cuánto puede ser que utilices o que tengas un modelo que es el que lo agrupa todo y el que sabe esa lógica que normalmente sería lo más correcto o que desde el controlador sea el que orquesta y el que se hace estas conexiones también lo podría hacer normalmente Debería ser los modelos que supiese donde tiene que llamar
vale si es falso no sé qué delete bueno pues aquí tenemos esto movie controller y ya sólo nos quedaría el de Patch vale el de actualizar Así que esto lo movemos por aquí static así bueno cada vez me estoy estoy mira aquí estoy poniendo vale validay movie no sé qué vale aquí el validay movie este está mal esto Debería ser parcial movie no sé por qué no me la copia bien vale y hasta aquí esto ya Lo tendríamos Así que movie controller punto update vale muy bien Pues mira Fíjate que además ahora lo podemos dejar
así para que quede mucho más bonito y esto además lo podemos quitar y ya tendríamos esto tendríamos por un lado el controlador tendríamos por otro lado las rutas y fíjate que ahora todos los conceptos se están quedando totalmente separados o sea ahora ya tenemos cuando vamos a nuestro a nuestra app Pues aquí tenemos justo lo necesario de la app ahora en la enrutado de las películas tenemos el enrutado de las películas el hecho de cómo se controlan estas rutas no lo sabe no lo sabemos aquí sino que simplemente es el controlador el que sabe cómo
tiene que controlar las películas y aquí es que sabe a qué modelo Tiene que llamar y entonces en el modelo es que sabe cómo recuperar las películas Vale entonces fíjate como hemos separado en diferentes capas la información cómo se tiene moviendo y lo puedes ver un poco con lo que hemos hecho aquí no obviamente en la vista No hemos hecho en la página web que eso lo podemos hacer después vale como el controlador pues le pasa la vista que puede ser el Jason la vista directamente que muchas veces creemos que solo pues una aplicación de
no puede ser Jason puede haber xml puede ser un montón de cosas luego cuando usamos el controlador el controlador es el que se encarga de ir al modelo y el modelo es el que envía los datos vale esto es el punto cero y el 4 vale pero la vista del modelo nunca directamente van a llevarlo Así que lo que hemos hecho ahora es separar esto validaciones dónde van las validaciones dónde van las validaciones porque hay gente que a lo mejor ve esto y dice la validaciones son algo del modelo deberían las validaciones está en el
modelo y es que tiene razón y no tiene razón o sea validaciones hay en todas las capas vale o sea hay que validar los datos aquí aquí y aquí solo que la validaciones que se van a hacer en cada una son diferentes son de diferentes niveles vale por ejemplo la validaciones del input del usuario se pueden realizar en diferentes lugares en los tres de hecho pero obviamente el nivel de variación de cada una va a ser diferente en el controlador Normalmente se centran de formato y de coherencia que tengan los datos que hemos recibido que
se puedan procesar para antes de enviarlo al modelo justamente el input del usuario que es el que llega de la vista es buena idea que lo validemos en el controlador antes de enviarlo al modelo o sea mapearlos y tal comprobarse un campo requerido que esté presente que la cadena tenga un formato un correo electrónico que el número esté dentro de un Rango o sea esto lo que hace es que haya más validaciones que ya te previenen que haya procesamientos de entrada en el modelo que son incorrectos o maliciosos y así antes de llegar a la
lógica de negocio ya tienen sentido luego obviamente la vista tiene que tener pues las típicas de interfaz del usuario son la más inútiles en cuanto a lógica de negocio Pero son las más necesarias para la experiencia el usuario lo que quiere decir esto es que las que son obligatorias obligatorias seguro son estas validaciones y las validaciones que hacemos aquí son interesantes para mejorar la ux vale la experiencia del usuario si un campo requerido es mejor que se lo indiquemos al usuario en la vista antes de hacer todo tipo de que vaya al controlador que que
no sé no sé cuánto vale para evitar justamente que el usuario tenga que esperar tanto pero la requeridas obligatorias están aquí porque tenemos que asegurarnos que los datos que están intentando meter el usuario No son maliciosos no son incorrectos que no están rompiendo lógica de negocio y todo esto así que súper importante que tengas en cuenta esto ahora en el Modelo Si hacen validaciones el modelo también se hacen validaciones en el modelo normalmente la validaciones que se hace en el modelo son validaciones más de regla de negocio coherencia de datos relacionados sobre todo con la
persistencia de estos datos en la base de datos O sea si la base de datos el campo es entel Es imposible que lo intentes meter una cadena de texto y por lo tanto ya tienes una validación en ese punto Pero hay otras por ejemplo intentas guardar un usuario sabes el controlador te pasa un usuario que tiene una idea y resulta que esa idea en la base de datos ya existe esa validación de verificar que ese usuario no exista solo la puedes hacer o solo la podrías hacer en el modelo o si alguien intenta registrar un
email que ya existe garantizar la integridad y la coherencia de los datos es del modelo y son validaciones Que obviamente hay que hacer en el modelo no tiene no podrías hacer en el controlador por ejemplo una validación de integridad de datos Porque no sabes en el modelo sí que podríamos llegar a discutir y comentar si tendría sentido que el modelo te exportase un método que pudieses llamar desde el controlador para validar datos por ejemplo para decirle Oye existe esta idea y entonces que el controlador sea el que lo verifica pero esa implementación no la vas
a poder tener dentro del controlador va a estar dentro del modelo la puede llamar del controlador Pero va a estar en el modelo dicho esto he preparado un pequeño ejemplo lo primero que voy a hacer es Ver que esto funciona Porque igual todo esto que hemos hecho está muy bien súper interesante Y tal Pero no funciona así que vamos a ver vamos a recuperar todas las películas vale parece que recuperar las películas funciona después de todo lo que hemos hecho recuperar una idea una película por idea también funciona recuperar todas las películas por un género
vale esto sigue funcionando vale también luego crear una película vamos a ver si crear una película funciona vale también ha creado la película vamos a ver si le falta el delete no vale vamos a poner aquí borrar una película delete http localhost 234 barra movies barra vamos a utilizar la película esta que parece ser que existe vale vamos a ver si la podemos borrar vale movie The Lite O sea que sigue funcionando y luego actualizar una película no Y entonces hacemos esto y vale no existe la película porque acabo de borrar bien por mí que
es la que borra vamos a actualizar esta película con esta idea Ok y nos vamos por aquí vamos por aquí hacemos cambiamos esta idea y vamos a ver si le podemos actualizar Vale pues efectivamente se ha actualizado con año 2022 o sea todo lo que hemos hecho pues lo tengo funcionando perfectamente voy a subirte esto pero ahora voy a hacer otra cosa para que entiendas Hasta qué punto llega esto de modelo vista controlador Así que vale quitamos todo esto hacemos a clashboard para que tengáis los cambios que muchas veces me echáis bronca con razón de
que no he subido los cambios vale lo interesante de los modelos Es que fíjate que tenemos Este modelo aquí con este con todo esto si yo pusiéramos aquí que tengo modelos y pongo local o local file System vamos a poner movie.js vale podríamos tener aquí este podríamos tener aquí el local Five System que este es el que hemos utilizado y podríamos tener el modelo este también podríamos ponerle por ejemplo vale Y podemos poner aquí movie.js esto Ahora lo voy a hacer así pero te voy a explicar cómo podríamos inyectarle realmente esto pero bueno por ahora
vamos a hacer así y luego lo vamos comentando a ver Imagínate que este en este caso Fíjate que esto está tirando de un Jason está tirando de un archivo que tenemos Bueno no sé si conoces un servicio se llama Atlas mongodb Atlas hoy no te voy a poder explicar la base de datos de hongo debe de cero pero mongodb es una base de datos no sql no relacional que está basado en documentos en colecciones y que muy interesante está muy chula y mongodlas además te permite tener tu base de datos totalmente gratuita os podéis podéis
registraros la vuestra si queréis saber más de mongodb que lo vamos a ver más adelante pero si queréis saber más de mongodb puedes buscar YouTube mongodb vale Y ves yo tengo ahí un montón de cursos de mongodb que te explico y tal más adelante veremos mongodb y mysql o sea vamos a verlo todo y justamente la clave de tener los módulos los modelos separados es que vamos a poder hacer cosas como esta de cambiar entre uno y otro súper fácil vale Lo importante ahora no es tan importante la base de datos sino que solo que
sepas lo que vamos a utilizar y todo esto le podrías dar aquí al Connect y en el Connect aquí en drivers tendrías la información que tienes que utilizar de qué tienes que instalar para utilizarlo y todo esto vale Yo voy a instalar voy a asegurarme que tenemos en la clase 4 voy a instalar la dependencia de mongodb vale vamos a instalar la dependencia de mongodb lo haremos otro día y lo haremos nativo y luego utilizaremos Mongoose o sea Mongoose es un RM que te facilita mucho pero es interesante primero verlo de forma nativa y todo
esto Ok entonces qué es lo que vamos a hacer hacemos un envíemystol de mongodb que es el Driver nativo para conectarnos a la base de datos de mongodb vale aquí nos dan toda la información de hecho aquí tienes todo el código de cómo te tienes que conectar vale pero ahora mismo digo que no te quiero enseñar tanto Cómo conectarte y tal lo que te quiero enseñar lo que realmente te quiero enseñar es como con todo lo que hemos hecho con todo lo que hemos hecho podríamos tener otro modelo de la película que se llama movie
model vale que se va a conectar a la versión de en este caso de mongodb vale tendríamos aquí la conexión de mongodb todo esto movimos pero fíjate que lo importante es que tenemos aquí el get old que devuelve una promesa y no es importante ahora que cómo lo hace qué es lo que hace todo esto no es importante vale Lo importante es que esto es una caja negra no y que fíjate que aquí se conecta la base de datos recupera esta información de la base de datos que hace un montón de cosas base de datos
base de datos borra en la base de datos con todo la base de datos vale lo hacen una base de datos y que solo solo teniendo un modelo que uno se conecta a un archivo físico y otro se conectan a base de datos dos archivos que tienen el mismo contrato el mismo contrato y esto es clave sólo con esto Solo cambiando un fichero un fichero en este movie en lugar de tirar de modest movie models Data base movie.js solo con un cambio solo con un fichero una línea que esto la idea y ya lo veremos
más adelante no es cambiar el import la idea de esto es inyectarle el modelo lo veremos más adelante porque te voy a hablar de más arquitectura y más de patrones de diseño pero por ahora solo quiero que veas la potencia de esto no entonces cambiamos el import vale podemos actualizar aquí Esto vale Note no puede encontrar el esquemas movies Ah porque esto ostia no sé porque esto es verdad que aquí no teníamos js que ha pasado ahí y eso funcionaba antes Bueno localhost un dos tres cuatro barra movies vale Fíjate lo que ha ocurrido es
que está pasando Todo hemos cambiado una línea de código no he cambiado nada más o sea has visto que yo me he copiado Esto vale lo haré esto lo vamos a hacer desde cero pero de nuevo no es importante eso es lo que te quiero decir es teníamos este que este es el que hemos creado aquí juntos vale he copiado un modelo que se llama movie model que tiene el mismo contrato pero que Obviamente el modelo hace cosas diferentes de cómo crea las películas como la borra y todo y el tema es que con esto
con todo lo que hemos hecho Y esta es la clave de la arquitectura que por qué es importante arquitectura por qué vale la pena aprender patrón de diseño y todo esto pues es el hecho de que de forma totalmente transparente ahora Estamos conectados a una base de datos bueno igual hay alguna cosa que no he hecho bien Ah vale vale Ya sé qué ha pasado es que la acidez claro la acidez No las he hecho Exactamente igual vale vale claro cuando tengo las movies tengo que la no existe no son las mismas Y es que
el formato tampoco es el mismo que esto es una cosa que no me ha dado tiempo de hacer oyentes ids y tal Y esto sería importante que todos tengan el mismo tipo de idea pero bueno recuperar una nueva película vale aquí ves recuperar la película El género de acción vale recupera películas que tienen acción crear una nueva película pues crea la película vale aquí Lo tendríamos con la ID también tendríamos borrar la película Pues nada le cambiamos aquí la idea borramos la película película borrada o sea Exactamente lo mismo Vale y actualizar una película vamos
a actualizar una película por ejemplo The Good Father vale actualizamos una película Send request y actualizamos la película vale Lo que pasa es que esto me está devolviendo el documento antiguo esto es porque es normal en moco debe te devuelve el documento antiguo tendría que pasarle un flag diciéndole que me devuelva el nuevo Pero bueno no pasa nada el tema que lo he actualizado el tema de esto es que esta es la importancia de cuando hablamos de Por qué es importante arquitectura Porque son importantes patrones de diseño es el tema de que lo que estamos
consiguiendo es que nuestra aplicación ahora sea más escalable y mantenible que antes si yo hoy por lo que sea en lugar de mongodb por lo que sea queremos cambiar a revivis Solo tengo que tocar un archivo de todo nuestro proyecto Solo tengo que tocar solo tengo que crear el archivo del modelo de la película para redes y por otro lado Solo tengo que cambiar un import vale un import Ya está no tengas no tienes que tocar nada del controlador porque para el controlador ya sabe cómo tiene que recuperar y Llamar a los modelos Lo importante
es que nuestro modelos tengan exactamente el mismo contrato vale Y eso es justamente la clave de Por qué en empresas de producto en servicios y tal es importante aplicar arquitecturas porque no es lo mismo cuando tú tienes un proyecto muy interesante seguro tuyo propio a mí me pasa que yo no utilizo arquitecturas ni en broma para mis proyectos que sé que van a ser fungibles que van a durar dos meses tres meses seis meses un año y hay gente que me lo dice Pero por qué no utilizas arquitecturas agonal y tal porque no tiene sentido
no tiene sentido siempre utilizar arquitectura si Gigi Hub va a hacer una landing page para un producto que va a durar 6 meses para anunciarlo no vale la pena de arquitectura pero la arquitectura es importante aprenderla y entenderla porque para ser ingeniero de software y no de carrera no hablo de carreras hablo de mentalidad que para ser ingeniero de software tenemos que crear productos que sean escalables mantenibles Y por supuesto que funcionen Así que también haremos testing la semana que viene vale Así que esto ha sido todo por hoy amigos Espero y deseo que hayáis
aprendido model View controller que hayáis visto que hayáis visto Qué importancia puede tener en un proyecto real la semana que viene vamos a hacer test vamos a hacer test porque Vais a ver cómo vamos a inyectar dependencia vamos a hacer más patrones de diseño un poquito más de arquitectura y testing porque el testing amigos es súper importante y no se os puede caer la cara de vergüenza que vayáis a una prueba técnica y digáis que no sabes hacer test vale Así que bueno pues espero amigos que os haya gustado la clase que hayáis aprendido algo
nuevo que os ha valido apenas sé que era contenido avanzado que sé que muchas veces es que decir que no sé que no sé cuánto pues Oye Estos son contenido más avanzado Pero creo que es el que marca la diferencia creo que lo puede entender cualquier persona creo que es contenido que una persona que sea Junior puede llegar a entender puede empezar a dominar y que necesita y que a ver no es curso desde cero no es como esto es de cero como tus primeros pasos en tal pero es que estas son las cosas que
dan de comer Así que amigos chao