1 00:00:00,820 --> 00:00:02,480 Bueno, cuando queráis. 2 00:00:13,529 --> 00:00:16,769 Buenas tardes a todos, nosotros somos el grupo de Fitness Tracker, 3 00:00:16,890 --> 00:00:18,609 soy Hugo, Guillermo y Aarón, 4 00:00:18,789 --> 00:00:21,289 y hemos desarrollado una aplicación que consta de dos bloques, 5 00:00:21,469 --> 00:00:24,629 dos clientes, perdón, sí, que consta de dos bloques, 6 00:00:25,170 --> 00:00:28,949 que serían dos clientes en concreto, uno de web y otro de Android, 7 00:00:29,350 --> 00:00:32,850 y un backend que está desarrollado en parte por ASP.net 8 00:00:32,850 --> 00:00:34,729 y en otra parte con Spring Boot. 9 00:00:35,509 --> 00:00:36,609 ¿Me paso por la diapositiva? 10 00:00:37,090 --> 00:00:39,750 Bueno, este es un poco nuestro índice, lo que vamos a presentar hoy, 11 00:00:39,750 --> 00:00:56,030 Vamos a explicar primero la arquitectura de lo que es nuestro servidor, luego vamos a explicar lo que son los dos clientes, que hay uno tercero que no sería exactamente un cliente porque se transporta datos más hacia el dispositivo móvil, que es el que contacta en concreto. 12 00:00:56,030 --> 00:01:00,149 bueno, está en contacto con nuestro backend y al final pues unas conclusiones. 13 00:01:02,909 --> 00:01:12,650 Para empezar, esto es en general lo que tenemos construido, tenemos primero un reloj inteligente que es lo que estaba explicando antes, 14 00:01:12,769 --> 00:01:18,569 que es un smartwatch, un dispositivo que lo que hace es recoger datos propios del usuario como el nivel de oxígeno en sangre, 15 00:01:18,689 --> 00:01:25,549 la frecuencia cardíaca, entre otras propiedades propias únicas del usuario y las vuelca al dispositivo Android. 16 00:01:25,549 --> 00:01:29,349 este a su vez lo que hace es generar lo que nosotros llamamos las rutinas, 17 00:01:29,489 --> 00:01:32,750 que son modelos que recogen datos del usuario, datos diarios, por ejemplo, 18 00:01:33,329 --> 00:01:37,650 e información nutricional o, por ejemplo, comidas que consume el usuario a lo largo del día, 19 00:01:37,989 --> 00:01:40,689 así como ejercicio que también hace, por ejemplo, pasos realizados. 20 00:01:41,269 --> 00:01:44,629 Entonces, lo que hace el cliente Android es recoger estos datos, 21 00:01:44,790 --> 00:01:46,530 construir el modelo que he dicho que es el de rutinas 22 00:01:46,530 --> 00:01:51,189 y mediante una petición HTTP ponerse en contacto con nuestro backend 23 00:01:51,189 --> 00:02:02,530 y poderlo registrar al usuario que sea el usuario, el cliente en concreto que tenga la aplicación en su móvil. 24 00:02:04,590 --> 00:02:08,469 Este segundo bloque de aquí es lo que estaba explicando al principio, que es el cliente web, 25 00:02:08,550 --> 00:02:14,770 que es otro cliente que nosotros tenemos en nuestro bloque Frontend, que también se pone en contacto directo con nuestro backend 26 00:02:14,770 --> 00:02:21,289 y lo que es es un bloque que ofrece, entre otras cosas, un servicio avanzado de inteligencia artificial 27 00:02:21,289 --> 00:02:28,490 que te permite generar dietas personalizadas a través de la Binding con la inteligencia artificial que nosotros estamos usando. 28 00:02:29,770 --> 00:02:33,949 Nuestro backend se pone en contacto con nuestra base de datos, que es una base de datos Mongo, 29 00:02:34,469 --> 00:02:39,069 a través de lo que son los repositorios, o sea que nuestros servicios no atacan directamente a la base de datos, 30 00:02:39,210 --> 00:02:40,949 sino que lo hacen a través de repositorios. 31 00:02:42,490 --> 00:02:43,229 ¿Pasa, por favor? 32 00:02:43,229 --> 00:03:13,210 Lo que usamos es un híbrido más por así decirlo en lo que es una arquitectura de microservicios más que nada porque cuando empezamos el proyecto lo que teníamos ideado era una base de datos, perdón, una base de datos, un backend en Mongo con Spring Boot, un backend sobre Mongo con Spring Boot y por otra parte un servicio sobre ASP.NET que atacaba directamente a un servicio externo que tenemos que es el de Spring Boot. 33 00:03:13,229 --> 00:03:38,310 Lo que pasa es que tal y como evolucionamos el proyecto nos dimos cuenta de que luego a la hora de hacer los despliegues se nos facilita mucho el trabajo de controlar el tema de la seguridad porque nosotros lo que establecemos aquí es lo que se llama un API Gateway que es un módulo que tú expones entre tu cliente y el backend y lo que hace esto es redirigir las peticiones HTTP que recibe de clientes a los diferentes servicios que se estén ejecutando sobre tu backend. 34 00:03:38,310 --> 00:03:43,849 De modo que nosotros lo que hacemos es tener este microservicio que no se puede atacar directamente desde fuera, 35 00:03:43,990 --> 00:03:53,270 sino que todo este bloque está cerrado por el sistema de seguridad de AWS y tú lo único a lo que puedes atacar es este external services. 36 00:03:56,969 --> 00:04:01,629 El sistema de seguridad que usamos, por así decirlo, los métodos de seguridad que usamos, 37 00:04:02,330 --> 00:04:05,930 todos los endpoints que ofrecemos no están visibles al exterior. 38 00:04:05,930 --> 00:04:11,129 Los únicos que están visibles son los de poderse iniciar sesión y el de poderse registrar, 39 00:04:11,229 --> 00:04:17,649 que a esos debería tener acceso en principio cualquier usuario que esté usando nuestras aplicaciones de frontend. 40 00:04:18,170 --> 00:04:23,089 Entonces, nosotros lo que usamos es la autentificación por JSON Web Token. 41 00:04:24,449 --> 00:04:30,569 Esto es un sistema de autentificación que no guarda, es decir, no guarda una sesión como tal del usuario, 42 00:04:30,569 --> 00:04:36,430 sino que lo que guarda es un token que se genera cada vez que un usuario se inicia sesión 43 00:04:36,430 --> 00:04:41,970 y lo que hace este token es que lleva información que se llaman los claims 44 00:04:41,970 --> 00:04:44,509 que es información que identifica al usuario 45 00:04:44,509 --> 00:04:50,670 y esta información lo que hace es cuando tú haces una petición en el JSON Web Token 46 00:04:50,670 --> 00:04:52,350 en las cabeceras del JSON Web Token 47 00:04:52,350 --> 00:04:56,129 se guarda información de quién es este usuario en concreto 48 00:04:56,129 --> 00:04:57,990 para no tener que consultar a la base de datos 49 00:04:57,990 --> 00:05:03,490 y así poder hacer peticiones de forma más eficiente y garantizar que este usuario que está haciendo las peticiones 50 00:05:03,490 --> 00:05:07,709 es un usuario que en realidad es válido para poder acceder a ciertos endpoints. 51 00:05:09,509 --> 00:05:16,660 Entrando con la parte de la aplicación móvil, lo que se encarga de esta aplicación móvil es la parte de loguearse y registrarse. 52 00:05:16,860 --> 00:05:20,879 Lo que se encarga es de registrar las rutinas que puede tener un usuario a lo largo de varios días. 53 00:05:21,660 --> 00:05:28,379 También puede ver las dietas que genera también a partir de la web y también la parte de los requisitos que necesita cada día 54 00:05:28,379 --> 00:05:34,220 en temas de kilocalorías, carbohidratos, proteínas y también todos los alimentos registrados que comen ese día 55 00:05:34,220 --> 00:05:35,680 más los ejercicios que hacen. 56 00:05:37,040 --> 00:05:42,180 Aparte, en la pantalla principal puede meter sus datos y puede cambiarlos. 57 00:05:42,879 --> 00:05:46,819 El tema de cómo está montada la aplicación, para cada pantalla se crea una función 58 00:05:46,819 --> 00:05:52,639 con la notación de composable para crear lo que viene siendo la interfaz y ya luego mostrándolo. 59 00:05:53,040 --> 00:05:57,680 La parte de arriba, como es general, menos en el login, es donde se colocan los demás composables 60 00:05:57,680 --> 00:06:05,199 y lo que he hecho es una top bar general donde voy colocando todo lo demás para no repetir código. 61 00:06:09,589 --> 00:06:15,509 Para navegar entre las distintas pantallas lo que he hecho es un navhost que ha sido para navegar entre distintas rutas. 62 00:06:16,149 --> 00:06:20,529 Lo que he hecho ha sido crear una clase allá donde guardas un string que es el nombre de la ruta 63 00:06:20,529 --> 00:06:25,449 y cuando tú pones ese nombre de la ruta lo que vas a hacer es cambiar ese composable por el siguiente, 64 00:06:26,410 --> 00:06:30,410 eliminando el contexto que tenías detrás y mostrando el siguiente. 65 00:06:30,790 --> 00:06:35,790 Aparte, lo que he dicho antes, como tengo una torpa que no quiero que se muestre en todos lados, 66 00:06:35,790 --> 00:06:40,790 lo que tengo es un listener que me detecta en qué ruta estoy. 67 00:06:40,790 --> 00:06:44,790 Entonces, si estoy en el login, lo que hace es no mostrarme la torpa. 68 00:06:44,790 --> 00:06:53,930 Para cada pantalla tiene su bimodel, donde básicamente tienen las variables que se van a mostrar en pantalla, 69 00:06:53,930 --> 00:06:59,930 que se van a cambiar para mostrar esos datos que van a cambiar, por ejemplo, los datos de los alimentos, 70 00:06:59,930 --> 00:07:10,089 Y también las funciones, que estas funciones se van a encargar de hacer llamadas a la API REST de Retrofit o a la base de datos de Local Room. 71 00:07:10,550 --> 00:07:24,509 Para acceder al valor a través del composable, lo que tienes que hacer es llamar a ese ViewModel y utilizar esa función de ConnectAsState para pillar ese valor y ya después lo puedes tirar como quieras. 72 00:07:25,269 --> 00:07:28,990 Una vez que se haga la recomposición, lo que va a hacer es recargar de otra vez la pantalla 73 00:07:28,990 --> 00:07:32,189 y te va a mostrar los datos que tenías en el Blue Model ahora. 74 00:07:34,879 --> 00:07:41,579 Para persistir esos datos de forma general, porque el Blue Model lo que hace es persistir esos datos de forma de cada pantalla, 75 00:07:42,199 --> 00:07:47,759 una vez que tú destruyes ese composable, pues ya no existe ese Blue Model, ha perdido los datos, pues utiliza Room. 76 00:07:48,199 --> 00:07:51,120 Room es una base de datos local que sirve para almacenar los datos, 77 00:07:51,120 --> 00:07:55,139 de forma que si tú cierras la aplicación 78 00:07:55,139 --> 00:07:56,620 pues estos datos perduran 79 00:07:56,620 --> 00:07:58,519 y si cambio de pantalla 80 00:07:58,519 --> 00:08:00,540 pues esos datos que tengo guardados en Room 81 00:08:00,540 --> 00:08:02,959 pues los seguiría teniendo 82 00:08:02,959 --> 00:08:06,100 aparte cuando hago una llamada de Retrofit 83 00:08:06,100 --> 00:08:07,240 lo que hago es guardarlo en Room 84 00:08:07,240 --> 00:08:07,579 ¿por qué? 85 00:08:08,220 --> 00:08:10,560 porque imagínate que me quedo sin internet 86 00:08:10,560 --> 00:08:12,199 y no puedo hacer llamadas a Retrofit 87 00:08:12,199 --> 00:08:14,740 pues lo que haces es tirar de la base de datos local 88 00:08:14,740 --> 00:08:17,899 y coger los últimos datos que tú tenías en tu propio móvil 89 00:08:17,899 --> 00:08:20,800 y luego mostrárselos para que no se queden parados 90 00:08:20,800 --> 00:08:30,800 Para acceder a través de Room tenemos unos DAOs que tienen las queries para acceder a los datos que tú quieres y se hacen a través de unos repositorios. 91 00:08:30,800 --> 00:08:44,240 Y como he hablado antes, para acceder a través del API REST, utilizo Retrofade para hacer 92 00:08:44,240 --> 00:08:54,240 las llamadas, donde todas las llamadas menos el login tienen una autentificación que sería 93 00:08:54,240 --> 00:08:59,320 el token, para verificar que ese usuario está registrado, que se hace a través del login, 94 00:08:59,320 --> 00:09:04,440 Y funciona más o menos igual que el ROM, que sería a través de los repositorios. 95 00:09:04,559 --> 00:09:09,419 EpiMode se conecta a través de los repositorios para luego hacer las llamadas y reconectar esos datos que devuelve el API. 96 00:09:12,120 --> 00:09:16,720 Para el tema de elementos repetitivos, por ejemplo, el tema de cargando, cuando tú le das al botón de entrar, 97 00:09:17,279 --> 00:09:22,940 si tú no bloqueas ese botón, tú le puedes pulsar varias veces y puedes hacer varias llamadas a esa API REST. 98 00:09:23,080 --> 00:09:24,240 Entonces, eso es un fallo de seguridad. 99 00:09:24,240 --> 00:09:29,059 Entonces, para evitar eso, por ejemplo, se congela la pantalla y sale una imagen de cargando. 100 00:09:29,320 --> 00:09:35,320 para mostrar al usuario que no puede hacer más llamadas y que no puede hacer más datos. 101 00:09:35,320 --> 00:09:42,320 Eso como se tiene que hacer en cada pantalla, para no repetir código, lo que se hace es una serie de eventos. 102 00:09:42,320 --> 00:09:47,320 Para hacer estos eventos se encarga un ViewModel que tiene el patrón Singleton 103 00:09:47,320 --> 00:09:50,320 y ese ViewModel se carga en los demás ViewModels. 104 00:09:50,320 --> 00:09:57,320 Entonces tiene aquí una variable que sería el state que te indica el estado de la propia aplicación. 105 00:09:57,320 --> 00:10:05,279 Si yo le pongo un estado de cargando, pues me mostraría que la pantalla está compulsable, que sería el fondo ese transparente con el logo. 106 00:10:06,039 --> 00:10:12,220 En el caso de que sea un error, pues te muestra un diálogo con el error en cuestión, que yo lo haya puesto en ese momento. 107 00:10:14,720 --> 00:10:20,820 Y para conectar todo de forma más rápida, he utilizado Agile y Docker, que es una inyección de dependencias, 108 00:10:20,820 --> 00:10:23,080 que hace que yo pueda 109 00:10:23,080 --> 00:10:25,120 llamar y conectar esos view models 110 00:10:25,120 --> 00:10:27,179 de forma sin que tenga 111 00:10:27,179 --> 00:10:28,960 que crearlos previamente 112 00:10:28,960 --> 00:10:31,139 y lo pueda crear directamente los composables 113 00:10:31,139 --> 00:10:33,019 por ejemplo, cuando yo creo una pantalla 114 00:10:33,019 --> 00:10:34,799 yo con esta función de aquí 115 00:10:34,799 --> 00:10:37,799 el HIT ya me detecta 116 00:10:37,799 --> 00:10:39,519 que view model tengo que utilizar 117 00:10:39,519 --> 00:10:41,120 para ya luego poder utilizarlo 118 00:10:41,120 --> 00:10:42,320 en la aplicación 119 00:10:42,320 --> 00:10:45,360 y así no tengo que estar cargando en cada view model 120 00:10:45,360 --> 00:10:46,679 los datos y puedo 121 00:10:46,679 --> 00:10:49,080 destruirlos y reutilizarlos 122 00:10:49,080 --> 00:10:52,179 para el tema de la aplicación 123 00:10:52,179 --> 00:10:55,559 y para el tema del reloj 124 00:10:55,559 --> 00:10:58,240 la estructura es básicamente igual 125 00:10:58,240 --> 00:11:00,399 funciona a través de composables 126 00:11:00,399 --> 00:11:01,039 y view models 127 00:11:01,039 --> 00:11:04,100 y este es un ejemplo de como quedaría 128 00:11:04,100 --> 00:11:05,419 que es básicamente una lista 129 00:11:05,419 --> 00:11:06,879 con todos los datos 130 00:11:06,879 --> 00:11:10,840 que puede tener el usuario en el móvil 131 00:11:10,840 --> 00:11:15,259 vale, pues ya continúo yo 132 00:11:15,259 --> 00:11:16,919 en mi caso he estado 133 00:11:16,919 --> 00:11:17,980 con el apartado web 134 00:11:17,980 --> 00:11:26,340 Aquí podemos ver los dos tipos de vistas que hay, tanto la de ordenador como para móvil, que la web es completamente responsive. 135 00:11:26,960 --> 00:11:36,019 Entonces podemos ver tanto la página de inicio que tiene una pequeña top bar donde redirecciona las diferentes secciones del inicio, 136 00:11:36,200 --> 00:11:44,299 al igual que podemos ver en las diferentes páginas donde redirige al inicio y su sección correspondiente. 137 00:11:44,299 --> 00:11:54,919 Podemos ver un apartado de register y un login, al igual que las rutinas y las dietas. 138 00:11:55,039 --> 00:12:00,919 Las dietas llegan directamente desde la base de datos, al igual que las rutinas, ya que las guarda el teléfono. 139 00:12:04,480 --> 00:12:11,759 Todo el sistema de navegación, tanto de la web como desde el móvil, está hecho con React Router. 140 00:12:11,759 --> 00:12:16,220 entonces usamos un proveedor de autenticación 141 00:12:16,220 --> 00:12:20,240 en el que tenemos tanto rutas públicas como las rutas privadas 142 00:12:20,240 --> 00:12:25,960 para acceder a las rutas privadas necesitamos estar logueados en una cuenta 143 00:12:25,960 --> 00:12:30,279 ya que usa el JVT y no tiene acceso a ello 144 00:12:30,279 --> 00:12:31,940 en el caso de que no tengas acceso 145 00:12:31,940 --> 00:12:37,519 te redirige automáticamente al login para loguearte 146 00:12:37,519 --> 00:12:43,000 De esta manera podemos iniciar sesión 147 00:12:43,000 --> 00:12:49,659 El proveedor realiza una petición al login con tus datos 148 00:12:49,659 --> 00:12:52,360 Tanto el usuario como la contraseña 149 00:12:52,360 --> 00:12:55,279 En nuestro caso el usuario es el Gmail 150 00:12:55,279 --> 00:12:56,960 Damos el correo 151 00:12:56,960 --> 00:13:00,840 Entonces según si está registrado o no el usuario 152 00:13:00,840 --> 00:13:04,360 Nos devuelve ese token o no 153 00:13:04,360 --> 00:13:07,480 El token automáticamente se establece en el encabezado 154 00:13:07,480 --> 00:13:13,019 de las peticiones y se guarda 155 00:13:13,019 --> 00:13:16,799 en la base de datos local del navegador 156 00:13:16,799 --> 00:13:20,399 entonces a la vez que nosotros queremos ir navegando 157 00:13:20,399 --> 00:13:24,600 por las diferentes pantallas comprobará ese token 158 00:13:24,600 --> 00:13:28,980 y si no está correspondiente te dejará navegar a través de las 159 00:13:28,980 --> 00:13:32,960 diferentes pantallas. También está establecido un sistema de logout 160 00:13:32,960 --> 00:13:36,580 creo que son 15 minutos lo que está puesto en el que 161 00:13:36,580 --> 00:13:38,740 el token deja de ser válido 162 00:13:38,740 --> 00:13:41,220 y necesita recoger uno nuevo 163 00:13:41,220 --> 00:13:43,559 para poder seguir funcionando 164 00:13:43,559 --> 00:13:44,519 en la web 165 00:13:44,519 --> 00:13:49,120 vale, esto es un pequeño ejemplo 166 00:13:49,120 --> 00:13:50,500 de cómo está hecha la web 167 00:13:50,500 --> 00:13:52,360 está hecha a través de MaterialWire 168 00:13:52,360 --> 00:13:55,419 está hecha por componentes 169 00:13:55,419 --> 00:13:56,419 entonces en la 170 00:13:56,419 --> 00:13:59,080 por cada componente 171 00:13:59,080 --> 00:14:01,159 establecemos las diferentes funciones que vamos a usar 172 00:14:01,159 --> 00:14:03,860 y 173 00:14:03,860 --> 00:14:06,600 y dos de donde podemos hacer peticiones 174 00:14:06,600 --> 00:14:08,580 para cargar datos, etc 175 00:14:08,580 --> 00:14:10,539 después devolvemos 176 00:14:10,539 --> 00:14:12,220 lo que viene a ser la estructura del componente 177 00:14:12,220 --> 00:14:14,460 que es lo que contiene, este componente 178 00:14:14,460 --> 00:14:16,620 puede contener otros componentes creados 179 00:14:16,620 --> 00:14:17,620 que sean necesarios 180 00:14:17,620 --> 00:14:20,620 y desde donde se hace 181 00:14:20,620 --> 00:14:22,539 el diseño completo de la web 182 00:14:22,539 --> 00:14:24,159 y 183 00:14:24,159 --> 00:14:26,360 ya está bien 184 00:14:26,360 --> 00:14:30,159 al principio esto ya sería 185 00:14:30,159 --> 00:14:32,120 bueno, pues nada más que comentar un poco 186 00:14:32,120 --> 00:14:34,379 las conclusiones, están más o menos 187 00:14:34,379 --> 00:14:40,159 listadas en pantalla. Lo que sí cabe destacar del proyecto de nuestra parte es que el proyecto 188 00:14:40,159 --> 00:14:47,659 no está realmente cerrado. De hecho, una de las ambiciones era el implementar un chatbot 189 00:14:47,659 --> 00:14:51,360 que sería como un asistente virtual que tú le puedes hacer consultas sobre, por ejemplo, 190 00:14:51,360 --> 00:14:59,259 cómo construir una rutina de ejercicios diaria y él te respondería. Pero eso no se implementó 191 00:14:59,259 --> 00:15:04,139 más que nada porque no está para esta entrega y es algo que se podría hacer de cara a un 192 00:15:04,139 --> 00:15:05,539 futuro para poderlo ampliar. 193 00:15:06,500 --> 00:15:07,820 También en la parte del 194 00:15:07,820 --> 00:15:09,240 reloj, para el tema de coger 195 00:15:09,240 --> 00:15:10,500 los datos, 196 00:15:11,580 --> 00:15:13,600 vi dos formas, una que era que 197 00:15:13,600 --> 00:15:15,840 a través de una API de Google Cloud 198 00:15:15,840 --> 00:15:17,759 tú conseguías una PIKI 199 00:15:17,759 --> 00:15:19,759 y luego la ponías para obtener esos datos, 200 00:15:19,759 --> 00:15:21,700 pero era de pago, y luego era otra 201 00:15:21,700 --> 00:15:22,299 librería de 202 00:15:22,299 --> 00:15:25,600 Google, donde pillabas exactamente 203 00:15:25,600 --> 00:15:26,299 los datos, pero 204 00:15:26,299 --> 00:15:29,480 pillaba otra librería de por sí 205 00:15:29,480 --> 00:15:31,659 y más de una vez alguna otra librería 206 00:15:31,659 --> 00:15:33,539 de Google llamaba a algún tipo de problema, entonces 207 00:15:33,539 --> 00:15:35,539 esa parte también haría falta 208 00:15:35,539 --> 00:15:37,480 de mejora 209 00:15:37,480 --> 00:15:38,600 aparte también de conectar 210 00:15:38,600 --> 00:15:41,320 ya los datos de reloj a móvil 211 00:15:41,320 --> 00:15:45,100 y eso sería todo 212 00:15:45,100 --> 00:15:47,500 para poder acceder a la página web 213 00:15:47,500 --> 00:15:49,700 hemos hecho este QR 214 00:15:49,700 --> 00:15:51,559 que no tenemos 215 00:15:51,559 --> 00:15:53,559 no hemos, por temas de tiempo 216 00:15:53,559 --> 00:15:55,299 y tal, no hemos hecho una 217 00:15:55,299 --> 00:15:57,480 URL, no hemos hecho un dominio propio 218 00:15:57,480 --> 00:15:58,419 para nuestra URL 219 00:15:58,419 --> 00:16:01,360 y bueno, pues esto lo que 220 00:16:01,360 --> 00:16:03,440 te expone es una URL directo a lo 221 00:16:03,440 --> 00:16:05,639 a los servicios de AWS 222 00:16:05,639 --> 00:16:08,360 y ahí pues te expone un poco la IP también 223 00:16:08,360 --> 00:16:10,679 pero sería la web en concreto 224 00:16:10,679 --> 00:16:12,659 que está hostear en los servicios 225 00:16:12,659 --> 00:16:13,259 de AWS 226 00:16:13,259 --> 00:16:15,539 y poco más 227 00:16:15,539 --> 00:16:20,190 bueno si eso hacemos una 228 00:16:20,190 --> 00:16:22,309 una demostración para ver 229 00:16:22,309 --> 00:16:24,769 en este caso aquí podemos 230 00:16:24,769 --> 00:16:26,730 ver la web 231 00:16:26,730 --> 00:16:28,330 que estaría desde 232 00:16:28,330 --> 00:16:31,529 el apartado principal 233 00:16:31,529 --> 00:16:32,990 con la barra de navegación 234 00:16:32,990 --> 00:16:34,769 que está compuesta por secciones 235 00:16:34,769 --> 00:16:37,169 donde podemos ir clicando a las diferentes 236 00:16:37,169 --> 00:16:39,309 secciones y nos redirige 237 00:16:39,309 --> 00:16:41,070 a ellas, podemos ver una pequeña descripción 238 00:16:41,070 --> 00:16:42,350 de los diferentes servicios 239 00:16:42,350 --> 00:16:45,049 al igual que un apartado 240 00:16:45,049 --> 00:16:47,269 para descargar la aplicación 241 00:16:47,269 --> 00:16:48,570 y nos llevaría 242 00:16:48,570 --> 00:16:50,909 a un drive donde poder descargar 243 00:16:50,909 --> 00:16:52,730 la aplicación 244 00:16:52,730 --> 00:16:55,090 bien, además 245 00:16:55,090 --> 00:16:56,769 también tiene un footer 246 00:16:56,769 --> 00:16:58,929 luego ya tenemos 247 00:16:58,929 --> 00:16:59,929 el apartado de registro 248 00:16:59,929 --> 00:17:03,049 donde podríamos registrarnos 249 00:17:03,049 --> 00:17:04,089 con un usuario, en este caso 250 00:17:04,089 --> 00:17:10,430 sería un 251 00:17:10,430 --> 00:17:12,349 un pequeño registrar donde aparece 252 00:17:12,349 --> 00:17:13,809 donde podríamos registrarnos 253 00:17:13,809 --> 00:17:15,789 pero en nuestro caso vamos a ir a 254 00:17:15,789 --> 00:17:18,930 a un usuario 255 00:17:18,930 --> 00:17:19,910 de ejemplo 256 00:17:19,910 --> 00:17:21,470 puedes entrarte al usuario 1 257 00:17:21,470 --> 00:17:32,430 bien, aquí podríamos verlos 258 00:17:32,430 --> 00:17:34,589 el usuario 259 00:17:34,589 --> 00:17:36,190 que tendría pues 260 00:17:36,190 --> 00:17:38,170 la foto de perfil, el número de usuario 261 00:17:38,170 --> 00:17:40,190 además de la rutina, dietas y físico 262 00:17:40,190 --> 00:17:58,809 En el recogido, aquí podríamos ver en este apartado las diferentes rutinas llegadas desde el móvil de reloj y en el apartado de las dietas, las diferentes dietas creadas por la IA. 263 00:17:58,809 --> 00:18:01,250 habría un apartado 264 00:18:01,250 --> 00:18:03,369 de información de cuenta donde podríamos editar 265 00:18:03,369 --> 00:18:05,130 los datos del usuario 266 00:18:05,130 --> 00:18:07,130 a través de un formulario 267 00:18:07,130 --> 00:18:09,309 al igual que cargar 268 00:18:09,309 --> 00:18:10,750 una imagen 269 00:18:10,750 --> 00:18:12,230 del perfil 270 00:18:12,230 --> 00:18:14,730 miren el imágenes 271 00:18:14,730 --> 00:18:17,069 a ver si hay alguna, creo que no 272 00:18:17,069 --> 00:18:19,130 ¿acargo alguna de estas? 273 00:18:19,430 --> 00:18:20,150 sí, por ejemplo 274 00:18:20,150 --> 00:18:23,009 donde cargaríamos la imagen y podríamos 275 00:18:23,009 --> 00:18:24,309 rellenar los diferentes datos 276 00:18:24,309 --> 00:18:27,089 por ejemplo aquí de peso 70, etc 277 00:18:27,089 --> 00:18:29,450 editaríamos 278 00:18:29,450 --> 00:18:33,410 si se está editando 279 00:18:33,410 --> 00:18:34,410 lo que pasa es que no hay 280 00:18:34,410 --> 00:18:37,910 y las consolas 281 00:18:37,910 --> 00:18:39,309 de Eceros que usamos 282 00:18:39,309 --> 00:18:40,809 que son muy 283 00:18:40,809 --> 00:18:44,150 son todas de características 284 00:18:44,150 --> 00:18:45,309 un poco limitadas 285 00:18:45,309 --> 00:18:47,069 y entonces eso hace 286 00:18:47,069 --> 00:18:49,369 eso ralentiza las respuestas 287 00:18:49,369 --> 00:18:51,069 que obtenemos nosotros 288 00:18:51,069 --> 00:18:54,450 luego también estaría 289 00:18:54,450 --> 00:18:56,329 el formulario 290 00:18:56,329 --> 00:18:58,190 para generar las dietas 291 00:18:58,190 --> 00:19:00,250 donde le pasaríamos los diferentes parámetros 292 00:19:00,250 --> 00:19:02,630 que esto ya contactaría con el 293 00:19:02,630 --> 00:19:04,369 backend y nos generaría la dieta 294 00:19:04,369 --> 00:19:06,490 y la pondría con la imagen correspondiente 295 00:19:06,490 --> 00:19:06,710 de 296 00:19:06,710 --> 00:19:09,509 en este apartado 297 00:19:09,509 --> 00:19:12,150 que cogería una de las comidas que 298 00:19:12,150 --> 00:19:13,910 contenga la dieta y pondría 299 00:19:13,910 --> 00:19:14,789 la imagen 300 00:19:14,789 --> 00:19:17,710 ¿Enseñas tú el apartado móvil? 301 00:19:17,710 --> 00:19:17,890 Aquí 302 00:19:17,890 --> 00:19:23,470 Bueno, esta sería la aplicación móvil 303 00:19:23,470 --> 00:19:24,190 este sería el loading 304 00:19:24,190 --> 00:19:26,690 estos serían los dos campos que tienes que rellenar 305 00:19:26,690 --> 00:19:49,009 Para el tema de usabilidad, lo que he hecho es que cuando le des aquí, te suelta el siguiente campo, tú puedes rellenarlo, y cuando termines con el segundo campo, directamente te saca el este, esto es lo que se ha comentado en los eventos, para bloquear el botón, que no puedes hacer varias llamadas, está haciendo la llamada a la que está cogiendo los datos, si quiere cargar. 306 00:19:49,009 --> 00:19:52,069 la conexión aquí no es favorable 307 00:19:52,069 --> 00:19:52,730 entonces 308 00:19:52,730 --> 00:19:54,589 es lo que 309 00:19:54,589 --> 00:19:58,750 no estamos diciendo web 310 00:19:58,750 --> 00:20:00,569 estamos diciendo redes generales 311 00:20:00,569 --> 00:20:01,630 porque no estamos usando web 312 00:20:01,630 --> 00:20:03,930 nuestro gran amigo 313 00:20:03,930 --> 00:20:06,549 EducaMadrid nos capa las conexiones con AWS 314 00:20:06,549 --> 00:20:13,279 bueno pues aquí tendrán los datos 315 00:20:13,279 --> 00:20:15,940 la parte del resultado serían los datos 316 00:20:15,940 --> 00:20:17,539 sacados a partir de los datos del usuario 317 00:20:17,539 --> 00:20:18,319 tú puedes entrar aquí 318 00:20:18,319 --> 00:20:20,440 modificar la altura por ejemplo 319 00:20:20,440 --> 00:20:25,880 Aquí tendrían los alimentos que ha consumido el usuario a lo largo del tiempo. 320 00:20:27,140 --> 00:20:30,579 Aquí saldrían los requerimientos de lo que tiene que hacer cada usuario. 321 00:20:31,099 --> 00:20:34,099 Aquí las dietas, que es lo que han hecho antes ellos. 322 00:20:34,700 --> 00:20:36,099 Lo que se visualizaba en la web. 323 00:20:36,220 --> 00:20:37,200 Más o menos. 324 00:20:37,200 --> 00:20:42,799 Aquí en este apartado tendrías la parte de diaria, donde tú puedes meter la parte de los alimentos. 325 00:20:43,039 --> 00:20:45,660 Yo, por ejemplo, si quiero meter un almuerzo, vengo aquí. 326 00:20:45,660 --> 00:20:51,660 Tengo que poner el elemento en inglés porque la API pone los elementos en inglés. 327 00:20:51,660 --> 00:20:54,660 Le doy a buscar y te aparecen todas las opciones. 328 00:20:54,660 --> 00:21:01,660 Entonces tú clicas en ella y ya luego te aparecen aquí los datos necesarios. 329 00:21:01,660 --> 00:21:06,660 En el almuerzo te pone los datos que necesites, etc. 330 00:21:06,660 --> 00:21:08,660 Y ya luego para la web exactamente igual. 331 00:21:08,660 --> 00:21:11,660 Estos datos se guardan tanto en la API REST de Retrofit, 332 00:21:11,660 --> 00:21:36,029 Y ahora pues estaría la sección de preguntas por si hay alguna. 333 00:21:36,930 --> 00:21:43,829 A ver, hay una parte que no habéis comentado, que es la conexión con la inteligencia artificial. ¿No está implementada? 334 00:21:43,829 --> 00:21:57,269 Sí, o sea, lo que comentaba al principio del tema de lo que es un híbrido entre lo que es una arquitectura microservicios y lo que usamos, o sea, el principio de la arquitectura microservicios por lo que he visto es que cada servicio tiene su propia base de datos. 335 00:21:57,269 --> 00:22:08,430 Nosotros podríamos hacer esto, pero en nuestro caso, por costes de desarrollo y maximizar el tiempo que tenemos en lo que podemos controlar nosotros, 336 00:22:09,089 --> 00:22:20,170 hemos externalizado este servicio, que desarrollar una inteligencia artificial para nuestro propio servicio no es algo que nos tomaría meses y años tampoco. 337 00:22:20,170 --> 00:22:22,990 entonces la cosa es que nosotros usamos 338 00:22:22,990 --> 00:22:24,890 un modelo de lenguaje de OpenAI 339 00:22:24,890 --> 00:22:26,970 que es el mismo que usa 340 00:22:26,970 --> 00:22:29,069 uno de los que usa HGPT en concreto 341 00:22:29,069 --> 00:22:31,130 nosotros usamos GPT-4 version 342 00:22:31,130 --> 00:22:33,109 que si no me equivoco estaba en su 343 00:22:33,109 --> 00:22:35,049 versión, se estaba lanzando 344 00:22:35,049 --> 00:22:36,950 cuando estábamos haciendo las pruebas y creo que 345 00:22:36,950 --> 00:22:39,150 la van a deteriorar para una más reciente 346 00:22:39,150 --> 00:22:41,190 y es ese modelo de lenguaje 347 00:22:41,190 --> 00:22:43,089 que usamos entonces, la cosa es que nosotros 348 00:22:43,089 --> 00:22:44,609 construimos un Json con 349 00:22:44,609 --> 00:22:46,650 los datos de la dieta que 350 00:22:46,650 --> 00:22:49,410 queremos modelar 351 00:22:49,410 --> 00:22:54,549 y eso se lo mandamos a la inteligencia artificial y le pedimos que responda con un JSON de vuelta. 352 00:22:55,589 --> 00:22:59,809 Haciendo pruebas nosotros en un principio le mandamos lo que es un JSON esquema 353 00:22:59,809 --> 00:23:04,730 que sería un JSON pero donde tú expones por cada campo en concreto por ejemplo 354 00:23:04,730 --> 00:23:09,769 tiene que ser un string, puede tener ciertos datos y otros no 355 00:23:09,769 --> 00:23:14,410 pero lo que pasa con este tipo de peticiones es que la I era muy inconsistente 356 00:23:14,410 --> 00:23:19,049 y había que hacer varias peticiones para que te dé una respuesta que se ajuste al JSON 357 00:23:19,049 --> 00:23:22,910 que nosotros podemos realizar para trabajar con los pojos en nuestros programas. 358 00:23:23,049 --> 00:23:31,089 Entonces, lo que hicimos fue construir un objeto, un pojo con los datos ya de un ejemplo de dieta ya construido para pedirle 359 00:23:31,089 --> 00:23:38,410 y luego serializarlo a Json y pedirle que siga el mismo ejemplo y entonces poder responder con los datos que le mandamos. 360 00:23:38,410 --> 00:23:45,170 Por ejemplo, si yo le digo, oye, si por ejemplo, porque el flujo de datos es, tú haces una petición con una serie de datos, 361 00:23:45,170 --> 00:23:51,930 tú le mandas información propia tuya, como por ejemplo la altura, el sexo, le mandas también el peso 362 00:23:51,930 --> 00:23:58,529 y luego lo que haces también es que le puedes indicar, por ejemplo, el tipo de restricciones alimenticias, 363 00:23:58,730 --> 00:24:03,529 también le puedes indicar algunas notas que tú consideres necesarias para luego poder construir la dieta. 364 00:24:04,150 --> 00:24:10,349 A partir de esto nosotros lo que hacemos es, tenemos un listado de categorías de alimentos, 365 00:24:10,349 --> 00:24:14,349 por ejemplo, para vegetarianos, para veganos, etc., 366 00:24:15,049 --> 00:24:17,589 de los cuales le pedimos primero a la inteligencia artificial, 367 00:24:17,789 --> 00:24:21,410 partiendo de unos datos que tú has mandado para modelar la dieta, 368 00:24:21,849 --> 00:24:25,410 cuáles de estas categorías se ajustan para la dieta que se está intentando modelar, 369 00:24:26,009 --> 00:24:28,130 la IA nos responde con un listado de categorías, 370 00:24:28,230 --> 00:24:32,049 y entonces contactamos con la API, que es EDAMAM, 371 00:24:32,089 --> 00:24:33,890 la que usamos para información nutricional, 372 00:24:33,990 --> 00:24:37,029 que por cierto usamos un plan gratuito, porque tienen de pago, 373 00:24:37,029 --> 00:24:40,109 y lo que hacemos es, ya partiendo de estas categorías, 374 00:24:40,349 --> 00:24:46,289 nos envían varios alimentos que se ajustan a las categorías que nosotros hemos seleccionado 375 00:24:46,289 --> 00:24:50,990 y a partir de esto le decimos a la IA, oye, esta persona quiere construir esta dieta 376 00:24:50,990 --> 00:24:55,509 y estos son los alimentos que deberían, en principio, según las categorías que tú has seleccionado 377 00:24:55,509 --> 00:24:57,990 con una primera petición, entrar en esta dieta. 378 00:24:58,950 --> 00:25:02,390 Esa respuesta toma un tiempo, por las pruebas que hemos estado haciendo, 379 00:25:03,130 --> 00:25:07,009 alrededor de 30 segundos más o menos por petición, por las pruebas que hemos hecho, 380 00:25:07,009 --> 00:25:13,009 y esa respuesta se serializa a un Json, que es lo que se acaba devolviendo al cliente. 381 00:25:15,190 --> 00:25:19,930 Y esa IA también cabe destacar que tiene costes, para lo que nosotros invertimos, 382 00:25:20,230 --> 00:25:24,490 lo que cabe en nuestro presupuesto, pues invertimos 5 euros, 383 00:25:24,690 --> 00:25:27,869 que el sistema que usan ellos es por tokens, que tokens vendrían a ser, 384 00:25:28,150 --> 00:25:32,450 si mal no entiendo, las palabras con las que la IA puede responder. 385 00:25:33,109 --> 00:25:39,150 Entonces, por cada cantidad de palabras que use la IA para construir tu respuesta, 386 00:25:39,750 --> 00:25:47,009 pues se van consumiendo tokens y tú tienes un límite de tokens para poder consumir dentro del crédito que tú has recargado. 387 00:25:47,009 --> 00:25:54,589 Pasa que estamos en España, que es una de las regiones que OpenAI ofrece un saldo gratuito 388 00:25:54,589 --> 00:25:58,930 cuando tú creas una cuenta gratuita por primera vez para usar sus APIs, sus endpoints, 389 00:25:58,930 --> 00:26:01,789 pero cuando fuimos a hacer este proyecto 390 00:26:01,789 --> 00:26:03,730 pues ya, porque llevo usando 391 00:26:03,730 --> 00:26:04,930 ChagPetel desde hace tiempo 392 00:26:04,930 --> 00:26:07,829 y ya había pasado el tiempo 393 00:26:07,829 --> 00:26:09,529 de uso de este crédito, entonces 394 00:26:09,529 --> 00:26:11,130 había que pagar un poco 395 00:26:11,130 --> 00:26:13,190 pero eso, una inversión para 396 00:26:13,190 --> 00:26:17,440 ¿Qué utilizáis para contactar? 397 00:26:17,960 --> 00:26:18,759 Si usamos 398 00:26:18,759 --> 00:26:20,200 ¿Te refieres a? 399 00:26:20,660 --> 00:26:21,960 Bueno, el módulo 400 00:26:21,960 --> 00:26:23,740 Si, usamos el 401 00:26:23,740 --> 00:26:27,160 el módulo 402 00:26:27,160 --> 00:26:28,700 en concreto, en el proyecto se llama 403 00:26:28,700 --> 00:26:30,420 FTI de Fitness Tracker 404 00:26:30,420 --> 00:26:32,779 Artificial Intelligence y usamos 405 00:26:32,779 --> 00:26:35,460 el framework de ASP.NET 406 00:26:35,460 --> 00:26:37,180 con el lenguaje 407 00:26:37,180 --> 00:26:38,640 de programación de C Sharp 408 00:26:38,640 --> 00:26:41,240 esto lo usamos en su día 409 00:26:41,240 --> 00:26:43,220 más que nada porque es muy muy sencillo 410 00:26:43,220 --> 00:26:44,660 levantar una API REST con 411 00:26:44,660 --> 00:26:46,700 C Sharp y ya 412 00:26:46,700 --> 00:26:49,259 la verdad es que se agradece también el tema 413 00:26:49,259 --> 00:26:51,420 de que de por sí 414 00:26:51,420 --> 00:26:53,380 te monta ya la documentación 415 00:26:53,380 --> 00:26:54,880 fue un poco un problema con Java 416 00:26:54,880 --> 00:26:57,019 porque hay un problema con Java de que 417 00:26:57,019 --> 00:26:58,559 Spring Boot al parecer 418 00:26:58,559 --> 00:27:01,900 Spring Boot .3 no tiene bastantes 419 00:27:01,900 --> 00:27:04,559 problemas de conflictos o compatibilidades 420 00:27:04,559 --> 00:27:07,539 con el Spring Boot .3 421 00:27:07,539 --> 00:27:10,799 tiene problemas de compatibilidad con lo que es, si no me equivoco 422 00:27:10,799 --> 00:27:13,380 Spring Fox, que es el framework que ofrece 423 00:27:13,380 --> 00:27:15,900 la documentación de Swagger para Java 424 00:27:15,900 --> 00:27:19,200 entonces lo que acabamos haciendo al final es 425 00:27:19,200 --> 00:27:22,500 degradar, esto ya me escapa un poquito de tu pregunta 426 00:27:22,500 --> 00:27:25,440 pero lo que acabamos haciendo es degradar la versión de Spring Boot 427 00:27:25,440 --> 00:27:28,539 a la 2.6 algo, que es la que es más fácil 428 00:27:28,539 --> 00:27:30,339 de manipular para hacer la documentación 429 00:27:30,339 --> 00:27:32,619 esto por una parte, también usamos 430 00:27:32,619 --> 00:27:34,200 una librería que es open source 431 00:27:34,200 --> 00:27:35,579 que se llama 432 00:27:35,579 --> 00:27:37,940 openai.net, creo que se llama 433 00:27:37,940 --> 00:27:40,500 que está en .net también 434 00:27:40,500 --> 00:27:43,019 obviamente, y esto nos facilita 435 00:27:43,019 --> 00:27:44,680 el tema, más que nada 436 00:27:44,680 --> 00:27:46,579 porque para trabajar 437 00:27:46,579 --> 00:27:47,859 con los endpoints de 438 00:27:47,859 --> 00:27:50,539 OpenAI, ellos te dan un endpoint y tú 439 00:27:50,539 --> 00:27:52,579 lo que haces es peticiones a ellos con un cierto 440 00:27:52,579 --> 00:27:54,799 verbo, es post, no me acuerdo ahora mismo 441 00:27:54,799 --> 00:27:56,740 en concreto cuál es el verbo, pero la cosa 442 00:27:56,740 --> 00:28:01,180 es que tú haces peticiones a sus endpoints, entonces ellos te responden con Json 443 00:28:01,180 --> 00:28:03,980 con mucha más información de la que tú podrías necesitar. 444 00:28:04,140 --> 00:28:08,559 Esta librería en concreto te lo convierte en pocos con los que tú puedes trabajar fácilmente 445 00:28:08,559 --> 00:28:13,599 en tu código para no tener que desrealizar el objeto, hacer clases que luego se tienen que mantener 446 00:28:13,599 --> 00:28:18,029 o comentar y eso. ¿Alguna otra pregunta? 447 00:28:20,890 --> 00:28:39,299 ¿Creéis que si metéis un usuario y... 448 00:28:39,299 --> 00:28:40,079 no, o sea, la cosa 449 00:28:40,079 --> 00:28:43,000 en el caso de que tú intentes 450 00:28:43,000 --> 00:28:44,900 por ejemplo navegar a la página 451 00:28:44,900 --> 00:28:46,720 del perfil, si no está logueado 452 00:28:46,720 --> 00:28:47,359 de ninguna manera 453 00:28:47,359 --> 00:28:50,319 a la hora de verificar el token, etcétera 454 00:28:50,319 --> 00:28:52,339 si no está ahí 455 00:28:52,339 --> 00:28:54,920 no puede comprobarlo, redirige a la pantalla 456 00:28:54,920 --> 00:28:57,140 del login para que te logues 457 00:28:57,140 --> 00:28:58,759 la del login, no la de registrarse 458 00:28:58,759 --> 00:29:00,660 efectivamente, al login 459 00:29:00,660 --> 00:29:02,019 porque tú puedes tener una cuenta 460 00:29:02,019 --> 00:29:04,279 principalmente porque también el autologout 461 00:29:04,279 --> 00:29:07,220 está redirigido al mismo sitio 462 00:29:07,220 --> 00:29:11,970 Preguntas, comentarios 463 00:29:11,970 --> 00:29:13,829 viendo lo que aparece ahí 464 00:29:13,829 --> 00:29:15,849 yo diría, a cambio de nada 465 00:29:15,849 --> 00:29:18,089 podéis haber pillado una IP elástica 466 00:29:18,089 --> 00:29:20,130 Sí, sí, es elástica esta, de hecho 467 00:29:20,130 --> 00:29:21,869 es fija, es la misma 468 00:29:21,869 --> 00:29:29,029 Sí, de hecho 469 00:29:29,029 --> 00:29:29,970 en un principio 470 00:29:29,970 --> 00:29:33,130 usamos un servicio 471 00:29:33,130 --> 00:29:34,250 que se llama Bercel 472 00:29:34,250 --> 00:29:37,210 lo que pasa es que funciona por rutas 473 00:29:37,210 --> 00:29:37,890 HTTPS 474 00:29:37,890 --> 00:29:39,309 entonces 475 00:29:39,309 --> 00:29:43,069 se nos echó el tiempo encima para cambiar todo el sistema 476 00:29:43,069 --> 00:29:43,769 HTTPS 477 00:29:43,769 --> 00:29:57,769 De hecho la ruta estaba puesta como fitness tracker offalvercel.com y se nos echó porque a la hora de conectar con el AWS, si no era una petición de tipo HTTPS, no se negaba el servicio. 478 00:29:58,150 --> 00:30:05,890 Entonces tuvimos que crear una máquina en EC2 para alojar todo el sistema de web. Ya no nos da tiempo al DNS. 479 00:30:05,890 --> 00:30:28,509 Vale. Otra de las cosas, la cantidad de datos que esté moviendo el cliente, no sé si en algún momento, pues no lo he visto en el código, no sé si hacéis las peticiones a las bases de datos de forma reactiva, volvéis a los controladores utilizando programación reactiva para que luego… 480 00:30:28,509 --> 00:30:32,349 En mi caso utilizo corrutinas para hacer las llamadas a Retrofit y a… 481 00:30:32,349 --> 00:30:36,470 Y estáis atacando a la base de datos de manera reactiva y el controlador también. 482 00:30:37,269 --> 00:30:39,509 No, se ataca directamente. 483 00:30:40,029 --> 00:30:47,150 O sea, la versión que estáis utilizando de Mongo es una versión que nos está permitiendo atacar de manera reactiva al controlador. 484 00:30:48,410 --> 00:30:57,650 El driver que utilizáis es el que os deja atacar a Mongo de manera reactiva y luego en los controladores estáis devolviendo flux, mono o que estáis haciendo... 485 00:30:57,650 --> 00:31:06,170 No, estamos devolviendo en los controladores lo que devolvemos en Spring Boot, porque a lo mejor no me ha dado tiempo de explicar esto con más en detalle. 486 00:31:07,269 --> 00:31:21,549 En la parte de SpringMobile lo que hacemos es, llega una petición en un cuerpo y lo que hacemos es redirigir la petición a los servicios, los servicios atacan a la base de datos pero lo que devolvemos al final al cliente es un response entity. 487 00:31:21,549 --> 00:31:38,460 Las venéis y teniendo las corrutinas preparadas, cambiáis el respondente tipo de un flojo y un mono y os tira como un cañón. 488 00:31:38,900 --> 00:31:47,140 Y luego, finalmente, es simplemente decirlo para que cuando tengáis un hueco libre, echéis un vistazo a Casandra. 489 00:31:48,319 --> 00:31:54,119 Toda esta historia que tenéis montada me parece súper interesante, hay mucho dato por medio 490 00:31:54,119 --> 00:31:59,900 y Casandra os va a permitir que vayáis enganchando datos desde cualquier sitio 491 00:31:59,900 --> 00:32:03,519 que después podáis absorber, independientemente de cómo os ven al dato. 492 00:32:04,480 --> 00:32:08,019 Os viene genial porque respecto a la parte de la dieta, 493 00:32:09,400 --> 00:32:13,619 Mercadona tiene una API donde podéis enganchar directamente vuestra dieta 494 00:32:13,619 --> 00:32:16,660 a los productos de Mercadona y tenéis la lista de la compra hecha. 495 00:32:17,940 --> 00:32:21,599 Es decir, que ahí tenéis un conjunto de cosas que cuando tenéis una... 496 00:32:21,599 --> 00:32:25,220 cuando tengáis un huequecito 497 00:32:25,220 --> 00:32:27,019 simplemente una recomendación 498 00:32:27,019 --> 00:32:29,359 es echar un vistazo 499 00:32:29,359 --> 00:32:30,359 a lo que es Cash Pandera 500 00:32:30,359 --> 00:32:32,500 que os puede abrir a algún mundo 501 00:32:32,500 --> 00:32:38,589 además, buen trabajo, me ha gustado mucho 502 00:32:38,589 --> 00:32:41,390 no sé si hay alguna otra pregunta 503 00:32:41,390 --> 00:32:44,910 muchas gracias 504 00:32:44,910 --> 00:32:46,029 a vosotros 505 00:32:46,029 --> 00:32:52,390 muy bien 506 00:32:52,390 --> 00:33:04,579 Queda uno 507 00:33:04,579 --> 00:33:10,480 Si pasa a subir a buscarse 508 00:33:10,480 --> 00:33:12,140 Hacemos una parada 509 00:33:12,140 --> 00:33:13,480 Vale, pues lo preparan 510 00:33:13,480 --> 00:33:14,279 Sí, vale 511 00:33:14,279 --> 00:33:19,019 O si queréis ir a tomar un café 512 00:33:19,019 --> 00:33:21,299 Son las seis 513 00:33:21,299 --> 00:33:23,420 ¿Y estos chicos los dejamos ahí plantados? 514 00:33:23,859 --> 00:33:25,279 No, pues lo preparan y eso viene 515 00:33:25,279 --> 00:33:28,019 No, ya casi me parece que todavía no hay tiempo 516 00:33:28,019 --> 00:33:29,960 Si te hacéis un poco de tiempo ir al baño 517 00:33:29,960 --> 00:33:30,720 ¿Eh? 518 00:33:30,720 --> 00:33:31,460 Sí, sí, sí. 519 00:33:31,500 --> 00:33:33,940 Sí, vete, vete, aquí tienes que venir bajado, ¿eh? 520 00:33:34,220 --> 00:33:34,619 Vale, vale. 521 00:33:35,359 --> 00:33:36,980 No me veas, no, aquí bailando.