Volver a Proyectos

🍻 DrinkLegends

App social para registrar rondas en grupo con foto y competir por puntos, logros y rachas

Laravel 13 JWT PWA con push

Escala del Proyecto

42Rutas API
16Logros
4Rankings
79Archivos
6.8kLíneas

Descripción General

DrinkLegends convierte una reunión con amigos en una liga. Cada participante registra su ronda eligiendo bebida, cantidad y una foto, y eso le da puntos. Los puntos alimentan cuatro clasificaciones — semanal, mensual, anual y total — más un ranking global mundial al que se entra por decisión propia.

Alrededor de eso hay una capa de engagement diseñada para que la gente vuelva: 16 logros con barra de progreso, rachas diarias que dan bonus cada siete días, el MVP de la noche que premia automáticamente al máximo anotador del día anterior, retos semanales creados por el administrador del grupo, eventos con su propia clasificación y estadísticas avanzadas.

La parte social la completan los grupos con código de invitación de 6 caracteres, el muro con likes y comentarios, el chat con notificaciones push, el sistema de amigos y tres juegos integrados. El backend está en Laravel 13 con autenticación JWT.

Tecnologías Utilizadas


Laravel 13

PHP 8.3

firebase/php-jwt

MySQL

Web Push

PWA

PHPUnit

i18n es / en

Funcionalidades Implementadas

🔐 Autenticación

Registro y login con límite de intentos, token de acceso corto y refresh largo, con reintento automático al caducar.

👥 Grupos

Creación y acceso por código de invitación de 6 caracteres, foto de portada editable solo por quien lo creó.

🥤 Bebidas personalizadas

Cuatro bebidas por defecto más tres configurables por grupo.

📸 Rondas

Se elige bebida, se fija cantidad de 1 a 20 y se hace una foto comprimida en el cliente antes de subirla.

📰 Muro

Feed del grupo con likes, comentarios y botón de compartir nativo.

🏆 Rankings

Clasificación del grupo en semanal, mensual, anual y total, con medallas.

🌍 Ranking global

Top mundial al que se entra activando el perfil público.

⭐ MVP de la noche

El máximo anotador de cada día pasado recibe 10 puntos automáticamente.

🎖️ 16 logros

Por rondas, puntos, MVPs, rachas, amigos y grupos, cada uno con su barra de progreso.

🔥 Rachas diarias

Cuenta los días consecutivos y otorga 5 puntos de bonus en cada hito de 7 días.

📊 Estadísticas avanzadas

Gráfico de los últimos 7 días, distribución por día de la semana, hora punta y bebidas favoritas.

🎯 Retos semanales

Retos por grupo creados por su administrador, con puntos extra.

🗓️ Eventos

Eventos dentro del grupo; las rondas se etiquetan y generan una clasificación propia.

🤝 Amigos

Búsqueda por email o apodo, solicitudes, aceptación, rechazo y lista de amigos.

💬 Chat de grupo

Mensajería con notificación push a los miembros.

🎲 Juegos

Verdad o Reto en tres niveles con más de 90 preguntas en español, ruleta para elegir participante y ¿Quién es más probable? con 20 preguntas.

Arquitectura

Backend Laravel 13 con la estructura estándar del framework: controladores de API en app/Http/Controllers/Api, modelos Eloquent, servicios para la lógica que no cabe en un controlador y middleware para la validación del JWT. Las 42 rutas viven en routes/api.php.

El frontend se sirve como PWA desde public/, con su manifiesto y su service worker. Todo el esquema de base de datos está en una única migración inicial.

DrinkLegends/
├── memory/                  # PRD.md: documento de producto
├── design_guidelines.json   # sistema visual
├── test_reports/            # resultados PHPUnit y pytest
└── backend/
    ├── app/Http/Controllers/Api/
    ├── app/Models/ · app/Services/
    ├── app/Http/Middleware/  # validación JWT
    ├── routes/api.php       # 42 rutas
    ├── database/migrations/  # esquema completo
    ├── config/drinklegends.php # config propia
    └── public/              # PWA: manifest.json, sw.js

Los Cuatro Sistemas de Puntuación

  • Puntos por ronda: la base, según bebida y cantidad registrada.
  • MVP de la noche: 10 puntos automáticos al máximo anotador de cada día ya cerrado.
  • Bonus de racha: 5 puntos adicionales al completar cada ciclo de 7 días consecutivos.
  • Retos semanales: puntos extra definidos por el administrador del grupo.
  • Las cuatro fuentes alimentan los rankings semanal, mensual, anual y total, y el global para quien active su perfil público.

Seguridad Implementada

  • Rate limiting en autenticación: 10 intentos de login y 5 de registro por minuto y por IP.
  • Contraseñas con bcrypt; el cambio de contraseña exige verificar la actual.
  • Token de acceso de vida corta (60 min) más refresh token de 30 días, con reintento automático ante un 401.
  • Middleware propio de validación del JWT en todas las rutas privadas.
  • Perfil público opcional: nadie aparece en el ranking mundial sin activarlo explícitamente.
  • Compresión de imágenes en el cliente a 900 px y JPEG al 60% antes de subirlas, reduciendo tanto el peso como los metadatos.

Retos Técnicos y Decisiones de Diseño

Migrar de FastAPI y MongoDB a Laravel y MySQL

El PRD.md del proyecto define el stack original: React Native con Expo, backend FastAPI y MongoDB. La implementación acabó siendo Laravel 13 con MySQL. El motivo fue de despliegue: un backend PHP con MySQL entra en cualquier hosting compartido, mientras que FastAPI y MongoDB requieren infraestructura propia. Documentar la desviación respecto al PRD me parece más honesto que reescribir el PRD.

Fotos en base de datos, con compresión en el cliente

Las imágenes se guardan como base64 en la base de datos, lo cual no escala bien y está reconocido como limitación en el PRD. La mitigación es comprimir antes de subir: 900 px y JPEG al 60% en el navegador. La migración a un servicio de imágenes quedó deliberadamente aplazada por requerir una cuenta externa.

Diseñar para que la gente vuelva

La mecánica de puntos sola no retiene a nadie más de una semana. Los cuatro sistemas — MVP diario, rachas con hito a 7 días, 16 logros con progreso visible y ranking global — están pensados en escalas de tiempo distintas: el MVP da motivo para volver mañana, la racha para volver toda la semana, y los logros para seguir a los tres meses.

Limitaciones asumidas y escritas

El PRD deja constancia de lo que no funciona: las notificaciones push requieren una build de desarrollo o producción de Expo, y el flujo de cámara en web cae a una foto de demostración porque la cámara real es de móvil. Un proyecto que documenta sus límites es más útil que uno que finge no tenerlos.

Mi Rol

Desarrollador full stack — autor único.

Documento de producto, modelo de datos, las 42 rutas de la API, autenticación JWT con refresh, sistemas de puntuación y logros, frontend PWA e internacionalización.

Estado del Proyecto

Versión 3 funcional con todas las funcionalidades de los niveles 1 y 2 implementadas. La carpeta test_reports/ conserva los resultados de PHPUnit y pytest de tres iteraciones de prueba. Su sucesor es Pint League, una reescritura completa sobre PHP sin framework.