documents.svelte.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import * as documentsApi from '$lib/api/documents';
  2. import { notificationsStore } from '$lib/stores/notifications.svelte';
  3. import { ResourceStore } from '$lib/stores/resources.svelte';
  4. import type { DocumentCR } from '$lib/types/custom-resources';
  5. import type { KBDocument, KBDocumentStatus } from '$lib/types/entities';
  6. const statusFromCR = (status: DocumentCR['status']): KBDocumentStatus => {
  7. if (!status || typeof status !== 'object') return 'pending';
  8. if (status.phase === 'Failed') return 'error';
  9. if (status.phase === 'Ready') return 'available';
  10. return 'pending';
  11. };
  12. type CRStatus = DocumentCR['status'];
  13. class DocumentsStore extends ResourceStore<KBDocument, CRStatus> {
  14. constructor() {
  15. super('Knowledge Base', [
  16. {
  17. group: 'locostack.com',
  18. version: 'v1alpha1',
  19. resources: 'documents',
  20. },
  21. ]);
  22. }
  23. protected resourceHref(id: string) {
  24. return `/workloads/kbs/${id}`;
  25. }
  26. protected apiGet(workspaceId: string, id: string) {
  27. return documentsApi.get(workspaceId, id);
  28. }
  29. protected apiGetStatus(workspaceId: string, id: string) {
  30. return documentsApi.getStatus(workspaceId, id);
  31. }
  32. protected apiCreate(workspaceId: string, doc: KBDocument) {
  33. return documentsApi.create(workspaceId, doc);
  34. }
  35. protected apiUpdate(workspaceId: string, doc: KBDocument) {
  36. return documentsApi.update(workspaceId, doc.id, doc);
  37. }
  38. protected apiDelete(workspaceId: string, id: string) {
  39. return documentsApi.remove(workspaceId, id);
  40. }
  41. protected onStatusChange(id: string, status: CRStatus, notify = true): void {
  42. const item = this.get(id);
  43. if (!item) return;
  44. const deploymentStatus = statusFromCR(status);
  45. notify = notify && item.status !== deploymentStatus;
  46. item.status = deploymentStatus;
  47. if (notify) {
  48. this.#notifyStatusChange(id, item.name, deploymentStatus);
  49. }
  50. }
  51. #notifyStatusChange(id: string, name: string, status: string): void {
  52. const href = this.resourceHref(id);
  53. notificationsStore.push({
  54. type: 'success',
  55. message: `Document "${name}" is now ${status}`,
  56. href,
  57. });
  58. }
  59. getDocuments(kbId: string): KBDocument[] {
  60. return this.list.filter((doc) => doc.kb.id === kbId);
  61. }
  62. async createDocuments(docs: KBDocument[]): Promise<void> {
  63. const result = await Promise.allSettled(
  64. docs.map((doc) => documentsApi.create(this.workspaceId, doc)),
  65. );
  66. const added = result.filter((r) => r.status === 'fulfilled').map((r) => r.value);
  67. this.list = [...this.list, ...added];
  68. }
  69. }
  70. const documentsStore = new DocumentsStore();
  71. export { documentsStore };