From 7fb6cebf511e2159752cee21eb1836303f5c16ee Mon Sep 17 00:00:00 2001 From: Greg Methvin Date: Wed, 25 Mar 2026 13:42:18 -0700 Subject: [PATCH] Add campaign state filter --- api-docs.json | 22 ++++++++++++++++++++++ src/client/campaigns.ts | 7 +++++++ src/types/campaigns.ts | 32 +++++++++++++++++++++----------- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/api-docs.json b/api-docs.json index 67b383c..4a80a8c 100644 --- a/api-docs.json +++ b/api-docs.json @@ -5231,6 +5231,17 @@ "required": false, "type": "string", "x-example": "id" + }, + { + "collectionFormat": "multi", + "description": "Filter campaigns by state. Can be specified multiple times to filter by multiple states. Valid states: Draft, Ready, Scheduled, Running, Finished, Starting, Aborted, Recurring, Archived. Example: ?campaignState=Ready&campaignState=Running", + "in": "query", + "items": { + "type": "string" + }, + "name": "campaignState", + "required": false, + "type": "array" } ], "responses": { @@ -5567,6 +5578,17 @@ "required": false, "type": "string", "x-example": "id" + }, + { + "collectionFormat": "multi", + "description": "Filter campaigns by state. Can be specified multiple times to filter by multiple states. Valid states: Draft, Ready, Scheduled, Running, Finished, Starting, Aborted, Recurring, Archived. Example: ?campaignState=Ready&campaignState=Running", + "in": "query", + "items": { + "type": "string" + }, + "name": "campaignState", + "required": false, + "type": "array" } ], "responses": { diff --git a/src/client/campaigns.ts b/src/client/campaigns.ts index f94c575..b59fc8f 100644 --- a/src/client/campaigns.ts +++ b/src/client/campaigns.ts @@ -5,6 +5,7 @@ import { ArchiveCampaignsResponse, ArchiveCampaignsResponseSchema, CampaignMetricsResponse, + CampaignState, CancelCampaignParams, CreateBlastCampaignParams, CreateCampaignResponse, @@ -58,6 +59,12 @@ export function Campaigns>(Base: T) { queryParams.append("sort", sortString); } + if (params?.campaignState) { + params.campaignState.forEach((state: CampaignState) => + queryParams.append("campaignState", state) + ); + } + const url = `/api/campaigns?${queryParams.toString()}`; const response = await this.client.get( url, diff --git a/src/types/campaigns.ts b/src/types/campaigns.ts index 527f0f4..4bed7e1 100644 --- a/src/types/campaigns.ts +++ b/src/types/campaigns.ts @@ -12,21 +12,25 @@ import { * Campaign management schemas and types */ +export const CampaignStateSchema = z.enum([ + "Draft", + "Ready", + "Scheduled", + "Running", + "Finished", + "Starting", + "Aborted", + "Recurring", + "Archived", +]); + +export type CampaignState = z.infer; + export const CampaignDetailsSchema = z.object({ id: z.number(), name: z.string(), type: z.enum(["Blast", "Triggered"]), - campaignState: z.enum([ - "Draft", - "Ready", - "Scheduled", - "Running", - "Finished", - "Starting", - "Aborted", - "Recurring", - "Archived", - ]), + campaignState: CampaignStateSchema, messageMedium: z.string(), createdAt: UnixTimestampSchema, updatedAt: UnixTimestampSchema, @@ -74,6 +78,12 @@ export const GetCampaignsParamsSchema = z.object({ sort: createSortParamSchema(CAMPAIGN_SORT_FIELDS).describe( "Field to sort campaigns by with optional direction (defaults to id ascending)" ), + campaignState: z + .array(CampaignStateSchema) + .optional() + .describe( + "Filter campaigns by state. Can specify multiple states. Valid states: Draft, Ready, Scheduled, Running, Finished, Starting, Aborted, Recurring, Archived" + ), }); export type GetCampaignsParams = z.infer;