Integrate Distribution Lists with Campaign recipients

This commit is contained in:
2026-08-02 11:53:35 +02:00
parent 4eeba62bbc
commit b38597f2be
15 changed files with 1552 additions and 3 deletions
+155
View File
@@ -195,6 +195,127 @@ export type CampaignRecipientAddressSourcesResponse = {
sources: CampaignRecipientAddressSource[];
};
export type CampaignDistributionListParameter = {
key: string;
value_type: "string" | "integer" | "number" | "boolean" | "date" | "datetime" | "string_list";
label?: string | null;
required: boolean;
default?: unknown;
allowed_values: unknown[];
minimum?: number | null;
maximum?: number | null;
pattern?: string | null;
description?: string | null;
};
export type CampaignDistributionListSource = {
id: string;
tenant_id: string;
name: string;
revision_id: string;
revision: number;
definition_hash: string;
definition_kind: string;
description?: string | null;
status: string;
entry_count: number;
read_only: boolean;
stale: boolean;
parameters: CampaignDistributionListParameter[];
updated_at?: string | null;
provenance: Record<string, unknown>;
metadata: Record<string, unknown>;
};
export type CampaignDistributionListSourcesResponse = {
available: boolean;
expand_available: boolean;
sources: CampaignDistributionListSource[];
};
export type CampaignDistributionSourceReference = {
provider: string;
resource_type: string;
resource_id: string;
revision?: string | null;
fingerprint?: string | null;
label?: string | null;
metadata: Record<string, unknown>;
};
export type CampaignDistributionExplanation = {
code: string;
message: string;
severity: "info" | "warning" | "error" | string;
provider?: string | null;
source?: CampaignDistributionSourceReference | null;
provenance: Record<string, unknown>;
};
export type CampaignDistributionChannelCandidate = {
channel: "email" | "postal" | "internal_mail" | "portal" | string;
target: string;
target_key: string;
status: string;
contact_point_id?: string | null;
locale?: string | null;
preferred: boolean;
reason_code?: string | null;
explanation?: string | null;
source?: CampaignDistributionSourceReference | null;
decision_provenance: Record<string, unknown>;
};
export type CampaignDistributionRecipient = {
recipient_key: string;
display_name: string;
status: string;
channels: CampaignDistributionChannelCandidate[];
identity_id?: string | null;
account_id?: string | null;
contact_id?: string | null;
organization_unit_id?: string | null;
function_id?: string | null;
source_entry_ids: string[];
explanations: CampaignDistributionExplanation[];
attributes: Record<string, unknown>;
provenance: Record<string, unknown>;
};
export type CampaignDistributionProviderEvidence = {
provider: string;
source: CampaignDistributionSourceReference;
actual_revision?: string | null;
actual_fingerprint?: string | null;
stale: boolean;
generated_at?: string | null;
details: Record<string, unknown>;
};
export type CampaignDistributionListExpansion = {
source: CampaignDistributionListSource;
request: Record<string, unknown>;
recipients: CampaignDistributionRecipient[];
excluded: CampaignDistributionRecipient[];
diagnostics: CampaignDistributionExplanation[];
provider_evidence: CampaignDistributionProviderEvidence[];
expansion_hash: string;
generated_at?: string | null;
snapshot_id?: string | null;
stale: boolean;
truncated: boolean;
};
export type CampaignDistributionListExpansionInput = {
list_id: string;
revision?: number | null;
effective_at?: string | null;
purpose?: string;
requested_channels: Array<"email" | "postal" | "internal_mail" | "portal">;
parameters: Record<string, unknown>;
idempotency_key?: string | null;
};
export type CampaignPostboxDirectoryEntry = {
id: string;
address: string;
@@ -746,6 +867,40 @@ campaignId: string)
return apiFetch<CampaignRecipientAddressSourcesResponse>(settings, `/api/v1/campaigns/${campaignId}/recipient-address-sources`);
}
export async function listCampaignRecipientDistributionLists(
settings: ApiSettings,
campaignId: string,
query = "")
: Promise<CampaignDistributionListSourcesResponse> {
const params = new URLSearchParams();
params.set("limit", "250");
if (query.trim()) params.set("query", query.trim());
const suffix = params.size ? `?${params.toString()}` : "";
return apiFetch<CampaignDistributionListSourcesResponse>(settings, `/api/v1/campaigns/${campaignId}/recipient-distribution-lists${suffix}`);
}
export async function previewCampaignRecipientDistributionList(
settings: ApiSettings,
campaignId: string,
payload: CampaignDistributionListExpansionInput)
: Promise<CampaignDistributionListExpansion> {
return apiFetch<CampaignDistributionListExpansion>(settings, `/api/v1/campaigns/${campaignId}/recipient-distribution-lists/preview`, {
method: "POST",
body: JSON.stringify(payload)
});
}
export async function snapshotCampaignRecipientDistributionList(
settings: ApiSettings,
campaignId: string,
payload: CampaignDistributionListExpansionInput)
: Promise<CampaignDistributionListExpansion> {
return apiFetch<CampaignDistributionListExpansion>(settings, `/api/v1/campaigns/${campaignId}/recipient-distribution-lists/snapshot`, {
method: "POST",
body: JSON.stringify(payload)
});
}
export async function getCampaignPostboxCatalog(
settings: ApiSettings,
campaignId: string)