feat: agency control panel for per-client connections
Matrix view of Meta/Google/Drive/Clientify, follow/archive clients, and per-channel ON/OFF with account IDs in the client hub. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -111,32 +111,43 @@ export async function PATCH(req: NextRequest) {
|
||||
typeof body.label === 'string' ? body.label.trim() : undefined;
|
||||
const errorMessage =
|
||||
typeof body.errorMessage === 'string' ? body.errorMessage.trim() : undefined;
|
||||
const enabled =
|
||||
typeof body.enabled === 'boolean' ? body.enabled : undefined;
|
||||
|
||||
if (!tenantId || !provider || !status) {
|
||||
if (!tenantId || !provider) {
|
||||
return NextResponse.json(
|
||||
{ error: 'tenantId, provider y status requeridos' },
|
||||
{ error: 'tenantId y provider requeridos' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
if (
|
||||
!['disconnected', 'pending', 'connected', 'error'].includes(status)
|
||||
) {
|
||||
if (status && !['disconnected', 'pending', 'connected', 'error'].includes(status)) {
|
||||
return NextResponse.json({ error: 'status inválido' }, { status: 400 });
|
||||
}
|
||||
|
||||
const patch: Record<string, unknown> = {
|
||||
status,
|
||||
updated_at: new Date().toISOString(),
|
||||
};
|
||||
if (status) patch.status = status;
|
||||
if (externalAccountId !== undefined) {
|
||||
patch.external_account_id = externalAccountId || null;
|
||||
}
|
||||
if (label !== undefined) patch.label = label || null;
|
||||
if (errorMessage !== undefined) patch.error_message = errorMessage || null;
|
||||
if (enabled !== undefined) patch.enabled = enabled;
|
||||
if (status === 'connected') {
|
||||
patch.last_sync_at = new Date().toISOString();
|
||||
patch.error_message = null;
|
||||
}
|
||||
if (status === 'disconnected') {
|
||||
// keep external id for re-link unless cleared
|
||||
}
|
||||
|
||||
if (!status && enabled === undefined && externalAccountId === undefined) {
|
||||
return NextResponse.json(
|
||||
{ error: 'status, enabled o externalAccountId requeridos' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
const base = supabaseUrl();
|
||||
const url = `${base}/rest/v1/integrations?tenant_id=eq.${encodeURIComponent(tenantId)}&provider=eq.${encodeURIComponent(provider)}`;
|
||||
@@ -162,6 +173,7 @@ export async function PATCH(req: NextRequest) {
|
||||
body: JSON.stringify({
|
||||
tenant_id: tenantId,
|
||||
provider,
|
||||
status: status || 'disconnected',
|
||||
...patch,
|
||||
}),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user