UNPKG

claire-framework

Version:

- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)

266 lines 24.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const AbstractDatabaseAdapter_1 = require("../database/AbstractDatabaseAdapter"); const ClaireError_1 = require("../system/ClaireError"); const errors_1 = require("../system/errors"); const AbstractQuery_1 = require("../model/AbstractQuery"); const QueryOperator_1 = require("../model/QueryOperator"); const Utils_1 = require("../system/Utils"); class InMemoryAdapter extends AbstractQuery_1.AbstractQuery { constructor(model, modelMetadata, schema) { super(model, modelMetadata); this.autoPrimaryKey = 1; this.model = model; this.schema = schema; this.schema.modelConnection = []; } insert(dataObject) { this.currentMetadata.fields.forEach(f => { const fieldDataName = f.fieldDataName; //-- populate automatic primary key if (f.isPrimaryKey && f.isAutoIncrement) { dataObject[fieldDataName] = Utils_1.Utils.isIntegerDataTypes(f.dataType) ? this.autoPrimaryKey : String(this.autoPrimaryKey); this.autoPrimaryKey++; } //-- check unique constraint if (f.isUnique) { //-- find in the data const matched = this.schema.modelConnection.find((r) => r[fieldDataName] === dataObject[fieldDataName]); if (matched) { throw `Unique constraint failed for ${fieldDataName}`; } } //-- check nullable constraint if (f.nullable && dataObject[fieldDataName] === undefined) { throw `Field ${fieldDataName} is required but missing`; } }); } multipleSort(data, sort) { data.sort((d1, d2) => { let result = 0; Object.keys(sort).some((key) => { if (d1[key] < d2[key]) { // @ts-ignore if (sort[key] === "asc") result = -1; // @ts-ignore if (sort[key] === "desc") result = 1; } if (d1[key] > d2[key]) { // @ts-ignore if (sort[key] === "asc") result = 1; // @ts-ignore if (sort[key] === "desc") result = -1; } return result !== 0; }); return result; }); } deleteMany(queries) { return __awaiter(this, void 0, void 0, function* () { const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : []; let dataObjects = this.getObjectsFromFilters(this.schema.modelConnection, filters); //-- remove from collection dataObjects.forEach(obj => { const index = this.schema.modelConnection.indexOf(obj); if (index >= 0) { this.schema.modelConnection.splice(index, 1); } }); return dataObjects.length; }); } deleteOne(modelInstance) { return __awaiter(this, void 0, void 0, function* () { const primaryKey = this.currentMetadata.getPrimaryKey(); const index = this.schema.modelConnection.findIndex((r) => r[primaryKey.fieldDataName] === modelInstance[primaryKey.fieldLogicName]); if (index >= 0) { this.schema.modelConnection.splice(index, 1); } return modelInstance; }); } getObjectsFromFilters(objects, filters) { let result = []; for (const filterArray of filters) { let allObjects = objects.slice(); for (const filter of filterArray) { allObjects = filter(allObjects); } allObjects.forEach(obj => { if (!result.includes(obj)) { result.push(obj); } }); } return result; } getMany(queries, options) { return __awaiter(this, void 0, void 0, function* () { const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : []; let dataObjects = this.getObjectsFromFilters(this.schema.modelConnection, filters); let logicObjects = this.convertToLogicObjects(dataObjects); logicObjects = logicObjects.map(obj => (Object.assign(Object.assign({}, this.currentMetadata.getDefaultLogicValues()), { obj }))); if (options) { if (options.order) { this.multipleSort(logicObjects, options.order); } if (options.projection) { logicObjects = logicObjects.map(obj => { let projected = {}; options.projection.forEach(logicKey => { // @ts-ignore projected[logicKey] = obj[logicKey]; }); return projected; }); } if (options.limit) { logicObjects = logicObjects.slice((options.page - 1) * options.limit, options.page * options.limit); } } return logicObjects; }); } getOne(queries, options) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.getMany(queries, options); return result[0]; }); } rawQuery(query) { return __awaiter(this, void 0, void 0, function* () { throw new ClaireError_1.ClaireError(errors_1.NOT_SUPPORTED); }); } saveMany(modelInstances) { return __awaiter(this, void 0, void 0, function* () { return modelInstances.map((modelInstance) => { const dataObject = this.convertToDataObjects([Object.assign({}, this.currentMetadata.getDefaultLogicValues(), modelInstance)])[0]; this.insert(dataObject); return Object.assign({}, this.currentMetadata.getDefaultLogicValues(), dataObject); }); }); } saveOne(modelInstance) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.saveMany([modelInstance]); return result[0]; }); } updateMany(queries, update) { return __awaiter(this, void 0, void 0, function* () { const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : []; let objects = this.getObjectsFromFilters(this.schema.modelConnection, filters); let dataUpdate = this.convertToDataObjects([update])[0]; objects.forEach(obj => { const index = this.schema.modelConnection.indexOf(obj); if (index >= 0) { this.schema.modelConnection = Object.assign(Object.assign({}, this.schema.modelConnection[index]), dataUpdate); } }); return objects.length; }); } updateOne(modelInstance) { return __awaiter(this, void 0, void 0, function* () { let dataObject = this.convertToDataObjects([modelInstance])[0]; const primaryKey = this.currentMetadata.getPrimaryKey(); const index = this.schema.modelConnection.findIndex((r) => r[primaryKey.fieldDataName] === modelInstance[primaryKey.fieldLogicName]); if (index < 0) { throw new ClaireError_1.ClaireError(errors_1.RECORD_NOT_FOUND); } this.schema.modelConnection[index] = Object.assign(Object.assign({}, this.schema.modelConnection[index]), dataObject); return Object.assign(Object.assign({}, this.convertToLogicObjects([this.schema.modelConnection[index]])[0]), modelInstance); }); } getQueryObjectFromQueryConditions(queries) { return queries.map((q) => Object.keys(q).map((key) => { // @ts-ignore const operator = q[key]; let dataKey = this.currentMetadata.getFieldByLogicName(key).fieldDataName; switch (operator.operator) { case QueryOperator_1.Operator.COMMON_EQUALITY: return (records) => { return records.filter((r) => r[dataKey] === operator.value); }; case QueryOperator_1.Operator.COMMON_BELONG: return (records) => { return records.filter((r) => operator.value.includes(r[dataKey])); }; case QueryOperator_1.Operator.COMMON_INEQUALITY: return (records) => { return records.filter((r) => r[dataKey] !== operator.value); }; case QueryOperator_1.Operator.NUMBER_GT: return (records) => { return records.filter((r) => r[dataKey] > operator.value); }; case QueryOperator_1.Operator.NUMBER_LT: return (records) => { return records.filter((r) => r[dataKey] < operator.value); }; case QueryOperator_1.Operator.NUMBER_GTE: return (records) => { return records.filter((r) => r[dataKey] >= operator.value); }; case QueryOperator_1.Operator.NUMBER_LTE: return (records) => { return records.filter((r) => r[dataKey] <= operator.value); }; case QueryOperator_1.Operator.STRING_CONTAIN: return (records) => { return records.filter((r) => r[dataKey].indexOf(operator.value) >= 0); }; case QueryOperator_1.Operator.STRING_REGEX: const regx = new RegExp(operator.value); return (records) => { return records.filter((r) => !!regx.exec(r[dataKey])); }; case QueryOperator_1.Operator.NUMBER_BETWEEN: return (records) => { return records.filter((r) => r[dataKey] >= operator.value.start && r[dataKey] <= operator.value.end); }; default: return (records) => { return records; }; } })); } } exports.InMemoryAdapter = InMemoryAdapter; class DefaultInMemoryDatabaseAdapter extends AbstractDatabaseAdapter_1.AbstractDatabaseAdapter { constructor() { super(); } use(model) { let modelAdapter = this.modelAdapters.get(model.name); let modelMetaData = this.modelMetadata.find((meta) => meta.modelName === model.name); if (!modelAdapter) { modelAdapter = new InMemoryAdapter(model, modelMetaData, this.schemas[model.name]); this.modelAdapters.set(model.name, modelAdapter); } // @ts-ignore return modelAdapter; } createTransaction() { throw new ClaireError_1.ClaireError(errors_1.NOT_SUPPORTED); } } exports.DefaultInMemoryDatabaseAdapter = DefaultInMemoryDatabaseAdapter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEluTWVtb3J5RGF0YWJhc2VBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2RlZmF1bHQtaW1wbGVtZW50YXRpb25zL0RlZmF1bHRJbk1lbW9yeURhdGFiYXNlQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGlGQUE0RTtBQUM1RSx1REFBa0Q7QUFJbEQsNkNBQWlFO0FBRWpFLDBEQUFxRDtBQUNyRCwwREFBK0Q7QUFDL0QsMkNBQXNDO0FBRXRDLE1BQWEsZUFBbUIsU0FBUSw2QkFBZ0I7SUFNcEQsWUFBbUIsS0FBaUMsRUFBRSxhQUE0QixFQUFFLE1BQWdDO1FBQ2hILEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFMeEIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFNL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBZTtRQUUxQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGFBQWMsQ0FBQztZQUV2QyxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxhQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN0SCxJQUFJLENBQUMsY0FBYyxFQUFFLENB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