UNPKG

vulcain-corejs

Version:
231 lines (229 loc) 7.73 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments)).next()); }); }; const fs = require("fs"); const mongoQueryParser_1 = require("./mongoQueryParser"); /** * Default memory provider */ class MemoryProvider { /** * Create a memory provider instance. * @param dataFolder : (optional) if provided, data will be persisted on disk on EVERY create, update or delete */ constructor(dataFolder) { this.dataFolder = dataFolder; } get address() { return "memory"; } initializeTenantAsync(tenant) { if (!tenant) throw new Error("Tenant can not be null"); let folder = this.dataFolder; if (this.dataFolder) { if (!fs.existsSync(folder)) fs.mkdirSync(folder); folder = folder + '/' + tenant; if (!fs.existsSync(folder)) fs.mkdirSync(folder); } this.state = { schemas: new Map(), folder }; return Promise.resolve(() => { this.state = null; }); } ensureSchema(schema) { let schemaInfo = this.state.schemas.get(schema.name); if (!schemaInfo) { schemaInfo = { data: {} }; if (this.state.folder) { schemaInfo.saveToFile = this.state.folder + "/" + schema.description.storageName + ".json"; if (fs.existsSync(schemaInfo.saveToFile)) { schemaInfo.data = JSON.parse(fs.readFileSync(schemaInfo.saveToFile, "UTF-8")); } } this.state.schemas.set(schema.name, schemaInfo); } return schemaInfo.data; } save(schema) { let schemaInfo = this.state.schemas.get(schema.name); if (!schemaInfo.saveToFile) return; fs.writeFileSync(schemaInfo.saveToFile, JSON.stringify(schemaInfo.data), "UTF-8"); } static clone(obj) { return obj && Object.assign({}, obj); } /** * Return a list of entities * @param options * @returns {Promise} */ getAllAsync(schema, options) { let data = this.ensureSchema(schema); options = options || { maxByPage: -1 }; return new Promise((resolve, reject) => { try { let result = Array.from(this.take(schema, data[schema.description.storageName], options)); options.length = result.length; resolve(result); } catch (err) { reject(err); } }); } *take(schema, list, options) { let take = options.maxByPage || -1; let skip = take * (options.page || 0); let cx = 0; let query = new mongoQueryParser_1.MongoQueryParser(options.query.filter || options.query); if (list) { for (let k in list) { let v = list[k]; if (!v || !query.execute(v)) continue; if (cx < skip) { cx++; continue; } if (take < 0 || cx < skip + take) { cx++; yield MemoryProvider.clone(v); } else break; } } } findOneAsync(schema, query) { return __awaiter(this, void 0, void 0, function* () { let options = {}; options.query = query; let list = yield this.getAllAsync(schema, options); return list && list.length > 0 ? list[0] : null; }); } /** * Read an entity * @param name * @returns {Promise} */ getAsync(schema, name) { let data = this.ensureSchema(schema); const self = this; return new Promise((resolve, reject) => { try { let list = data[schema.description.storageName]; resolve(list && MemoryProvider.clone(list[name] || [])); } catch (err) { reject(err); } }); } /** * Delete an entity * @param id * @returns {Promise} */ deleteAsync(schema, old) { if (!old) throw new Error("Argument is required"); let data = this.ensureSchema(schema); let self = this; return new Promise((resolve, reject) => { try { let id; if (typeof old === "string") id = old; else id = schema.getId(old); let list = data[schema.description.storageName]; if (list && list[id]) { delete list[id]; self.save(schema); resolve(true); } else { resolve(false); } } catch (err) { reject(err); } }); } /** * Persist an entity * @param entity * @returns {Promise} */ createAsync(schema, entity) { if (!entity) throw new Error("Entity is required"); let data = this.ensureSchema(schema); const self = this; entity._created = new Date().toUTCString(); return new Promise((resolve, reject) => { try { let list = data[schema.description.storageName]; if (!list) { list = {}; data[schema.description.storageName] = list; } let name = schema.getId(entity); if (!name) throw new Error(`Can not create a ${schema.name} entity with undefined id ${schema.getIdProperty()} `); if (list[name]) { reject(new Error(`Can not add existing ${schema.name} ${name}`)); return; } list[name] = MemoryProvider.clone(entity); self.save(schema); resolve(entity); } catch (err) { reject(err); } }); } /** * Update an entity * @param entity * @param old * @returns {Promise<T>} */ updateAsync(schema, entity, old) { if (!entity) throw new Error("Entity is required"); let data = this.ensureSchema(schema); entity._updated = new Date().toUTCString(); let self = this; return new Promise((resolve, reject) => { try { let list = data[schema.description.storageName]; let name = schema.getId(entity); if (!list || !list[name]) { reject("Entity doesn't exist. " + name); return; } entity = schema.deepAssign(list[name], entity); list[name] = MemoryProvider.clone(entity); self.save(schema); resolve(entity); } catch (err) { reject(err); } }); } } exports.MemoryProvider = MemoryProvider; //# sourceMappingURL=provider.js.map