/** * GET /api/workspaces/[slug]/apps/[uuid] * * Single Coolify app details. Verifies the app's project uuid matches * the workspace's before returning anything. */ import { NextResponse } from 'next/server'; import { requireWorkspacePrincipal } from '@/lib/auth/workspace-auth'; import { getApplicationInProject, projectUuidOf, TenantError } from '@/lib/coolify'; export async function GET( request: Request, { params }: { params: Promise<{ slug: string; uuid: string }> } ) { const { slug, uuid } = await params; const principal = await requireWorkspacePrincipal(request, { targetSlug: slug }); if (principal instanceof NextResponse) return principal; const ws = principal.workspace; if (!ws.coolify_project_uuid) { return NextResponse.json({ error: 'Workspace has no Coolify project yet' }, { status: 503 }); } try { const app = await getApplicationInProject(uuid, ws.coolify_project_uuid); return NextResponse.json({ uuid: app.uuid, name: app.name, status: app.status, fqdn: app.fqdn ?? null, gitRepository: app.git_repository ?? null, gitBranch: app.git_branch ?? null, projectUuid: projectUuidOf(app), }); } catch (err) { if (err instanceof TenantError) { return NextResponse.json({ error: err.message }, { status: 403 }); } return NextResponse.json( { error: 'Coolify request failed', details: err instanceof Error ? err.message : String(err) }, { status: 502 } ); } }