feat(admin): add direct client onboarding modal and management directly in app.4ventures.es

This commit is contained in:
Marcos Fargas
2026-09-21 02:26:40 +02:00
parent 3bcdb6379f
commit 66e5e308f4
3 changed files with 491 additions and 44 deletions

View File

@@ -0,0 +1,46 @@
import { NextRequest, NextResponse } from 'next/server';
import { createClient } from '@/lib/supabase/server';
export async function POST(req: NextRequest) {
try {
const supabase = await createClient();
const { data: { user } } = await supabase.auth.getUser();
if (!user) {
return NextResponse.json({ error: 'No autorizado. Inicia sesión.' }, { status: 401 });
}
const userRole = user.app_metadata?.role || user.user_metadata?.role || 'client';
if (userRole !== 'admin' && userRole !== 'team') {
return NextResponse.json({ error: 'Permisos insuficientes. Solo administradores pueden crear clientes.' }, { status: 403 });
}
const body = await req.json();
const { companyName, slug, email, password, role } = body;
if (!companyName || !slug || !email || !password) {
return NextResponse.json({ error: 'Todos los campos son obligatorios.' }, { status: 400 });
}
const sanitizedSlug = slug.toLowerCase().trim().replace(/[^a-z0-9-]/g, '-');
const targetRole = role === 'admin' || role === 'team' ? role : 'client';
const { data, error } = await supabase.rpc('provision_client', {
p_company_name: companyName.trim(),
p_slug: sanitizedSlug,
p_email: email.toLowerCase().trim(),
p_password: password,
p_role: targetRole,
});
if (error) {
console.error('Error in provision_client RPC:', error);
return NextResponse.json({ error: error.message || 'Error al provisionar cliente en base de datos.' }, { status: 500 });
}
return NextResponse.json({ success: true, client: data });
} catch (err: any) {
console.error('Server error creating client:', err);
return NextResponse.json({ error: err?.message || 'Error interno del servidor.' }, { status: 500 });
}
}