|
|
@@ -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<PluginConfig> = ({ |
|
|
|
idAttribute = 'id', |
|
|
|
} = {}) => class LocalStorage 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, 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<PluginConfig> = 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 |