diff --git a/src/Storage.ts b/src/Storage.ts index a9a37f1..5c6cf88 100644 --- a/src/Storage.ts +++ b/src/Storage.ts @@ -1,7 +1,7 @@ import Storage, { Collection } from '../../core/src/storage' import Engine from './Engine' -export default class RemoteStorage implements Storage { +export default class RemoteStorage implements Storage { private readonly engine: Engine> constructor( diff --git a/src/index.ts b/src/index.ts index 873b4d5..b454da8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,15 +1,58 @@ -import { Plugin } from '../../core/src/plugin' +import { Plugin, StoragePlugin } from '../../core/src/plugin' import Storage from './Storage' type PluginConfig = { baseUrl: string, + idAttribute?: string, } -const RemoteStoragePlugin: Plugin = config => ({ - currentUserId, -}) => { - new Storage(currentUserId, config.baseUrl, 'notes') - new Storage(currentUserId, config.baseUrl, 'folders') +const AVAILABLE_COLLECTIONS = ['notes', 'folders'] as const + +const RemoteStoragePlugin: Plugin = ({ + baseUrl, + idAttribute = 'id', +}) => class RemoteStorage implements StoragePlugin { + private readonly storageMap: Record + + public static readonly type: 'storage' + + constructor({ currentUserId, }) { + this.storageMap = AVAILABLE_COLLECTIONS.reduce( + (theStorages, collectionId) => ({ + ...theStorages, + [collectionId]: new Storage(currentUserId, baseUrl, collectionId) + }), + {} + ) + } + + async save(collectionId, item) { + const { [collectionId]: storage = null } = this.storageMap + if (storage === null) { + throw new Error(`Invalid collection "${collectionId}"`) + } + return storage.saveItem(item) + } + + async load(collectionId, itemId) { + const { [collectionId]: storage = null } = this.storageMap + if (storage === null) { + throw new Error(`Invalid collection "${collectionId}"`) + } + const items = await storage.queryItems() + if (!itemId) { + return items + } + return items.filter(i => i[idAttribute] === itemId) + } + + async remove(collectionId, item) { + const { [collectionId]: storage = null } = this.storageMap + if (storage === null) { + throw new Error(`Invalid collection "${collectionId}"`) + } + return storage.deleteItem(item) + } } export default RemoteStoragePlugin