Browse Source

Implement storage logic

Use API call abstractions for implementations.
master
Allan Crisostomo 3 years ago
parent
commit
88ee8cf5e0
2 changed files with 50 additions and 7 deletions
  1. +1
    -1
      src/Storage.ts
  2. +49
    -6
      src/index.ts

+ 1
- 1
src/Storage.ts View File

@@ -1,7 +1,7 @@
import Storage, { Collection } from '../../core/src/storage'
import Engine from './Engine'

export default class RemoteStorage<T> implements Storage<T> {
export default class RemoteStorage<T = {}> implements Storage<T> {
private readonly engine: Engine<T, Collection<T>>

constructor(


+ 49
- 6
src/index.ts View File

@@ -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<PluginConfig> = config => ({
currentUserId,
}) => {
new Storage(currentUserId, config.baseUrl, 'notes')
new Storage(currentUserId, config.baseUrl, 'folders')
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

Loading…
Cancel
Save