Saltar a contenido

Tutorial: Onboarding Manual de un Nuevo Tenant en Gastro

Este tutorial describe el flujo manual vigente para crear un nuevo restaurante en Gastro usando el contrato actual del backend y validar que la carta pública quede accesible.

Prerrequisitos

  • Backend Gastro corriendo en http://localhost:8005
  • PostgreSQL y Redis disponibles
  • curl o Postman
  • Frontends locales opcionales:
  • public-menu en http://localhost:3000
  • admin-panel en http://localhost:5174/app

Variables sugeridas:

export BASE="http://localhost:8005/api/v1"
export PUBLIC_MENU="http://localhost:3000"

Paso 1: Crear el founder y el tenant con POST /signup

El alta self-service crea en una sola transacción:

  • founder
  • tenant
  • categoría inicial placeholder

Además devuelve access_token y public_menu_url.

curl -X POST "$BASE/signup" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboarding-bistro-del-valle-001" \
  -d '{
    "founder_full_name": "María García",
    "email": "propietario@bistro-test.com",
    "password": "securePassword123!",
    "tenant_name": "Bistró del Valle",
    "tenant_slug": "bistro-del-valle",
    "sector": "traditional",
    "brand_color": "#1a1a1a",
    "accent_color": "#d4a853",
    "hero_style": "minimal"
  }'

Respuesta esperada:

{
  "founder_id": "uuid",
  "tenant_id": "uuid",
  "tenant_slug": "bistro-del-valle",
  "tenant_name": "Bistró del Valle",
  "access_token": "eyJhbGciOi...",
  "token_type": "bearer",
  "public_menu_url": "/api/v1/public/menu/bistro-del-valle"
}

Guarda el token:

export TOKEN="pega_aqui_el_access_token"

Paso 2: Verificar la sesión actual

El backend permite bootstrap de sesión con GET /auth/me.

curl "$BASE/auth/me" \
  -H "Authorization: Bearer $TOKEN"

Esto confirma que el JWT quedó asociado al tenant_id correcto y que la sesión tiene permisos válidos.

Paso 3: Consultar el perfil del tenant

curl "$BASE/tenants/me" \
  -H "Authorization: Bearer $TOKEN"

Úsalo para confirmar:

  • slug
  • theme_config
  • plan_type
  • onboarding_status

Paso 4: Crear una categoría real

curl -X POST "$BASE/categories" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Entradas",
    "description": "Platos para abrir el apetito.",
    "sort_order": 0
  }'

Respuesta esperada:

  • id
  • name
  • products: []

Guarda el id como CATEGORY_ID.

Paso 5: Crear el primer producto

export CATEGORY_ID="pega_aqui_el_uuid_de_la_categoria"

curl -X POST "$BASE/products" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"category_id\": \"$CATEGORY_ID\",
    \"name\": \"Empanadas de Pipían\",
    \"description\": \"3 empanadas tradicionales acompañadas de ají de maní.\",
    \"price\": 12500,
    \"tags\": [\"popular\"],
    \"is_available\": true,
    \"is_featured\": true,
    \"sort_order\": 0
  }"

Paso 6: Validar la carta pública

Primero valida el endpoint backend:

curl "$BASE/public/menu/bistro-del-valle"

Luego valida el frontend público si está corriendo:

curl "$PUBLIC_MENU/bistro-del-valle"

Si todo está bien:

  • el tenant existe
  • la categoría aparece
  • el producto aparece en la carta pública

Paso 7: Validar el admin-panel

Si el admin-panel está corriendo en local:

  • abre http://localhost:5174/app/login
  • usa:
  • slug: bistro-del-valle
  • password: securePassword123!

Desde ahí ya puedes:

  • editar el negocio
  • cambiar apariencia
  • gestionar categorías/productos
  • activar fidelización vía Foveo si aplica

Notas importantes

  • POST /signup requiere Idempotency-Key.
  • El signup ya devuelve access_token, pero hoy no existe handoff automático al admin-panel.
  • La categoría inicial placeholder puede existir tras signup; el flujo real de negocio suele reemplazarla con categorías del restaurante.
  • Para imágenes, usa primero POST /media/upload y luego persiste image_url/image_key en categoría o producto.

Fuentes canónicas relacionadas