/** * Collection management service */ import { transceivePost } from './transceive'; import type { CollectionListRequest, CollectionListResponse, CollectionExtantRequest, CollectionExtantResponse, CollectionFetchRequest, CollectionFetchResponse, CollectionCreateRequest, CollectionCreateResponse, CollectionUpdateResponse, CollectionUpdateRequest, CollectionDeleteResponse, CollectionDeleteRequest, CollectionInterface, } from '../types/collection'; import { useIntegrationStore } from '@KTXC/stores/integrationStore'; import { CollectionObject } from '../models'; /** * Helper to create the right collection model class based on provider identifier * Uses provider-specific factory if available, otherwise returns base CollectionObject */ function createCollectionObject(data: CollectionInterface): CollectionObject { const integrationStore = useIntegrationStore(); const factoryItem = integrationStore.getItemById('mail_collection_factory', data.provider) as any; const factory = factoryItem?.factory; // Use provider factory if available, otherwise base class return factory ? factory(data) : new CollectionObject().fromJson(data); } export const collectionService = { /** * Retrieve list of collections, optionally filtered by source selector * * @param request - list request parameters * * @returns Promise with collection object list grouped by provider, service, and collection identifier */ async list(request: CollectionListRequest = {}): Promise>>> { const response = await transceivePost('collection.list', request); // Convert nested response to CollectionObject instances const providerList: Record>> = {}; Object.entries(response).forEach(([providerId, providerServices]) => { const serviceList: Record> = {}; Object.entries(providerServices).forEach(([serviceId, serviceCollections]) => { const collectionList: Record = {}; Object.entries(serviceCollections).forEach(([collectionId, collectionData]) => { collectionList[collectionId] = createCollectionObject(collectionData); }); serviceList[serviceId] = collectionList; }); providerList[providerId] = serviceList; }); return providerList; }, /** * Retrieve a specific collection by provider and identifier * * @param request - fetch request parameters * * @returns Promise with collection object */ async fetch(request: CollectionFetchRequest): Promise { const response = await transceivePost('collection.fetch', request); return createCollectionObject(response); }, /** * Retrieve collection availability status for a given source selector * * @param request - extant request parameters * * @returns Promise with collection availability status */ async extant(request: CollectionExtantRequest): Promise { return await transceivePost('collection.extant', request); }, /** * Create a new collection * * @param request - create request parameters * * @returns Promise with created collection object */ async create(request: CollectionCreateRequest): Promise { const response = await transceivePost('collection.create', request); return createCollectionObject(response); }, /** * Update an existing collection * * @param request - update request parameters * * @returns Promise with updated collection object */ async update(request: CollectionUpdateRequest): Promise { const response = await transceivePost('collection.update', request); return createCollectionObject(response); }, /** * Delete a collection * * @param request - delete request parameters * * @returns Promise with deletion result */ async delete(request: CollectionDeleteRequest): Promise { return await transceivePost('collection.delete', request); }, }; export default collectionService;