aa2fe41ecc342ae869c9aa5a35016a78d0cc230e
Monorepo (Frontend + Backend + Contrato API)
Este repositorio contiene:
apps/frontend: app web en React + Vite + TanStack Router/Query.apps/backend: API en Bun + Hono + Prisma + Supabase Auth.packages/api-contract: contratos compartidos (schemas/types/rutas) entre frontend y backend.
Objetivo de este README
Dejarte productivo/a en pocos minutos para que puedas:
- Levantar frontend y backend en local.
- Configurar variables de entorno.
- Ejecutar migraciones de base de datos.
- Entender la estructura y el flujo de trabajo del proyecto.
Stack técnico
- Runtime/package manager:
bun - Frontend:
React 19,Vite,TanStack Router,TanStack Query - Backend:
Bun,Hono,Prisma,PostgreSQL - Auth:
Supabase Auth(token Bearer validado en backend) - Validación de contratos:
zoden@repo/api-contract
Prerrequisitos
buninstalado (versión reciente).PostgreSQLcorriendo localmente (o accesible remotamente).- Proyecto de
Supabasepara autenticación (URL + anon key).
Setup rápido
- Instalar dependencias desde la raíz:
bun install
- Configurar variables de entorno del backend:
cp apps/backend/.env.example apps/backend/.env
- Configurar variables de entorno del frontend:
cp apps/frontend/.env.example apps/frontend/.env
- Revisar/editar valores en ambos
.envsegún tu entorno.
Variables de entorno
Backend (apps/backend/.env)
Variables esperadas:
SUPABASE_URLSUPABASE_ANON_KEYCORS_ORIGIN(por defecto local frontend)LOG_LEVELDATABASE_URL(PostgreSQL)
Notas:
- El backend también acepta
VITE_SUPABASE_URLyVITE_SUPABASE_ANON_KEYcomo fallback. - Si falta
DATABASE_URL, Prisma no puede inicializarse.
Frontend (apps/frontend/.env)
Variables esperadas:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEYVITE_API_BASE_URL(por defecto:http://localhost:3000)
Base de datos (Prisma)
Antes de arrancar backend por primera vez, corré migraciones:
bun --filter backend prisma:migrate
Si cambiás el schema, regenerá cliente:
bun --filter backend prisma:generate
Ejecutar en desarrollo
Terminal 1 (backend):
bun run dev:backend
Terminal 2 (frontend):
bun run dev:frontend
Puertos por defecto:
- Frontend:
http://localhost:5173 - Backend:
http://localhost:3000
Scripts útiles
Desde la raíz:
bun run dev:frontendbun run dev:backendbun run build:frontendbun run lint:frontend
Desde apps/backend:
bun run devbun run startbun run prisma:migratebun run prisma:generate
Estructura del repo
.
├─ apps/
│ ├─ frontend/ # UI y navegación
│ └─ backend/ # API, auth middleware, acceso a DB
└─ packages/
└─ api-contract/ # Schemas/tipos/rutas compartidos
Flujo de autenticación (resumen)
- Frontend autentica con Supabase.
- Frontend guarda el access token y lo envía como
Authorization: Bearer ...al backend. - Backend valida token con Supabase (
requireAuthmiddleware). - Si el token es válido, habilita rutas protegidas (
/api/user/*,/api/tenants/*).
Endpoints principales
GET /api/user/profilePOST /api/tenantsGET /api/tenants/:idPATCH /api/tenants/:id
Convenciones recomendadas para el equipo
- Mantener contratos de API en
packages/api-contract(evitar duplicar tipos). - Si agregás/cambiás endpoint:
- Actualizá schema/tipos en
api-contract. - Implementá handler/ruta en backend.
- Consumí el contrato desde frontend.
- Actualizá schema/tipos en
- Validar payloads con Zod tanto en contrato como en rutas.
- Mantener PRs chicos y enfocados.
Troubleshooting rápido
- Error de CORS:
- Revisar
CORS_ORIGINen backend y que incluyahttp://localhost:5173.
- Revisar
403 Missing bearer token:- Verificar login en frontend y envío del header
Authorization.
- Verificar login en frontend y envío del header
- Error de Supabase env vars:
- Confirmar
SUPABASE_URL/SUPABASE_ANON_KEY(backend) yVITE_*(frontend).
- Confirmar
- Error de Prisma/DB:
- Confirmar
DATABASE_URL, conectividad a PostgreSQL y migraciones aplicadas.
- Confirmar
Primer día sugerido para onboarding
- Levantar backend y frontend en local.
- Crear usuario o iniciar sesión desde la pantalla de onboard.
- Crear un tenant de prueba.
- Probar lectura/edición de tenant.
- Revisar
packages/api-contractpara entender cómo se comparten tipos y rutas.
Si te trabás en el setup, empezá verificando .env, estado de PostgreSQL y que ambos procesos (dev:backend y dev:frontend) estén corriendo.
Description
Languages
TypeScript
99.4%
CSS
0.4%
Dockerfile
0.2%