claire-framework
Version:
- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)
256 lines • 23.8 kB
JavaScript
"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.schema.modelConnection;
for (const filter of filters) {
dataObjects = filter(dataObjects);
}
//-- 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;
});
}
getMany(queries, options) {
return __awaiter(this, void 0, void 0, function* () {
const filters = queries ? this.getQueryObjectFromQueryConditions(queries) : [];
let dataObjects = this.schema.modelConnection;
for (const filter of filters) {
dataObjects = filter(dataObjects);
}
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 dataObjects = this.schema.modelConnection;
for (const filter of filters) {
dataObjects = filter(dataObjects);
}
let dataUpdate = this.convertToDataObjects([update])[0];
dataObjects.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 dataObjects.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.reduce((collector, q) => collector.concat(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]));
};
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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