From e4f10a2a004d535d4c68ff5a481c0a995801091e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 21 Sep 2025 17:10:17 +0000 Subject: [PATCH] feat: Add database check to health endpoint and improve workspace API Co-authored-by: vaughn.dimarco --- apps/sim/app/api/health/route.ts | 44 +++++++++-------- apps/sim/app/api/workspaces/route.ts | 71 +++++++++++++++------------- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/apps/sim/app/api/health/route.ts b/apps/sim/app/api/health/route.ts index a7d92b0ac75..ab6e99c84f6 100644 --- a/apps/sim/app/api/health/route.ts +++ b/apps/sim/app/api/health/route.ts @@ -1,24 +1,28 @@ import { NextResponse } from 'next/server' +import { db } from '@/db' +import { sql } from 'drizzle-orm' export async function GET() { - try { - return NextResponse.json( - { - status: 'healthy', - timestamp: new Date().toISOString(), - service: 'sim-app', - }, - { status: 200 }, - ) - } catch (error) { - return NextResponse.json( - { - status: 'unhealthy', - timestamp: new Date().toISOString(), - service: 'sim-app', - error: error instanceof Error ? error.message : 'Unknown error', - }, - { status: 500 }, - ) - } + try { + await db.execute(sql`select 1`) + return NextResponse.json( + { + status: 'healthy', + timestamp: new Date().toISOString(), + service: 'sim-app', + database: 'ok', + }, + { status: 200 }, + ) + } catch (error) { + return NextResponse.json( + { + status: 'unhealthy', + timestamp: new Date().toISOString(), + service: 'sim-app', + error: error instanceof Error ? error.message : 'Unknown error', + }, + { status: 500 }, + ) + } } diff --git a/apps/sim/app/api/workspaces/route.ts b/apps/sim/app/api/workspaces/route.ts index b184ca6e864..462e07a2318 100644 --- a/apps/sim/app/api/workspaces/route.ts +++ b/apps/sim/app/api/workspaces/route.ts @@ -10,46 +10,49 @@ const logger = createLogger('Workspaces') // Get all workspaces for the current user export async function GET() { - const session = await getSession() - - if (!session?.user?.id) { - return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) - } - - // Get all workspaces where the user has permissions - const userWorkspaces = await db - .select({ - workspace: workspace, - permissionType: permissions.permissionType, - }) - .from(permissions) - .innerJoin(workspace, eq(permissions.entityId, workspace.id)) - .where(and(eq(permissions.userId, session.user.id), eq(permissions.entityType, 'workspace'))) - .orderBy(desc(workspace.createdAt)) + try { + const session = await getSession() - if (userWorkspaces.length === 0) { - // Create a default workspace for the user - const defaultWorkspace = await createDefaultWorkspace(session.user.id, session.user.name) + if (!session?.user?.id) { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + } - // Migrate existing workflows to the default workspace - await migrateExistingWorkflows(session.user.id, defaultWorkspace.id) + const userWorkspaces = await db + .select({ + workspace: workspace, + permissionType: permissions.permissionType, + }) + .from(permissions) + .innerJoin(workspace, eq(permissions.entityId, workspace.id)) + .where( + and(eq(permissions.userId, session.user.id), eq(permissions.entityType, 'workspace')), + ) + .orderBy(desc(workspace.createdAt)) - return NextResponse.json({ workspaces: [defaultWorkspace] }) - } + if (userWorkspaces.length === 0) { + const defaultWorkspace = await createDefaultWorkspace( + session.user.id, + session.user.name, + ) + await migrateExistingWorkflows(session.user.id, defaultWorkspace.id) + return NextResponse.json({ workspaces: [defaultWorkspace] }) + } - // If user has workspaces but might have orphaned workflows, migrate them - await ensureWorkflowsHaveWorkspace(session.user.id, userWorkspaces[0].workspace.id) + await ensureWorkflowsHaveWorkspace(session.user.id, userWorkspaces[0].workspace.id) - // Format the response with permission information - const workspacesWithPermissions = userWorkspaces.map( - ({ workspace: workspaceDetails, permissionType }) => ({ - ...workspaceDetails, - role: permissionType === 'admin' ? 'owner' : 'member', // Map admin to owner for compatibility - permissions: permissionType, - }) - ) + const workspacesWithPermissions = userWorkspaces.map( + ({ workspace: workspaceDetails, permissionType }) => ({ + ...workspaceDetails, + role: permissionType === 'admin' ? 'owner' : 'member', + permissions: permissionType, + }), + ) - return NextResponse.json({ workspaces: workspacesWithPermissions }) + return NextResponse.json({ workspaces: workspacesWithPermissions }) + } catch (error) { + logger.error('Failed to get workspaces', { error }) + return NextResponse.json({ error: 'Internal server error' }, { status: 500 }) + } } // POST /api/workspaces - Create a new workspace