53 lines
1.1 KiB
TypeScript
53 lines
1.1 KiB
TypeScript
|
import { cloneDeep } from 'lodash';
|
||
|
|
||
|
declare global {
|
||
|
var db: any;
|
||
|
}
|
||
|
|
||
|
export const put = async (
|
||
|
_id: string,
|
||
|
type: string,
|
||
|
update: (doc: any) => any,
|
||
|
defaultDoc: any
|
||
|
) => {
|
||
|
var current;
|
||
|
try {
|
||
|
current = await db.get(_id);
|
||
|
} catch {
|
||
|
current = { _rev: undefined, doc: cloneDeep(defaultDoc) };
|
||
|
}
|
||
|
try {
|
||
|
db.put({ _id, _rev: current._rev, type, doc: update(current.doc) });
|
||
|
} catch (error: any) {
|
||
|
if (error.name === 'conflict') {
|
||
|
await put(_id, type, update, defaultDoc);
|
||
|
} else {
|
||
|
console.error(
|
||
|
`put(${_id}, ${JSON.stringify(
|
||
|
update(current.doc)
|
||
|
)}), error: ${JSON.stringify(error)}`
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
export const getFamily = async (key: string, options: any = {}) => {
|
||
|
return await db.allDocs({
|
||
|
startkey: key,
|
||
|
endkey: key + '\ufff0',
|
||
|
...options,
|
||
|
});
|
||
|
};
|
||
|
|
||
|
export const get = async (id: string) => {
|
||
|
await db.get(id);
|
||
|
};
|
||
|
|
||
|
export const putAll = async (docs: any[]) => {
|
||
|
return await db.bulkDocs(docs);
|
||
|
};
|
||
|
|
||
|
export const getDocsByType = async (type: string) => {
|
||
|
return (await db.find({ selector: { type: type } })).docs;
|
||
|
};
|