Volver al portfolio
caso de estudio

TurnoGo

Plataforma de reservas y gestión de negocios

TurnoGo es un SaaS listo para producción que permite a negocios de servicios gestionar turnos, clientes, personal e ingresos. Este caso de estudio recorre la arquitectura, el modelo de datos, la autenticación, el despliegue y los desafíos técnicos que resolví.

Arquitectura

El sistema separa claramente frontend, API y persistencia. React consume una API REST tipada servida por FastAPI, que se comunica con PostgreSQL para datos relacionales y con Supabase Storage para activos del negocio. Cada capa es stateless y escalable horizontalmente sobre Docker.

React + TypeScript (Frontend)
FastAPI (REST API)
JWT Authentication + RBAC
PostgreSQL (Relational DB)
Supabase Storage (Assets)
Docker + Render (Deployment)

Diseño de Base de Datos

Esquema PostgreSQL modelado alrededor del dominio — negocios, personal, servicios, turnos, clientes y bloques horarios. Pensado para multi-tenant con integridad referencial estricta.

  • Esquema normalizado con foreign keys e índices en las consultas más frecuentes.
  • Detección de conflictos a nivel de base de datos para evitar turnos superpuestos.
  • Migraciones versionadas y reproducibles entre entornos.

Autenticación (JWT)

La autenticación usa JWT con rotación de refresh tokens. Las contraseñas se hashean con un algoritmo moderno y cada endpoint protegido valida rol y scope antes de tocar la base de datos.

  • Access + refresh tokens con rotación y revocación.
  • Control de acceso por roles para admin, staff y clientes.
  • Hashing de contraseñas con KDF tipo bcrypt y rate limiting en login.

Despliegue (Docker)

API y frontend se empaquetan con Docker y se despliegan en Render. La configuración se inyecta en runtime, las imágenes son reproducibles y los rollouts son sin downtime. El storage vive en Supabase.

Diseño de API

Endpoints REST orientados a recursos, con versionado claro, respuestas de error consistentes y documentación OpenAPI generada automáticamente por FastAPI. Paginación, filtros y validación se manejan con Pydantic.

Desafíos y Soluciones

Evitar conflictos de turnos

Resuelto con validación en servidor más un exclusion constraint en la base, para que dos turnos superpuestos sean físicamente imposibles.

Flujo seguro de refresh JWT

Los refresh tokens son de un solo uso y rotan en cada llamada, con revocación al logout para reducir el impacto de robo de tokens.

Aislamiento multi-tenant

Cada consulta se filtra por business_id en un middleware compartido, evitando fugas de datos entre cuentas.