/** * GET /api/v1/admin/workflows * * List all workflows across all workspaces with pagination. * * Query Parameters: * - limit: number (default: 50, max: 250) * - offset: number (default: 0) * * Response: AdminListResponse */ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { count } from 'drizzle-orm' import { adminV1ListWorkflowsContract } from '@/lib/api/contracts/v1/admin' import { parseRequest } from '@/lib/api/server' import { withRouteHandler } from '@/lib/core/utils/with-route-handler' import { withAdminAuth } from '@/app/api/v1/admin/middleware' import { internalErrorResponse, listResponse } from '@/app/api/v1/admin/responses' import { type AdminWorkflow, createPaginationMeta, toAdminWorkflow } from '@/app/api/v1/admin/types' const logger = createLogger('AdminWorkflowsAPI') export const GET = withRouteHandler( withAdminAuth(async (request) => { const parsed = await parseRequest(adminV1ListWorkflowsContract, request, {}) if (!parsed.success) return parsed.response const { limit, offset } = parsed.data.query try { const [countResult, workflows] = await Promise.all([ db.select({ total: count() }).from(workflow), db .select({ id: workflow.id, name: workflow.name, description: workflow.description, workspaceId: workflow.workspaceId, folderId: workflow.folderId, isDeployed: workflow.isDeployed, deployedAt: workflow.deployedAt, runCount: workflow.runCount, lastRunAt: workflow.lastRunAt, createdAt: workflow.createdAt, updatedAt: workflow.updatedAt, }) .from(workflow) .orderBy(workflow.name) .limit(limit) .offset(offset), ]) const total = countResult[0].total const data: AdminWorkflow[] = workflows.map(toAdminWorkflow) const pagination = createPaginationMeta(total, limit, offset) logger.info(`Admin API: Listed ${data.length} workflows (total: ${total})`) return listResponse(data, pagination) } catch (error) { logger.error('Admin API: Failed to list workflows', { error }) return internalErrorResponse('Failed to list workflows') } }) )