apiClient

This commit is contained in:
2025-11-22 15:30:08 +01:00
parent 530218a4b8
commit d3c76bc303
11 changed files with 319 additions and 169 deletions
+173
View File
@@ -9,6 +9,8 @@ import type {
FolderTreeNode,
Identifier,
PasskeySummary,
TenantSnippet,
TagResponse,
} from './apiTypes';
const normalizeNumber = (value: unknown): number | undefined => {
@@ -75,6 +77,176 @@ export const listPasskeys = async (): Promise<PasskeySummary[]> => {
return Array.isArray(data) ? data : [];
};
export const moveDocumentsBulk = async (documentIds: Identifier[], folderId: Identifier | null): Promise<void> => {
await api.post('/documents/bulk/move', {
document_ids: documentIds,
folder_id: folderId,
});
};
export const queueDocumentReanalysis = async (
documentId: Identifier,
options: { force?: boolean } = {},
): Promise<void> => {
const { force = false } = options;
await api.post(`/documents/${documentId}/assets`, null, { params: { force } });
};
export const trashDocument = async (documentId: Identifier): Promise<void> => {
await api.post(`/documents/${documentId}/trash`);
};
export const addDocumentTags = async (documentId: Identifier, tagIds: Identifier[]): Promise<void> => {
await api.post(`/documents/${documentId}/tags`, { tag_ids: tagIds });
};
export const createTag = async (payload: { label: string; color?: string | null }): Promise<TagResponse> => {
const { data } = await api.post<TagResponse>('/tags', payload);
return data;
};
export const createFolder = async (payload: { name: string; parent_id?: Identifier | null }): Promise<unknown> => {
const { data } = await api.post('/folders', payload);
return data;
};
export const assignCorrespondentsBulk = async <T = unknown>(
payload: Record<string, unknown>,
): Promise<T> => {
const { data } = await api.post<T>('/documents/bulk/correspondents', payload);
return data;
};
export const createApiToken = async (payload: {
capability_set_id: Identifier;
label?: string;
expires_at?: string;
}): Promise<{ token_info?: ApiTokenRecord; token?: string }> => {
const { data } = await api.post('/profile/api-tokens', payload);
return data as { token_info?: ApiTokenRecord; token?: string };
};
export const regenerateApiToken = async (
tokenId: Identifier,
): Promise<{ token_info?: ApiTokenRecord; token?: string }> => {
const { data } = await api.post(`/profile/api-tokens/${tokenId}/regenerate`);
return data as { token_info?: ApiTokenRecord; token?: string };
};
export const startPasskeyRegistration = async (): Promise<unknown> => {
const { data } = await api.post('/auth/passkeys/register/start', {});
return data;
};
export const finishPasskeyRegistration = async (payload: unknown): Promise<unknown> => {
const { data } = await api.post('/auth/passkeys/register/finish', payload);
return data;
};
export const startPasskeyLogin = async (username: string): Promise<unknown> => {
const { data } = await api.post('/auth/passkeys/login/start', { username });
return data;
};
export const finishPasskeyLogin = async (payload: unknown): Promise<unknown> => {
const { data } = await api.post('/auth/passkeys/login/finish', payload);
return data;
};
export const performLogin = async (payload: Record<string, unknown>): Promise<unknown> => {
const { data } = await api.post('/auth/login', payload);
return data;
};
export const selectTenant = async (
payload: { tenant_id: Identifier },
selectionToken: string,
): Promise<unknown> => {
const { data } = await api.post('/auth/select-tenant', payload, {
headers: {
Authorization: `Bearer ${selectionToken}`,
},
});
return data;
};
export const startSignup = async (username: string): Promise<unknown> => {
const { data } = await api.post('/auth/signup/start', { username });
return data;
};
export const finishSignup = async (payload: unknown): Promise<unknown> => {
const { data } = await api.post('/auth/signup/finish', payload);
return data;
};
export const updateDocument = async (
id: Identifier,
payload: Record<string, unknown>,
): Promise<DocumentResponse> => {
const { data } = await api.patch<DocumentResponse>(`/documents/${id}`, payload);
return data;
};
export const moveDocumentToFolder = async (id: Identifier, folderId: Identifier | null): Promise<void> => {
await api.patch(`/documents/${id}/folder`, { folder_id: folderId });
};
export const deleteDocumentTag = async (documentId: Identifier, tagId: Identifier): Promise<void> => {
await api.delete(`/documents/${documentId}/tags/${tagId}`);
};
export const deleteFolder = async (folderId: Identifier): Promise<void> => {
await api.delete(`/folders/${folderId}`);
};
export const moveFolder = async (folderId: Identifier, parentId: Identifier | null): Promise<void> => {
await api.patch(`/folders/${folderId}`, { parent_id: parentId });
};
export const renameFolder = async (folderId: Identifier, name: string): Promise<void> => {
await api.patch(`/folders/${folderId}`, { name });
};
export const createCapabilitySet = async (
payload: { slug?: string; label?: string; capabilities: string[] },
): Promise<CapabilitySetResponse & { label?: string }> => {
const { data } = await api.post<CapabilitySetResponse & { label?: string }>('/capability-sets', payload);
return data;
};
export const updateCapabilitySet = async (
id: Identifier,
payload: { slug?: string; label?: string; capabilities?: string[] },
): Promise<CapabilitySetResponse & { label?: string }> => {
const { data } = await api.patch<CapabilitySetResponse & { label?: string }>(`/capability-sets/${id}`, payload);
return data;
};
export const deleteCapabilitySet = async (id: Identifier): Promise<void> => {
await api.delete(`/capability-sets/${id}`);
};
export const deleteApiToken = async (tokenId: Identifier): Promise<void> => {
await api.delete(`/profile/api-tokens/${tokenId}`);
};
export const deletePasskey = async (
passkeyId: Identifier,
options: { reason?: string } = {},
): Promise<void> => {
const query = options.reason ? `?reason=${encodeURIComponent(options.reason)}` : '';
await api.delete(`/profile/passkeys/${passkeyId}${query}`);
};
export const listTenants = async (): Promise<TenantSnippet[]> => {
const { data } = await api.get<{ tenants?: TenantSnippet[] } | TenantSnippet[]>('/tenants');
if (Array.isArray(data)) {
return data;
}
return Array.isArray(data?.tenants) ? data.tenants : [];
};
export type {
DownloadLink,
DocumentResponse,
@@ -85,4 +257,5 @@ export type {
ApiTokenRecord,
PasskeySummary,
Identifier,
TenantSnippet,
} from './apiTypes';