Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 24 additions & 20 deletions apps/sim/app/api/health/route.ts
Original file line number Diff line number Diff line change
@@ -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 },
)
}
}
71 changes: 37 additions & 34 deletions apps/sim/app/api/workspaces/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down