Files
govoplan-forms-runtime/webui/src/api/formsRuntime.ts
T

172 lines
4.8 KiB
TypeScript

import { apiFetch, apiPath, type ApiSettings } from "@govoplan/core-webui";
export type InstitutionalReference = {
kind: string;
owner_module: string;
object_id: string;
tenant_id: string;
version?: string | null;
valid_at?: string | null;
label?: string | null;
};
export type EvidenceReference = {
kind: string;
owner_module: string;
evidence_id: string;
tenant_id: string;
version?: string | null;
};
export type FormFieldDefinition = {
key: string;
label: string;
value_type: "text" | "multiline_text" | "integer" | "number" | "boolean" | "date" | "datetime" | "email" | "choice" | "multi_choice" | "object" | "list";
required: boolean;
help_text?: string | null;
options: string[];
constraints: Record<string, unknown>;
default_value?: unknown;
};
export type FormDefinition = {
reference: InstitutionalReference;
key: string;
temporal: { revision: string; recorded_at?: string | null };
title: string;
description?: string | null;
fields: FormFieldDefinition[];
publication_state: "draft" | "published" | "retired";
allow_drafts: boolean;
max_attachments: number;
signature_requirement: "none" | "optional" | "required";
policy_refs: string[];
handoff_kinds: string[];
};
export type ValidationResult = {
field?: string | null;
severity: "warning" | "error";
code: string;
message: string;
};
export type FormInstance = {
reference: InstitutionalReference;
tenant_id: string;
instance_id: string;
revision: number;
status: string;
definition_ref: InstitutionalReference;
values: Record<string, unknown>;
validation_results: ValidationResult[];
attachment_refs: EvidenceReference[];
signature_refs: EvidenceReference[];
handoff_refs: InstitutionalReference[];
service_ref?: InstitutionalReference | null;
receipt_id?: string | null;
recorded_at: string;
change_reason: string;
created_by: string;
changed_by: string;
replayed: boolean;
};
export type FormInstanceEvent = {
event_id: string;
event_type: string;
instance_revision: number;
status: string;
occurred_at: string;
actor_id: string;
payload: Record<string, unknown>;
};
export function listFormInstances(
settings: ApiSettings,
options: { statuses?: string[]; definitionId?: string; offset?: number; limit?: number } = {},
signal?: AbortSignal
): Promise<{ instances: FormInstance[]; total: number; offset: number; limit: number }> {
return apiFetch(settings, apiPath("/api/v1/forms-runtime/instances", {
status: options.statuses,
definition_id: options.definitionId,
offset: options.offset ?? 0,
limit: options.limit ?? 100
}), { signal });
}
export function getFormInstance(
settings: ApiSettings,
instanceId: string,
signal?: AbortSignal
): Promise<FormInstance> {
return apiFetch(settings, `/api/v1/forms-runtime/instances/${encodeURIComponent(instanceId)}`, { signal });
}
export function getFormDefinition(
settings: ApiSettings,
instanceId: string,
signal?: AbortSignal
): Promise<FormDefinition> {
return apiFetch(
settings,
`/api/v1/forms-runtime/instances/${encodeURIComponent(instanceId)}/definition`,
{ signal }
);
}
export function getFormInstanceHistory(
settings: ApiSettings,
instanceId: string,
signal?: AbortSignal
): Promise<{ revisions: FormInstance[] }> {
return apiFetch(settings, `/api/v1/forms-runtime/instances/${encodeURIComponent(instanceId)}/history`, { signal });
}
export function getFormInstanceEvents(
settings: ApiSettings,
instanceId: string,
signal?: AbortSignal
): Promise<{ events: FormInstanceEvent[] }> {
return apiFetch(settings, `/api/v1/forms-runtime/instances/${encodeURIComponent(instanceId)}/events`, { signal });
}
export function saveFormDraft(
settings: ApiSettings,
instance: FormInstance,
values: Record<string, unknown>,
changeReason: string
): Promise<FormInstance> {
return apiFetch(settings, `/api/v1/forms-runtime/instances/${encodeURIComponent(instance.instance_id)}`, {
method: "PATCH",
body: JSON.stringify({
expected_revision: instance.revision,
values,
attachment_refs: instance.attachment_refs,
signature_refs: instance.signature_refs,
idempotency_key: crypto.randomUUID(),
recorded_at: new Date().toISOString(),
change_reason: changeReason
})
});
}
export function submitFormInstance(
settings: ApiSettings,
instance: FormInstance,
values: Record<string, unknown>
): Promise<FormInstance> {
return apiFetch(settings, `/api/v1/forms-runtime/instances/${encodeURIComponent(instance.instance_id)}/submit`, {
method: "POST",
body: JSON.stringify({
expected_revision: instance.revision,
values,
attachment_refs: instance.attachment_refs,
signature_refs: instance.signature_refs,
idempotency_key: crypto.randomUUID(),
recorded_at: new Date().toISOString()
})
});
}