| Nombre |
|---|
| Diego Alexis Gil Rojas |
| Marco Apolinario Lainez |
| David Huette Ospino |
| Anel Rojas Martinez |
- Introducción
- Identificación del Problema o Necesidad
- Descripción de la Solución
- Modelo de Entidades
- Testing y Manejo de Errores
- Medidas de Seguridad Implementadas
- Eventos y Asincronía
- GitHub
- Conclusión
- Apéndices
- Facilitar la conexión entre clientes y restaurantes en una misma zona.
- Permitir que los usuarios puedan ver menús, precios y disponibilidad de platos en tiempo real.
- Ofrecer a los restaurantes una plataforma para gestionar sus menús, recibir reseñas y responder a las críticas de los clientes.
- Fomentar la interacción entre restaurantes y clientes mediante un foro de comentarios.
- Crear un sistema de evaluación de restaurantes por parte de los usuarios, permitiendo calificaciones de 1 a 5 estrellas.
En un entorno donde las opciones para comer son cada vez más diversas y donde la gente busca experiencias de comida cercanas y accesibles, surge la necesidad de conectar a los clientes con los restaurantes locales de una manera simple y eficiente.
Plateful busca ser una solución tanto para los clientes que desean descubrir los mejores restaurantes cercanos a su ubicación, como para los restaurantes que desean ofrecer sus menús y recibir retroalimentación directa de sus clientes. La plataforma permitirá a los usuarios evaluar y comentar sobre los restaurantes, así como a los restaurantes gestionar su oferta gastronómica de forma dinámica.
Con la creciente oferta de restaurantes y opciones de comida, las personas a menudo no tienen la información suficiente para elegir dónde comer, basándose en criterios como proximidad, menú y opiniones de otros clientes.
Por otro lado, muchos restaurantes carecen de una plataforma fácil de usar para compartir su oferta actualizada y recibir retroalimentación. Plateful ofrece una solución a ambos problemas, conectando a clientes y restaurantes en una misma aplicación.
- Registro de usuarios: Los clientes y restaurantes podrán registrarse en la plataforma seleccionando su rol.
- Localización geográfica: Los usuarios podrán visualizar los restaurantes cercanos a su ubicación actual, que estén registrados en la app.
- Visualización de menús: Los restaurantes podrán subir sus menús, con precios y disponibilidad de platos actualizados en tiempo real.
- Evaluación de restaurantes: Los clientes podrán puntuar los restaurantes de 1 a 5 estrellas después de cada visita.
- Foro de comentarios: Los restaurantes podrán interactuar con los clientes respondiendo a sus críticas o agradeciendo sus reseñas.
- Gestión de restaurantes: Los restaurantes tendrán una sección para gestionar sus menús, horarios y precios.
Nuestro proyecto emplea una arquitectura modular y escalable, organizada en capas distintas que encapsulan funcionalidades específicas como:
- Gestión de entidades, controladores y repositorios
- Objetos de transferencia de datos (DTO)
- Manejo eventos e implementación de seguridad
A continuación, se describen las tecnologías utilizadas:
- Lenguaje de Programación: Java
- Frameworks y Librerías:
- Spring Boot: Para el desarrollo del backend.
- Herramientas de Persistencia:
- Spring Data JPA: Para la gestión de la persistencia.
- Base de Datos:
- PostgreSQL: Base de datos robusta y escalable.
- Entorno de Desarrollo:
- Maven: Para la gestión de dependencias.
- Control de Versiones:
- Git: Para el control de versiones del código.
- GitHub: Repositorio para la colaboración y gestión del código.
- API Externas:
- API de Google Maps: Utilizada para la ubicacion de los usuarios.
-
Usuario:
- Clientes o dueños
- Posee un
id(PK) al momento del registro - Solicita un
nombre,correo, unacontraseñay elrol.
-
Restaurante:
- Se selecciona al registrarse como dueños
- Posee un
id(PK) - Al momento del registro pedirá un
nombre_restaurante, laubicación,horario de atencióny elpropietario(FK de Usuario) - Se solicitará una
cartay cada restaurante podrá recibir unareseñajunto concomentarios.
-
Reseña:
- Establecida por un usuario de tipo cliente
- Se expresa en una
calificacióndel 1 al 5 (representada por estrellas) - Posee un
id_reseña(PK) y es establecida por unid_usuario(FK) y repercute en unid_restaurante(FK) - También se establece una media de calificación entre la cantidad de usuarios que califiquen.
-
Carta:
- Espacio para la gestión y visibilidad de
Platos - El dueño crea su propia carta que posee un
idúnico (id_cartaPK) - Se le podrá agregar un
nombrey suúltima fecha de actualización.
- Espacio para la gestión y visibilidad de
-
Plato:
- Dependiendo de la carta creada (
id_cartaFK Carta), se agregarán los platos que hay en la misma - Los platos tendrán un
idúnico (id_plato) - Se le podrá asignar un
nombreal plato - También se crea un atributo
disponibilidad(para saber si aún no se ha acabado el plato).
- Dependiendo de la carta creada (
-
Comentarios:
- Entidad creada para que el
Usuariopueda dejar sus comentarios en algunaReseña - Cada comentario será guardado con un
idúnico - Tendrán su
contenidoy lafecha de publicación.
- Entidad creada para que el
id_usuario(PK)fecha_nacimientonombrecorreocontraseñatelefono
id_ubicacionlatitudlongitudciudaddireccionCompletacodigoPostal
Usuario.id_usuario(PK FK aid_usuario)ubicacionActual(FK aid_ubicacion)
Usuario.id_usuario(PK FK)tipoDocumentonumeroDocumentofotoPerfil
id_restaurante(PK)nombre_restauranteubicaciónhorariopropietario(FK de aPropietario.id_usuario)tipoRestaurante(Menú/Chifa/Comida Rápida/etc.)calificación_promedio
id_reseña(PK)calificación(1 a 5 estrellas)id_usuario(FK deCliente.id_usuario)id_restaurante(FK deRestaurante)fecha
id_carta(PK)id_restaurante(FKRestaurante)nombrefecha_actualizacion
id_plato(PK)id_carta(FKCarta)nombrepreciodisponibilidad
id_comentario(PK)id_reseña(FKReseña)id_usuario(FKCliente.id_usuario)contenidofecha
- Cada Cliente tiene un sola ubicacion: Relacion de many-to-one, con participacion total, entre
ClienteyUbicaciondondeid_ubicaciones FK enCliente. - Cada Restaurante tiene una o mas ubicaciones: Relacion many-to-many, con participacion total, entre
RestauranteyUbicaciondonde dondeid_ubicaciones FK enRestaurante. - Un Usuario puede ser Cliente o Propietario: Se manejan a través de una herencia de clases donde
id_usuarioes PK y FK en las dos entidades. - Un Restaurante pertenece a un solo Propietario: Relación many-to-one entre
PropietarioyRestaurantedonde existe un participacion total entre cada uno. - Un Restaurante tiene sola una carta: Relación one-to-one entre
RestauranteyCartadondeid_restaurantees FK enCarta. - Un Menú tiene varios Platos: Relación one-to-many entre
CartayPlatodondeid_cartaes FK enPlato. - Un Usuario puede hacer varias reseñas de diferentes Restaurantes: Relación one-to-many entre
ClienteyReseñadondeCliente.id_usuarioes FK enReseña. - Un Restaurante puede recibir varias reseñas de diferentes Usuarios: Relación one-to-many entre
RestauranteyReseñadondeid_restaurantees FK enReseña. - Una Reseña puede tener varios Comentarios: Relación one-to-many entre
ReseñayComentariodondeid_reseñaes FK enComentario. - Un Usuario puede hacer varios Comentarios en diferentes Reseñas: Relación one-to-many entre
ClienteyComentariodondeCliente.id_usuarioes FK enComentario.
Para garantizar la calidad del software desarrollado, se implementaron varios niveles de pruebas en Plateful:
Pruebas Unitarias: Se probaron las funcionalidades individuales, como la creación de usuarios y la actualización de menús, para asegurar que cada componente funcione correctamente de forma aislada. Pruebas de Integración: Se verificó la interacción entre módulos, como la comunicación entre el backend (Spring Boot) y la base de datos (PostgreSQL), garantizando que las consultas y actualizaciones se realicen sin errores. Pruebas de Sistema: Se ejecutaron pruebas end-to-end (E2E) para validar el funcionamiento completo de la aplicación, desde el registro de usuarios hasta la publicación de comentarios y reseñas. Pruebas de Aceptación: Se realizaron pruebas con usuarios simulados para asegurar que el sistema cumple con las expectativas y requisitos establecidos en el proyecto. Pruebas de Seguridad: Se llevaron a cabo pruebas para verificar la protección contra inyección SQL, XSS y CSRF, asegurando que la aplicación sea robusta frente a ataques comunes.
Durante las pruebas realizadas se identificaron los siguientes resultados:
Errores Detectados y Corregidos: Se encontraron fallos en la gestión de tokens de sesión que inicialmente permitían accesos no autorizados; este problema se resolvió ajustando la configuración del sistema de autenticación JWT. Validación de Funcionalidades: Las pruebas unitarias confirmaron el correcto funcionamiento de las funcionalidades básicas, como la creación de cartas y la gestión de menús por parte de los propietarios. Rendimiento Optimizado: Las pruebas de integración revelaron demoras en las consultas SQL, lo que motivó la optimización de índices en la base de datos para mejorar el rendimiento. Pruebas de Aceptación Exitosas: Los usuarios simulados validaron que la navegación entre secciones sea intuitiva y que las acciones principales (como dejar reseñas) sean fluidas. Seguridad Verificada: Las pruebas de seguridad confirmaron que no es posible explotar vulnerabilidades comunes, garantizando la protección de los datos de los usuarios y restaurantes.
El manejo de errores en Plateful se implementó para garantizar una experiencia fluida y predecible para los usuarios, incluso en situaciones imprevistas. Se utilizaron las siguientes estrategias:
Excepciones Globales: Se configuró un controlador global para manejar excepciones comunes, como ResourceNotFoundException y InvalidDataException, proporcionando respuestas claras y estandarizadas. Mensajes de Error Personalizados: Los errores se comunican al usuario de manera amigable y comprensible, evitando mensajes técnicos que puedan causar confusión. Registro de Errores (Logging): Todos los errores críticos se registran en logs detallados, facilitando la detección y resolución de problemas en producción. Redirección Automática: En caso de fallos, los usuarios son redirigidos a una página de error personalizada o se les solicita repetir la acción fallida, minimizando la interrupción en la experiencia de uso. Manejo de Excepciones en Asincronía: Las acciones asíncronas (como el envío de correos) cuentan con controladores que registran errores y vuelven a intentar el proceso en caso de fallos temporales.
Para garantizar la protección de la información de los usuarios y los restaurantes registrados en Plateful, se implementaron las siguientes técnicas de seguridad:
Cifrado de Contraseñas: Todas las contraseñas se almacenan en la base de datos utilizando algoritmos de hash como BCrypt, evitando el almacenamiento de texto plano y mitigando riesgos en caso de fuga de datos. Autenticación Basada en Tokens (JWT): Cada usuario autenticado recibe un token que se utiliza para validar las sesiones activas de manera segura y sin necesidad de almacenar información sensible en el servidor. Control de Acceso: Se configuraron roles diferenciados (usuario y propietario), permitiendo una gestión de permisos adecuada para que cada perfil acceda solo a las funcionalidades relevantes. Uso de HTTPS: Todo el tráfico entre la aplicación y los usuarios está protegido mediante HTTPS, evitando la exposición de datos sensibles en redes públicas. Gestión de Sesiones: Se implementaron tiempos de expiración de sesiones para usuarios inactivos y políticas de cierre de sesión automático, evitando accesos no autorizados.
Plateful adoptó una serie de prácticas para mitigar las vulnerabilidades más comunes en aplicaciones web, asegurando un entorno seguro para todos los usuarios:
Protección contra Inyección SQL: Se utilizó Spring Data JPA con consultas parametrizadas, evitando la inyección de código malicioso en las bases de datos. Mitigación de Ataques XSS (Cross-Site Scripting): La plataforma valida y escapa los contenidos ingresados por los usuarios en campos de texto (como reseñas y comentarios), evitando que se ejecuten scripts maliciosos en los navegadores de otros usuarios. Prevención de Ataques CSRF (Cross-Site Request Forgery): Se implementaron tokens CSRF para proteger las acciones sensibles de los usuarios autenticados, garantizando que cada solicitud provenga de una fuente legítima. Validación de Datos en el Backend: Se aseguraron controles estrictos para validar los datos recibidos desde el frontend, evitando el ingreso de información no deseada o dañina. Límites en Intentos de Inicio de Sesión: Para prevenir ataques de fuerza bruta, se establecieron límites de intentos fallidos de inicio de sesión, bloqueando temporalmente la cuenta después de varios intentos consecutivos. Monitorización de Actividad: Se añadieron registros (logs) de actividad en el sistema para detectar comportamientos anómalos y responder rápidamente a posibles incidentes de seguridad.
Para el projecto usamos los siguientes eventos:
SendMailEvent: Implementamos un evento que se manda cada vez que el usuario se registra para que el EmailListener lo escuche y pueda ejecutar la accion con asincronía. De esta manera la respuesta demora menos y el correo llega cuando el servicio del backend termine de ejecutar la instruccion.
EmailListener: Implementamos un EmailListener para que escuche cada vez que se registre un Usuario se registre en la plataforma y mandarle un aviso de confirmacion.
Describir la manera en que se usó GitHub projects (asignación de issues, deadlines, etc) Emplemos Githu Projects de manera que a la mayoria de pull request se les asignaba un issue correspondiente. Tambien implementamos la asignacion correspondiente de cada pull request y cada issue. Por ultimo, nos aseguramos de que no se pueda forzar el merge y que quien hacia pull request debia verificar que el merge sea posible y efectivo.
Usamos Github Actions para implementar el deployment de todos los push que se hagan en el repositorio a traves del deploy.yml y a traves de establecer variables de entorno en los settings de Github.
Plateful logró conectar eficientemente a clientes con restaurantes locales mediante una plataforma accesible, cubriendo las siguientes necesidades clave:
Facilitar la toma de decisiones al permitir a los usuarios acceder a menús y reseñas en tiempo real, ahorrando tiempo al buscar opciones para comer. Apoyar la gestión de restaurantes, proporcionando herramientas para actualizar menús, recibir reseñas y responder a comentarios. Fomentar la interacción entre usuarios y restaurantes a través de un sistema de reseñas y comentarios bidireccionales, promoviendo una experiencia colaborativa. Implementación de funcionalidades críticas, como localización geográfica y disponibilidad en tiempo real, que agilizan la experiencia del usuario final. Desarrollo modular y seguro mediante la integración de tecnologías modernas como Spring Boot, PostgreSQL, y la API de Google Maps para escalabilidad y persistencia de datos.
El desarrollo de Plateful dejó aprendizajes significativos, entre ellos:
Colaboración efectiva con herramientas de GitHub, integrando GitHub Projects y Actions para gestionar y automatizar el flujo de trabajo. Manejo de eventos asincrónicos, aprendiendo la importancia de la asincronía en sistemas donde múltiples usuarios interactúan simultáneamente. Seguridad en aplicaciones web, con la implementación de medidas contra inyección SQL, XSS y CSRF, así como autenticación robusta para proteger datos sensibles. Optimización del diseño modular, logrando una arquitectura escalable, que facilita futuras integraciones y mantenimiento del backend. Interacción usuario-restaurante efectiva, con la experiencia de usuarios y propietarios moldeando el desarrollo para maximizar la usabilidad.
Para potenciar Plateful y mantener su relevancia, se sugiere:
Desarrollo de una aplicación móvil nativa, mejorando la accesibilidad y brindando notificaciones en tiempo real. Implementación de IA para recomendaciones personalizadas, utilizando datos de preferencias y comportamiento para sugerir restaurantes. Integración con sistemas de pago online, permitiendo reservas y pagos directamente desde la plataforma. Ampliación del sistema de reseñas mediante la incorporación de imágenes y reseñas multimedia para enriquecer las opiniones de los clientes. Expansión geográfica para incluir más ciudades y colaborar con nuevos restaurantes, aumentando la base de usuarios. Optimización del SEO y marketing digital, impulsando el posicionamiento de la plataforma y captando más clientes y restaurantes.
Este projecto esta bajo la lincencia de GNU General Public License v3.0.
Ayuda para el Deployment: https://github.com/CS2031-DBP/aws/blob/main/docs/05-ecs-ecr-rds.md

