diff --git a/frontend/services/bookstack.ts b/frontend/services/bookstack.ts new file mode 100644 index 0000000..967755c --- /dev/null +++ b/frontend/services/bookstack.ts @@ -0,0 +1,66 @@ +import type { + BookStackSettings, + BookStackSettingsWrite, + BookStackTestResult, + BookStackShelf, + BookStackLink, + BookStackLinkCreate, + BookStackSearchResult, +} from './dto/bookstack' +import type { HydraCollection } from '~/utils/api' +import { extractHydraMembers } from '~/utils/api' + +export function useBookStackService() { + const api = useApi() + + async function getSettings(): Promise { + return api.get('/settings/bookstack') + } + + async function saveSettings(payload: BookStackSettingsWrite): Promise { + return api.put('/settings/bookstack', payload as Record, { + toastSuccessKey: 'bookstack.settings.saved', + }) + } + + async function testConnection(): Promise { + return api.post('/settings/bookstack/test') + } + + async function listShelves(): Promise { + const data = await api.get>('/bookstack/shelves') + return extractHydraMembers(data) + } + + async function getLinks(taskId: number): Promise { + const data = await api.get>(`/tasks/${taskId}/bookstack/links`) + return extractHydraMembers(data) + } + + async function addLink(taskId: number, payload: BookStackLinkCreate): Promise { + return api.post(`/tasks/${taskId}/bookstack/links`, payload as Record) + } + + async function removeLink(taskId: number, linkId: number): Promise { + await api.delete(`/tasks/${taskId}/bookstack/links/${linkId}`) + } + + async function search(taskId: number, query: string): Promise { + const data = await api.get>( + `/tasks/${taskId}/bookstack/search`, + { q: query }, + ) + return extractHydraMembers(data) + } + + return { + getSettings, + saveSettings, + testConnection, + listShelves, + getLinks, + addLink, + removeLink, + search, + } +}