diff --git a/apps/api/openapi/lib/openapi.libsonnet b/apps/api/openapi/lib/openapi.libsonnet index 57b09a92a..f206d6a83 100644 --- a/apps/api/openapi/lib/openapi.libsonnet +++ b/apps/api/openapi/lib/openapi.libsonnet @@ -51,6 +51,18 @@ }, }, + orderParam():: { + name: 'order', + 'in': 'query', + required: false, + description: 'Sort order for results', + schema: { + type: 'string', + enum: ['asc', 'desc'], + default: 'desc', + }, + }, + celParam():: { name: 'cel', 'in': 'query', diff --git a/apps/api/openapi/openapi.json b/apps/api/openapi/openapi.json index 84cf6d0ed..8a46ee07b 100644 --- a/apps/api/openapi/openapi.json +++ b/apps/api/openapi/openapi.json @@ -4784,6 +4784,20 @@ "minimum": 0, "type": "integer" } + }, + { + "description": "Sort order for results", + "in": "query", + "name": "order", + "required": false, + "schema": { + "default": "desc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + } } ], "responses": { diff --git a/apps/api/openapi/paths/deploymentversions.jsonnet b/apps/api/openapi/paths/deploymentversions.jsonnet index c848ba5a1..3004b5981 100644 --- a/apps/api/openapi/paths/deploymentversions.jsonnet +++ b/apps/api/openapi/paths/deploymentversions.jsonnet @@ -10,6 +10,7 @@ local openapi = import '../lib/openapi.libsonnet'; openapi.deploymentIdParam(), openapi.limitParam(), openapi.offsetParam(), + openapi.orderParam(), ], responses: openapi.paginatedResponse(openapi.schemaRef('DeploymentVersion')) + openapi.notFoundResponse() diff --git a/apps/api/src/routes/v1/workspaces/deployments.ts b/apps/api/src/routes/v1/workspaces/deployments.ts index 3fd21e02c..227785f19 100644 --- a/apps/api/src/routes/v1/workspaces/deployments.ts +++ b/apps/api/src/routes/v1/workspaces/deployments.ts @@ -3,7 +3,7 @@ import { ApiError, asyncHandler } from "@/types/api.js"; import { Router } from "express"; import { v4 as uuidv4 } from "uuid"; -import { and, count, eq, inArray, takeFirst } from "@ctrlplane/db"; +import { and, asc, count, desc, eq, inArray, takeFirst } from "@ctrlplane/db"; import { db } from "@ctrlplane/db/client"; import { enqueueDeploymentPlan, @@ -291,6 +291,7 @@ const listDeploymentVersions: AsyncTypedHandler< const { deploymentId } = req.params; const limit = req.query.limit ?? 50; const offset = req.query.offset ?? 0; + const order = req.query.order ?? "desc"; const [countResult] = await db .select({ total: count() }) @@ -303,7 +304,11 @@ const listDeploymentVersions: AsyncTypedHandler< .select() .from(schema.deploymentVersion) .where(eq(schema.deploymentVersion.deploymentId, deploymentId)) - .orderBy(schema.deploymentVersion.createdAt) + .orderBy( + order === "asc" + ? asc(schema.deploymentVersion.createdAt) + : desc(schema.deploymentVersion.createdAt), + ) .limit(limit) .offset(offset); diff --git a/apps/api/src/types/openapi.ts b/apps/api/src/types/openapi.ts index 4551aa015..3cf230ba9 100644 --- a/apps/api/src/types/openapi.ts +++ b/apps/api/src/types/openapi.ts @@ -3143,6 +3143,8 @@ export interface operations { limit?: number; /** @description Number of items to skip */ offset?: number; + /** @description Sort order for results */ + order?: "asc" | "desc"; }; header?: never; path: {