claire-framework
Version:
- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)
159 lines • 14.4 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);
}
if (primaryKey.isAutoGen) {
throw new ClaireError_1.ClaireError(errors_1.NO_SKIP_PRIMARY_KEY, 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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