feat(campaigns): add accountable work assignments
Module Package Release / publish-packages (push) Successful in 14s
Module Package Release / publish-packages (push) Successful in 14s
This commit is contained in:
@@ -81,6 +81,63 @@ export type CampaignCollaborationCreate = {
|
||||
mention_user_ids?: string[];
|
||||
};
|
||||
|
||||
export type CampaignWorkAssigneeType = "account" | "group" | "organization_function";
|
||||
export type CampaignWorkAssignmentStatus = "open" | "in_progress" | "completed" | "cancelled";
|
||||
export type CampaignWorkAssignmentResolutionState = "resolved" | "unavailable" | "provider_unavailable";
|
||||
|
||||
export type CampaignWorkAssignment = {
|
||||
id: string;
|
||||
campaign_id: string;
|
||||
purpose: string;
|
||||
status: CampaignWorkAssignmentStatus;
|
||||
due_at?: string | null;
|
||||
assignee_type: CampaignWorkAssigneeType;
|
||||
assignee_id: string;
|
||||
assignee_label_snapshot: string;
|
||||
assignee_current_label?: string | null;
|
||||
assignee_resolution_state: CampaignWorkAssignmentResolutionState;
|
||||
resolution_provenance: Record<string, unknown>;
|
||||
resolution_checked_at: string;
|
||||
assigned_by_user_id?: string | null;
|
||||
assigned_by_label: string;
|
||||
reference?: CampaignCollaborationReference | null;
|
||||
completed_at?: string | null;
|
||||
cancelled_at?: string | null;
|
||||
task_mirror_id?: string | null;
|
||||
task_mirror_status: "not_configured" | "mirrored" | "failed" | "skipped";
|
||||
task_mirror_error?: string | null;
|
||||
resource_revision: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
};
|
||||
|
||||
export type CampaignWorkAssignmentListResponse = {
|
||||
items: CampaignWorkAssignment[];
|
||||
next_cursor?: string | null;
|
||||
has_more: boolean;
|
||||
};
|
||||
|
||||
export type CampaignWorkAssignmentEvent = {
|
||||
id: string;
|
||||
assignment_id: string;
|
||||
event_kind: string;
|
||||
actor_user_id?: string | null;
|
||||
actor_label: string;
|
||||
status: CampaignWorkAssignmentStatus;
|
||||
assignee_type: CampaignWorkAssigneeType;
|
||||
assignee_id: string;
|
||||
assignee_label: string;
|
||||
resolution_state: CampaignWorkAssignmentResolutionState;
|
||||
details: Record<string, unknown>;
|
||||
created_at: string;
|
||||
};
|
||||
|
||||
export type CampaignWorkAssignmentHistoryResponse = {
|
||||
items: CampaignWorkAssignmentEvent[];
|
||||
next_cursor?: string | null;
|
||||
has_more: boolean;
|
||||
};
|
||||
|
||||
export type CampaignArchiveEncryptionPolicy = {
|
||||
available: boolean;
|
||||
allowed_password_encryption_methods: Array<"aes" | "zip_standard">;
|
||||
@@ -1865,6 +1922,106 @@ export function campaignCollaborationMentionProvider(
|
||||
);
|
||||
}
|
||||
|
||||
export async function listCampaignWorkAssignments(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
options: { cursor?: string | null; limit?: number; statuses?: CampaignWorkAssignmentStatus[] } = {}
|
||||
): Promise<CampaignWorkAssignmentListResponse> {
|
||||
const params = new URLSearchParams({ limit: String(options.limit ?? 50) });
|
||||
if (options.cursor) params.set("cursor", options.cursor);
|
||||
for (const status of options.statuses ?? []) params.append("assignment_status", status);
|
||||
return apiFetch<CampaignWorkAssignmentListResponse>(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments?${params.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
export async function createCampaignWorkAssignment(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
payload: {
|
||||
purpose: string;
|
||||
assignee: { type: CampaignWorkAssigneeType; id: string };
|
||||
due_at?: string | null;
|
||||
reference?: Pick<CampaignCollaborationReference, "kind" | "id"> | null;
|
||||
mirror_to_tasks?: boolean;
|
||||
}
|
||||
): Promise<CampaignWorkAssignment> {
|
||||
return apiFetch<CampaignWorkAssignment>(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments`,
|
||||
{ method: "POST", body: JSON.stringify(payload) }
|
||||
);
|
||||
}
|
||||
|
||||
export async function reassignCampaignWorkAssignment(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
assignmentId: string,
|
||||
payload: {
|
||||
expected_revision: number;
|
||||
assignee: { type: CampaignWorkAssigneeType; id: string };
|
||||
reason?: string | null;
|
||||
mirror_to_tasks?: boolean;
|
||||
}
|
||||
): Promise<CampaignWorkAssignment> {
|
||||
return apiFetch<CampaignWorkAssignment>(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments/${encodeURIComponent(assignmentId)}/reassign`,
|
||||
{ method: "POST", body: JSON.stringify(payload) }
|
||||
);
|
||||
}
|
||||
|
||||
export async function transitionCampaignWorkAssignment(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
assignment: Pick<CampaignWorkAssignment, "id" | "resource_revision">,
|
||||
action: "start" | "complete" | "cancel"
|
||||
): Promise<CampaignWorkAssignment> {
|
||||
return apiFetch<CampaignWorkAssignment>(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments/${encodeURIComponent(assignment.id)}/transition`,
|
||||
{ method: "POST", body: JSON.stringify({ expected_revision: assignment.resource_revision, action }) }
|
||||
);
|
||||
}
|
||||
|
||||
export async function listCampaignWorkAssignmentHistory(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
assignmentId: string,
|
||||
cursor?: string | null
|
||||
): Promise<CampaignWorkAssignmentHistoryResponse> {
|
||||
const params = new URLSearchParams({ limit: "50" });
|
||||
if (cursor) params.set("cursor", cursor);
|
||||
return apiFetch<CampaignWorkAssignmentHistoryResponse>(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments/${encodeURIComponent(assignmentId)}/history?${params.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
export async function reconcileCampaignWorkAssignments(
|
||||
settings: ApiSettings,
|
||||
campaignId: string
|
||||
): Promise<{ checked: number; changed: number; assignments: CampaignWorkAssignment[] }> {
|
||||
return apiFetch(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments/reconcile`,
|
||||
{ method: "POST" }
|
||||
);
|
||||
}
|
||||
|
||||
export function campaignWorkAssignmentTargetProvider(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
assigneeType: CampaignWorkAssigneeType
|
||||
): ReferenceOptionProvider {
|
||||
return apiReferenceOptionProvider(
|
||||
settings,
|
||||
`/api/v1/campaigns/${encodeURIComponent(campaignId)}/assignments/options`,
|
||||
{ assignee_type: assigneeType }
|
||||
);
|
||||
}
|
||||
|
||||
export function campaignShareTargetProvider(
|
||||
settings: ApiSettings,
|
||||
campaignId: string,
|
||||
|
||||
Reference in New Issue
Block a user