|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import { Plugin, StoragePlugin } from '../../core/src/plugin'
- import Storage from './Storage'
-
- type PluginConfig = {
- baseUrl: string,
- idAttribute?: string,
- }
-
- const AVAILABLE_COLLECTIONS = ['notes', 'folders'] as const
-
- const RemoteStoragePlugin: Plugin<PluginConfig> = ({
- baseUrl,
- idAttribute = 'id',
- }) => class RemoteStorage implements StoragePlugin {
- private readonly storageMap: Record<string, Storage>
-
- 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
|