diff --git a/src/Storage.ts b/src/Storage.ts index 62bd7df..0c00d90 100644 --- a/src/Storage.ts +++ b/src/Storage.ts @@ -1,7 +1,7 @@ import Storage, { Collection, OutOfSyncError } from '../../core/src/storage' import Engine from './Engine' -export default class LocalStorage implements Storage { +export default class LocalStorage implements Storage { private readonly engine: Engine> constructor( diff --git a/src/index.ts b/src/index.ts index e25e74d..fef911d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,56 @@ -import { Plugin } from '../../core/src/plugin' +import { Plugin, StoragePlugin, } from '../../core/src/plugin' import Storage from './Storage' -type PluginConfig = {} +type PluginConfig = { + idAttribute?: string, +} + +const AVAILABLE_COLLECTIONS = ['notes', 'folders'] as const + +const localStorageFactory: Plugin = ({ + idAttribute = 'id', +} = {}) => class LocalStorage 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, 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) + } -const LocalStoragePlugin: Plugin = config => ({ - currentUserId, -}) => { - new Storage(currentUserId, 'notes') - new Storage(currentUserId, 'folders') + 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 LocalStoragePlugin +export default localStorageFactory