Proyecto 6 - Proyecto LFG Web App con Laravel - Semanas 11 y 12
Backend de una Gameroom, por Andrés Labat, Vincenzo Donnarumma y Bienvenida Ladrón.
Desarrollado como parte del Bootcamp de Full Stack Developer de Geekshubs Academy.
_______________________________________________
Gameroom backend es un proyecto que recrea el backend de una gameroom utilizando php, laravel, mySQL, GIT y GitHub. Este proyecto incluye una base de datos relacional, así como diversos endpoints que te permiten registrarte, hacer login, acceder a la información almacenada en las tablas, e incluso actualizarla y borrarla.
📋 Apartados
- 🚀 Introducción
- 🎯 Descripción del proyecto
- 🏗️ Diseño de la DDBB
- 🔚 Endpoints
- 🔧 Tecnologías utilizadas
- 🚀 Deploy
- 🍃 Ramas del repositorio
- 🚧 Problemas y soluciones
- 📁Importar endpoints con thunder
- 📦 Instrucciones dockerización
- 🌐 Enlaces importantes
- ⚖️ Licencia
- 🤝 Como contribuir
- 📧 Contacto
- 👏 Agradecimientos
🚀 El planteamiento para desarrollar este proyecto consiste en desarrollar una estructura Backend completa (DDBB+PHP+Laravel) para una aplicación web LFG (Looking for Group), que permita a los empleados contactar entre ellos para formar grupos y jugar videojuegos como actividad de ocio afterwork.
🎯 Dada la situación sanitaria y el trabajo remoto, la empresa desea mejorar la interacción entre los empleados. La primera fase del proyecto es crear una aplicación web LFG que permita a los usuarios registrarse, autenticarse, crear y unirse a partidas de videojuegos, así como intercambiar mensajes en un chat común. El objetivo es fomentar la socialización y compartir momentos de ocio.
🏗️ Se establece que solo hay un rol por usuario, y que este es el que le da los privilegios para poder usar unos endpoints determinados u otros.
🔚 Estos son los endpoints de los que consta el proyecto, clasificados en base a la tabla a la que hacen referencia.
- Descripción: Registra un nuevo usuario.
- Acceso: Público.
- Validaciones: Verifica la validez del nombre, apodo, correo electrónico, contraseña y foto del usuario.
-
Registrar Usuario
POST <http://localhost:8000/api/register>Payload:
{ "name": "Nombre del Usuario", "nickname": "Apodo del Usuario", "email": "correo@ejemplo.com", "password": "contraseña", "photo": "url_de_la_foto" }
-
- Descripción: Inicia sesión de un usuario existente.
- Acceso: Público.
- Validaciones: Verifica la validez del correo electrónico y la contraseña del usuario.
-
Iniciar Sesión
POST <http://localhost:8000/api/login>Payload:
{ "email": "correo@ejemplo.com", "password": "contraseña" }
-
- Descripción: Obtiene el perfil del usuario autenticado.
- Acceso: Solo para usuarios autenticados.
-
Obtener Perfil
GET <http://localhost:8000/api/profile>
-
- Descripción: Cierra la sesión del usuario autenticado.
- Acceso: Solo para usuarios autenticados.
-
Cerrar Sesión
POST <http://localhost:8000/api/logout>
-
- Descripción: Actualiza el perfil del usuario autenticado.
- Acceso: Solo para usuarios autenticados.
-
Actualizar Perfil
POST <http://localhost:8000/api/user>Payload:
{ "name": "Nuevo Nombre", "nickname": "Nuevo Apodo", "email": "nuevo_correo@ejemplo.com", "password": "nueva_contraseña", "photo": "nueva_url_de_la_foto" }
-
- Descripción: Elimina el usuario autenticado.
- Acceso: Solo para usuarios autenticados.
-
Eliminar Usuario
DELETE <http://localhost:8000/api/user>
-
- Descripción: Obtiene todos los juegos.
- Acceso: Público.
-
Obtener Todos los Juegos
GET <http://localhost:8000/api/games>
-
-
Descripción: Obtiene un juego específico por su ID.
-
Acceso: Público.
- Obtener Juego por ID
GET <http://localhost:8000/api/game/{id}>
- Descripción: Obtiene una sala por su ID.
- Acceso: Solo para usuarios autenticados.
-
Obtener Sala
GET <http://localhost:8000/api/room/{id}>
-
- Descripción: Crea una nueva sala.
- Acceso: Solo para usuarios autenticados.
-
Crear Sala
POST <http://localhost:8000/api/room>Payload:
{ "name": "Nombre de la Sala", "game_id": "ID del Juego" }
-
- Descripción: Actualiza una sala existente.
- Acceso: Solo para usuarios autenticados y propietarios de la sala.
-
Actualizar Sala
PUT <http://localhost:8000/api/room/{id}>Payload:
{ "name": "Nuevo Nombre de la Sala", "game_id": "Nuevo ID del Juego" }
-
-
Descripción: Elimina una sala existente.
-
Acceso: Solo para usuarios autenticados y propietarios de la sala.
DELETE <http://localhost:8000/api/room/{id}>
- Descripción: Obtiene los miembros de una sala por su ID.
- Acceso: Solo para usuarios autenticados y miembros de la sala.
- Obtener Miembros de la Sala
GET <http://localhost:8000/api/members-room/{id}>
- Descripción: Obtiene las salas del usuario autenticado.
- Acceso: Solo para usuarios autenticados.
- Obtener Salas del Usuario
GET <http://localhost:8000/api/rooms-user>
-
Descripción: Eliminar un usuario a una sala existente.
-
Acceso: Solo para usuarios autenticados y propietarios de la sala.
-
Añadir usuario
DELETE <http://localhost:8000/api/room-user>Payload:
{ "user_id": "Número de user_id", "room_id": "Número de room_id" }
-
Descripción: Añadir un usuario a una sala existente.
-
Acceso: Solo para usuarios autenticados y propietarios de la sala.
-
Añadir usuario
POST <http://localhost:8000/api/room-user>Payload:
{ "user_id": "Número de user_id", "room_id": "Número de room_id" }
-
Descripción: Crear un nuevo mensaje a un chat existente.
-
Acceso: Solo para usuarios autenticados e integrantes de la sala.
POST <http://localhost:8000/api/message>Payload:
{ "room_id": 1, "message":"Mensaje que quieras introducir" }
-
Descripción: Obtiene los mensajes de un chat existente.
-
Acceso: Solo para usuarios autenticados e integrantes de la sala.
GET <http://localhost:8000/api/messages>Payload:
{ "room_id": 1 }
-
Descripción: Elimina un mensaje seleccionado.
-
Acceso: Solo para usuarios autenticados e integrantes de la sala.
DELETE <http://localhost:8000/api/messages>Payload:
{ "room_id": 1 , "message": "Mensaje a eliminar" }
-
Descripción: Actualiza un mensaje seleccionado.
-
Acceso: Solo para usuarios autenticados e integrantes de la sala.
PUT <http://localhost:8000/api/message>Payload:
{ "room_id":11, "message": "Mensaje actual", "newMessage": "Nuevo mensaje" }
-
Descripción: Crea un nuevo juego en la tabla.
-
Acceso: Solo para usuarios autenticados como super_admin.
POST <http://localhost:8000/api/game>Payload:
{ "name":"Zelda", "category":"adventure" }
-
Descripción: Actualiza un juego en la tabla.
-
Acceso: Solo para usuarios autenticados como super_admin.
PUT <http://localhost:8000/api/game/{id}>Payload:
{ "name":"Nombre del juego", "category":"adventure", "user_id":13 }
-
Descripción: Actualiza un juego en la tabla.
-
Acceso: Solo para usuarios autenticados como super_admin.
DELETE <http://localhost:8000/api/game/{id}>
-
Descripción: Obtiene todas las salas existentes.
-
Acceso: Solo para usuarios autenticados como super_admin.
GET <http://localhost:8000/api/rooms>
-
Descripción: Obtiene todos los ususarios de la aplicación.
-
Acceso: Solo para usuarios autenticados como super_admin.
GET <http://localhost:8000/api/rooms>
🔧 Tecnologías
-
Php: es el lenguaje de programación sobre el que se han montado el servidor y los distintos endpoints.
-
Laravel: Diseñado para facilitar y agilizar el desarrollo de aplicaciones web, Laravel sigue el patrón de arquitectura MVC (Modelo-Vista-Controlador) y ofrece numerosas características y herramientas que permiten a los desarrolladores crear aplicaciones robustas y escalables de manera eficiente..
- MySQL: Es el sistema de gestión de bases de datos sobre el que se han construido las tablas en SQL.
🚀 Por el momento su único uso es en local, en el futuro se realizará el deploy.
🍃 Este proyecto se ha desarrollado en las siguientes ramas:
1.- Master: considerada como la rama principal, en ella únicamente se ha iniciado y finalizado el proyecto para poder hacer el deploy.
2.- Dev: es la rama sobre la que pivotan todas las features.
3.- Middleware: aquí procedimos a la creación de los middlewares necesarios para la aplicación, en este caso IsSuperAdmin y el Auth:Sanctum.
4.- UserController: contiene la creación y testeo de todos los endpoints del usuario.
5.- GameController: compuesta por los commits que hacen referencia a los endpoints de la tabla "games".
6.- MessageController: abarca la creación y comprobación de los controladores de la tabla intermedia "messages".
7.- SuperAdminController: únicamente se han realizado aquí los endpoints a los que pueden acceder los usuarios con role super admin.
8.- Room_userController: en esta rama se crearon los controladores de la tabla "room_user"
9.- Readme: es la última rama, se creó únicamente para crear este README.
-
🚧Problema: Este error 500 nos decía que era un tipo de error de servidor y nos ocurría en practicamente todos los controladores de tablas intermedias.
- 💡Solución: Revisar los modelos y percatarnos de que no estabamos incluyendo las foreign keys en ellos, por lo que no reconocía las request como válidas, también fue importante en el caso de los endpoints de messages el revisar las importaciones de dichos modelos en el archivo api.php.
Error 500 al añadir a un miembro nuevo a una sala
2. Imposibilidad de eliminar usuarios de la tabla una vez realizados los seeders que rellenan toda la base de datos.
-
🚧Problema: Comprobando el correcto funcionamiento de los endpoints, una vez finalizados todos los controladores, nos encontramos ante un error de tipo 500 en el caso de querer eliminar un usuario de nuestra tabla principal "users".
- 💡Solución: Añadir en las migraciónes en la parte de código que hace referencia a todas las foreign keys que estas debían tener la propiedad constrained y además que pudieran realizarse los deletes en cascade.
->constrained()->onDelete('cascade')
📁 En la carpeta app/Http/EndpointsThunder encontrarás todos los archivos necesarios para poder ejecutar las rutas en Thunder, recuerda importarlo en un Thunder:
📦 Para facilitar la implementación y ejecución del proyecto, se proporcionan instrucciones de Dockerización:
-
Clonar el Repositorio:
git clone <https://github.com/AndresLabat/Project6-GameRoom.git>
-
Acceder al Directorio del Proyecto:
cd Project6-GameRoom -
Configuración de Variables de Entorno:
Crear un archivo .env basado en el ejemplo .env.example y configurar las variables de entorno necesarias.
-
Construir y Levantar Contenedores:
docker-compose up -d --build
-
Instalar Dependencias de Laravel:
docker-compose exec app composer install -
Generar Clave de Laravel:
docker-compose exec app php artisan key:generate -
Ejecutar Migraciones y Seeders:
docker-compose exec app php artisan migrate --seed -
Acceder a la Aplicación:
La aplicación estará disponible en http://localhost.
🌐 Mediante estos enlaces puedes acceder a ellos:
⚖️ Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para obtener más información.
🤝 Si deseas contribuir a este proyecto, puedes realizar un fork del repositorio en GitHub, hacer tus cambios y enviar una solicitud de extracción (pull request). Tu contribución será revisada y, si es apropiada, se fusionará con la rama principal.
-
Haz un fork de este repositorio.
-
Crea una nueva rama para tu contribución:
git checkout -b tu-nueva-caracteristica. -
Realiza tus cambios y commitea:
git commit -m "Añade una nueva característica". -
Envía tus cambios al repositorio:
git push origin tu-nueva-caracteristica. -
Crea una solicitud de extracción en GitHub.
Espero que disfrutes explorando y utilizando este backend de nuestra Gameroom. Si tienes alguna pregunta o necesitas asistencia, no dudes en ponerte en contacto con nosotros a través de la información de contacto proporcionada.
📧 Para cualquier pregunta o comentario, no dudes en ponerte en contacto:
const developer1 = "Andrés Labat";
const developer2 = "Vincenzo Donnaruma";
const developer3 = "Bienvenida Ladrón";
console.log("Desarrollado por: " + developer1 + developer2 + developer3);- Vincenzo Donnarumma
- Andrés Labat
- Bienve Ladrón
- Fecha de Comienzo del Proyecto*: 30/11/2023
👏 Agradecimentos a GeeksHubs Academy por los conocimientos que hemos podido adquirir a lo largo de todo el curso y que han hecho posible este proyecto, y a nuestros queridos profesores David Ochando y Dani Tarazona y su gran paciencia con nosotros.
¡Gracias por visitar GameRoom Backend y explorar nuestro proyecto!





