DevLinks

Imagen del proyecto DevLinks desde una laptop

Tecnologías

Descripción

DevLinks es una aplicación que permite a los desarrolladores crear páginas de enlaces personalizadas de manera rápida y sencilla. Estas páginas facilitan la presentación de perfiles, proyectos y otras plataformas en un solo lugar, optimizando la presencia en línea de los profesionales. La aplicación ofrece plantillas personalizables y una interfaz intuitiva, lo que permite a los usuarios diseñar páginas atractivas sin necesidad de conocimientos avanzados en desarrollo web.

Rol y responsabilidades

En este proyecto, me encargué de la implementación del frontend, asegurando la selección adecuada de dependencias y definiendo una arquitectura óptima para la escala del proyecto. También gestioné la interactividad y la experiencia de usuario para ofrecer una interfaz intuitiva y eficiente.

Además, desarrollé una API aplicando una arquitectura bien estructurada, optimizando el manejo de datos en el servidor y garantizando su correcta persistencia. Esto permitió una comunicación eficiente entre el frontend y el backend, asegurando un rendimiento óptimo y una experiencia fluida para el usuario.

Imagen de la aplicación en dispositivos móviles
Imagen de la aplicación en navegador web

Proceso de desarrollo

Al comenzar el proyecto, mi primer objetivo fue desglosar su lógica. Para ello, utilicé la herramienta Excalidraw, donde primero definí las entidades y documentos clave. Luego, analicé las opciones de autenticación, evaluando el uso de sesiones o tokens para determinar la mejor estrategia de seguridad.

Después, diseñé un diagrama de flujo que representaba el manejo de datos desde la interfaz hasta su interacción con el backend, asegurando un flujo eficiente y bien estructurado. Con base en este análisis, seleccioné las tecnologías más adecuadas y procedí a estudiar su documentación e investigar a fondo sobre su implementación óptima.

Desafíos y soluciones

Uno de los desafíos durante el desarrollo fue la validación de los JWT, ya que no existe una forma nativa de invalidar un token que un usuario ya no debería poseer. Para solucionar esto, era necesario implementar un middleware que verificara el token antes de autenticar al usuario o concederle permisos.

Tras investigar y analizar diferentes enfoques, decidí desarrollar un middleware encargado de validar los tokens. Sin embargo, surgió el problema de gestionar tokens que, aunque técnicamente válidos, no debían seguir siéndolo debido a la emisión de nuevos tokens mediante el refresh token. Para ello, consideré dos estrategias: blacklist y whitelist. Finalmente, opté por la whitelist, ya que permitía un control más eficiente sin saturar la base de datos y manteniendo el concepto de staleness de los tokens.

Tras investigar y analizar diferentes enfoques, decidí desarrollar un middleware encargado de validar los tokens. Sin embargo, surgió el problema de gestionar tokens que, aunque técnicamente válidos, no debían seguir siéndolo debido a la emisión de nuevos tokens mediante el refresh token. Para ello, consideré dos estrategias: blacklist y whitelist. Finalmente, opté por la whitelist, ya que permitía un control más eficiente sin saturar la base de datos y manteniendo el concepto de staleness de los tokens.

Otro desafío que enfrenté fue implementar la persistencia de datos en el lado del cliente para evitar llamadas innecesarias hacia la API. El problema principal era cómo vincular los valores de mi estado global con los almacenados en el localStorage y garantizar que ambos se mantuvieran sincronizados.

Después de investigar y revisar la documentación de las tecnologías utilizadas para gestionar el estado, pude encontrar la solución adecuada para lograr la sincronización entre el estado global y el localStorage, optimizando así la eficiencia y reduciendo la dependencia de las llamadas a la API.

Lecciones aprendidas

Este proyecto me permitió afianzar el uso de buenas prácticas al escribir código y mantenerme informado sobre arquitectura de software, patrones de diseño y metodologías de desarrollo. Además, me ayudó a desarrollar un mayor nivel de análisis en cuanto a la mejor forma de abordar y solucionar problemas.

Considero que este proyecto me enseñó mucho sobre cómo funcionan las distintas partes de una aplicación, desde el frontend hasta cómo modelar y gestionar el diseño de una base de datos. Aprendí también la importancia de un buen entendimiento y colaboración entre cada componente del sistema, ya que esto facilita la resolución de problemas específicos de manera más eficiente y óptima.