claire-framework
Version:
- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)
156 lines • 14.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ObjectValidationMetadata_1 = require("../validator/ObjectValidationMetadata");
const ClaireError_1 = require("../system/ClaireError");
const errors_1 = require("../system/errors");
const core_1 = require("../decorator/core");
const Utils_1 = require("../system/Utils");
class ModelMetadata extends ObjectValidationMetadata_1.ObjectValidationMetadata {
constructor() {
super();
}
getPrimaryKey() {
return this.fields.find(f => f.isPrimaryKey === true);
}
addField(field) {
this.fields.push(field);
}
getFieldByLogicName(fieldLogicName) {
return this.fields.find((f) => f.fieldLogicName === fieldLogicName);
}
getFieldByDataName(fieldDataName) {
return this.fields.find((f) => f.fieldDataName === fieldDataName);
}
getDefaultLogicValues() {
let result = {};
this.fields.forEach((field) => {
if (field.defaultValue !== undefined) {
// @ts-ignore
result[field.fieldLogicName] = typeof field.defaultValue === "function" ? field.defaultValue() : field.defaultValue;
}
});
return result;
}
static isNotEmptyMetadata(meta) {
return meta.tableName !== undefined
|| meta.fields.some((f) => f.fieldDataName !== undefined || f.isPrimaryKey !== undefined
|| f.isForeignKey !== undefined || f.isAutoIncrement !== undefined || f.isUnique !== undefined
|| f.referModel !== undefined || f.dataType !== undefined || f.nullable !== undefined || f.defaultValue !== undefined);
}
;
normalizeMetadata() {
//-- normalize the metadata
for (let i = this.fields.length - 1; i >= 0; i--) {
let field = this.fields[i];
//-- if field data name is null then get from field logic name
if (!field.fieldDataName) {
field.fieldDataName = field.fieldLogicName;
}
//-- if field inner type is null then get from field data type
if (!field.innerDataType) {
field.innerDataType = field.dataType;
}
//-- if field is get set then set the logic name
if (field.getSetField) {
field.fieldLogicName = field.getSetField;
}
}
}
assertValid() {
this.normalizeMetadata();
if (!this.tableName) {
throw new ClaireError_1.ClaireError(errors_1.INVALID_MODEL_METADATA, this.modelName);
}
let primaryKey = this.getPrimaryKey();
if (!primaryKey) {
throw new ClaireError_1.ClaireError(errors_1.TABLE_HAS_NO_PRIMARY_KEY, this.modelName);
}
if (!Utils_1.Utils.supportedPrimaryKeyDataTypes(primaryKey.dataType)) {
throw new ClaireError_1.ClaireError(errors_1.UNSUPPORTED_PRIMARY_KEY_DATA_TYPE, this.modelName);
}
this.fields.forEach((f) => {
if (f.fieldDataName === undefined || f.innerDataType === undefined) {
throw new ClaireError_1.ClaireError(errors_1.INVALID_MODEL_METADATA, this.modelName);
}
});
}
static fromModel(model) {
return model.prototype[core_1.METADATA];
}
static dependencySort(modelMetaData) {
let result = [];
let metaDataArray = modelMetaData.map((tableMetaData) => ({
metaData: tableMetaData,
dependencies: new Array()
}));
//-- first find all the dependencies of current table and add to the dependencies array
for (let i = 0; i < metaDataArray.length; i++) {
let metaData = metaDataArray[i];
//-- check for dependencies
let fields = metaData.metaData.fields;
for (let j = 0; j < fields.length; j++) {
let field = fields[j];
if (field.isForeignKey) {
if (!!field.referModel) {
let referredModel = modelMetaData.find(m => m.modelName === field.referModel);
if (!!referredModel && referredModel.modelName) {
if (referredModel.getPrimaryKey().innerDataType !== field.innerDataType) {
throw new ClaireError_1.ClaireError(errors_1.FOREIGN_KEY_TYPE_MISMATCHED, metaData.metaData.modelName);
}
metaData.dependencies.push(referredModel);
}
else {
throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, {
modelName: metaData.metaData.modelName,
fieldName: field.fieldDataName,
});
}
}
else {
throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, {
modelName: metaData.metaData.modelName,
fieldName: field.fieldDataName,
});
}
}
}
}
//-- add the dependant to the result array first, then add the dependencies. If dependencies are found to be before
//-- the dependant in the result array, circular happens
for (let i = 0; i < metaDataArray.length; i++) {
let currentElement = metaDataArray[i];
let currentElementIndex = result.findIndex(e => e === currentElement.metaData);
if (currentElementIndex < 0) {
//-- push the currentElement
result = [
...result, currentElement.metaData
];
currentElementIndex = result.length - 1;
}
//-- check dependencies index
for (let i = 0; i < currentElement.dependencies.length; i++) {
let dependencyIndex = result.findIndex(e => e === currentElement.dependencies[i]);
if (dependencyIndex < 0) {
//-- push dependency just before
result = [
...result.slice(0, currentElementIndex),
currentElement.dependencies[i],
...result.slice(currentElementIndex),
];
}
else {
//-- check for circular dependency
currentElementIndex = result.findIndex(e => e === currentElement.metaData);
if (dependencyIndex > currentElementIndex)
throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, {
target1: currentElement.metaData.modelName,
target2: result[dependencyIndex].modelName,
});
}
}
}
return result;
}
}
exports.ModelMetadata = ModelMetadata;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxNZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tb2RlbC9Nb2RlbE1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esb0ZBQStFO0FBQy9FLHVEQUFrRDtBQUNsRCw2Q0FNMEI7QUFFMUIsNENBQTJDO0FBQzNDLDJDQUFzQztBQUV0QyxNQUFhLGFBQWMsU0FBUSxtREFBd0I7SUFNdkQ7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBRSxDQUFDO0lBQzNELENBQUM7SUFFTSxRQUFRLENBQUMsS0FBOEI7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLGNBQXNCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLGtCQUFrQixDQUFDLGFBQXFCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLHFCQUFxQjtRQUN4QixJQUFJLE1BQU0sR0FBZSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENB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