/** * Endpoint server-side para cambiar de tenant sin exponer el refresh_token al cliente. * * Flujo: * 1. Cliente llama POST /api-sveltekit/auth/switch-tenant con { tenant_slug } * 2. Este servidor lee access_token y refresh_token de las cookies (HttpOnly). * 3. Llama al backend /v1/auth/switch-tenant con ambos tokens. * 4. Si es exitoso, actualiza las cookies con los nuevos tokens. * 5. Retorna ok al cliente para que recargue la página. */ import { json } from '@sveltejs/kit'; import type { RequestEvent } from '@sveltejs/kit'; import { getServerApiUrl, getAuthTokens, setAuthTokens } from '$lib/server/api'; export const POST = async ({ request, cookies, fetch }: RequestEvent) => { const { tenant_slug } = await request.json(); if (!tenant_slug) { return json({ error: 'tenant_slug is required' }, { status: 400 }); } const { accessToken, refreshToken } = getAuthTokens(cookies); if (!accessToken || !refreshToken) { return json({ error: 'Not authenticated' }, { status: 401 }); } try { const baseUrl = getServerApiUrl(); const response = await fetch(`${baseUrl}v1/auth/switch-tenant`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` }, body: JSON.stringify({ tenant_slug, refresh_token: refreshToken }) }); if (!response.ok) { const err = await response.json().catch(() => ({})); return json({ error: err.detail || 'Switch failed' }, { status: response.status }); } const data = await response.json(); // Actualizar cookies con los nuevos tokens del nuevo tenant setAuthTokens(cookies, data.access_token, data.refresh_token); // Limpiar la compañía activa para que el dashboard recargue con el nuevo tenant cookies.delete('active_company_id', { path: '/' }); return json({ ok: true }); } catch (error) { console.error('[switch-tenant] Error:', error); return json({ error: 'Internal server error' }, { status: 500 }); } };