2025-01-23 19:41:31 +03:00
|
|
|
import { queryOptions } from '@tanstack/react-query';
|
|
|
|
|
2025-01-28 23:23:03 +03:00
|
|
|
import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
|
2025-01-23 19:41:31 +03:00
|
|
|
import { DELAYS } from '@/backend/configuration';
|
2025-01-28 19:45:31 +03:00
|
|
|
import {
|
|
|
|
AccessPolicy,
|
|
|
|
ILibraryItem,
|
|
|
|
IVersionData,
|
|
|
|
IVersionInfo,
|
|
|
|
LibraryItemID,
|
|
|
|
LibraryItemType,
|
|
|
|
VersionID
|
|
|
|
} from '@/models/library';
|
2025-01-23 19:41:31 +03:00
|
|
|
import { ConstituentaID, IRSFormData } from '@/models/rsform';
|
|
|
|
import { UserID } from '@/models/user';
|
2025-01-28 19:45:31 +03:00
|
|
|
import { information } from '@/utils/labels';
|
2025-01-23 19:41:31 +03:00
|
|
|
|
2025-01-26 22:24:34 +03:00
|
|
|
import { ossApi } from '../oss/api';
|
|
|
|
import { rsformsApi } from '../rsform/api';
|
|
|
|
|
2025-01-23 19:41:31 +03:00
|
|
|
/**
|
|
|
|
* Represents update data for renaming Location.
|
|
|
|
*/
|
|
|
|
export interface IRenameLocationDTO {
|
|
|
|
target: string;
|
|
|
|
new_location: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used for cloning {@link IRSForm}.
|
|
|
|
*/
|
|
|
|
export interface IRSFormCloneDTO extends Omit<ILibraryItem, 'time_create' | 'time_update' | 'owner'> {
|
|
|
|
items?: ConstituentaID[];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used for creating {@link IRSForm}.
|
|
|
|
*/
|
|
|
|
export interface ILibraryCreateDTO extends Omit<ILibraryItem, 'time_create' | 'time_update' | 'id' | 'owner'> {
|
|
|
|
file?: File;
|
|
|
|
fileName?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents update data for editing {@link ILibraryItem}.
|
|
|
|
*/
|
|
|
|
export interface ILibraryUpdateDTO
|
|
|
|
extends Omit<ILibraryItem, 'time_create' | 'time_update' | 'access_policy' | 'location' | 'owner'> {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create version metadata in persistent storage.
|
|
|
|
*/
|
|
|
|
export interface IVersionCreateDTO {
|
|
|
|
version: string;
|
|
|
|
description: string;
|
|
|
|
items?: ConstituentaID[];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data response when creating {@link IVersionInfo}.
|
|
|
|
*/
|
|
|
|
export interface IVersionCreatedResponse {
|
|
|
|
version: number;
|
|
|
|
schema: IRSFormData;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const libraryApi = {
|
|
|
|
baseKey: 'library',
|
|
|
|
libraryListKey: ['library', 'list'],
|
|
|
|
|
2025-01-28 19:45:31 +03:00
|
|
|
getItemQueryOptions: ({ itemID, itemType }: { itemID: LibraryItemID; itemType: LibraryItemType }) => {
|
|
|
|
return itemType === LibraryItemType.RSFORM
|
|
|
|
? rsformsApi.getRSFormQueryOptions({ itemID })
|
|
|
|
: ossApi.getOssQueryOptions({ itemID });
|
|
|
|
},
|
2025-01-23 19:41:31 +03:00
|
|
|
getLibraryQueryOptions: ({ isAdmin }: { isAdmin: boolean }) =>
|
|
|
|
queryOptions({
|
|
|
|
queryKey: libraryApi.libraryListKey,
|
|
|
|
staleTime: DELAYS.staleMedium,
|
|
|
|
queryFn: meta =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosGet<ILibraryItem[]>({
|
|
|
|
endpoint: isAdmin ? '/api/library/all' : '/api/library/active',
|
|
|
|
options: { signal: meta.signal }
|
|
|
|
})
|
2025-01-23 19:41:31 +03:00
|
|
|
}),
|
|
|
|
getTemplatesQueryOptions: () =>
|
|
|
|
queryOptions({
|
|
|
|
queryKey: [libraryApi.baseKey, 'templates'],
|
|
|
|
staleTime: DELAYS.staleMedium,
|
|
|
|
queryFn: meta =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosGet<ILibraryItem[]>({
|
|
|
|
endpoint: '/api/library/templates',
|
|
|
|
options: { signal: meta.signal }
|
|
|
|
})
|
2025-01-23 19:41:31 +03:00
|
|
|
}),
|
|
|
|
|
|
|
|
createItem: (data: ILibraryCreateDTO) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosPost<ILibraryCreateDTO, ILibraryItem>({
|
|
|
|
endpoint: !data.file ? '/api/library' : '/api/rsforms/create-detailed',
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: information.newLibraryItem
|
|
|
|
},
|
|
|
|
options: !data.file
|
|
|
|
? undefined
|
|
|
|
: {
|
2025-01-23 19:41:31 +03:00
|
|
|
headers: {
|
|
|
|
'Content-Type': 'multipart/form-data'
|
|
|
|
}
|
2025-01-28 19:45:31 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
updateItem: (data: ILibraryUpdateDTO) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosPatch<ILibraryUpdateDTO, ILibraryItem>({
|
|
|
|
endpoint: `/api/library/${data.id}`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: information.changesSaved
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
setOwner: ({ itemID, owner }: { itemID: LibraryItemID; owner: UserID }) =>
|
|
|
|
axiosPatch({
|
|
|
|
endpoint: `/api/library/${itemID}/set-owner`,
|
|
|
|
request: {
|
|
|
|
data: { user: owner },
|
|
|
|
successMessage: information.changesSaved
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
setLocation: ({ itemID, location }: { itemID: LibraryItemID; location: string }) =>
|
|
|
|
axiosPatch({
|
|
|
|
endpoint: `/api/library/${itemID}/set-location`,
|
|
|
|
request: {
|
|
|
|
data: { location: location },
|
|
|
|
successMessage: information.moveComplete
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
setAccessPolicy: ({ itemID, policy }: { itemID: LibraryItemID; policy: AccessPolicy }) =>
|
|
|
|
axiosPatch({
|
|
|
|
endpoint: `/api/library/${itemID}/set-access-policy`,
|
|
|
|
request: {
|
|
|
|
data: { access_policy: policy },
|
|
|
|
successMessage: information.changesSaved
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
setEditors: ({ itemID, editors }: { itemID: LibraryItemID; editors: UserID[] }) =>
|
|
|
|
axiosPatch({
|
|
|
|
endpoint: `/api/library/${itemID}/set-editors`,
|
|
|
|
request: {
|
|
|
|
data: { users: editors },
|
|
|
|
successMessage: information.changesSaved
|
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
|
|
|
|
deleteItem: (target: LibraryItemID) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosDelete({
|
|
|
|
endpoint: `/api/library/${target}`,
|
|
|
|
request: {
|
|
|
|
successMessage: information.itemDestroyed
|
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
cloneItem: (data: IRSFormCloneDTO) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosPost<IRSFormCloneDTO, IRSFormData>({
|
|
|
|
endpoint: `/api/library/${data.id}/clone`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: newSchema => information.cloneComplete(newSchema.alias)
|
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
renameLocation: (data: IRenameLocationDTO) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosPatch({
|
|
|
|
endpoint: '/api/library/rename-location',
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: information.locationRenamed
|
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
|
2025-01-28 19:45:31 +03:00
|
|
|
versionCreate: ({ itemID, data }: { itemID: LibraryItemID; data: IVersionData }) =>
|
|
|
|
axiosPost<IVersionData, IVersionCreatedResponse>({
|
|
|
|
endpoint: `/api/library/${itemID}/create-version`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: information.newVersion(data.version)
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
versionRestore: ({ versionID }: { versionID: VersionID }) =>
|
|
|
|
axiosPatch<undefined, IRSFormData>({
|
|
|
|
endpoint: `/api/versions/${versionID}/restore`,
|
|
|
|
request: {
|
|
|
|
successMessage: information.versionRestored
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
versionUpdate: ({ versionID, data }: { versionID: VersionID; data: IVersionData }) =>
|
|
|
|
axiosPatch<IVersionData, IVersionInfo>({
|
|
|
|
endpoint: `/api/versions/${versionID}`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
|
|
|
successMessage: information.changesSaved
|
|
|
|
}
|
|
|
|
}),
|
2025-01-23 19:41:31 +03:00
|
|
|
versionDelete: (data: { itemID: LibraryItemID; versionID: VersionID }) =>
|
2025-01-28 19:45:31 +03:00
|
|
|
axiosDelete({
|
|
|
|
endpoint: `/api/versions/${data.versionID}`,
|
|
|
|
request: {
|
|
|
|
successMessage: information.versionDestroyed
|
|
|
|
}
|
|
|
|
})
|
2025-01-23 19:41:31 +03:00
|
|
|
};
|