import { Rule } from '@angular-devkit/schematics'; import { dasherize } from '@angular-devkit/core/src/utils/strings'; import { ClassRelationEnum, Model, JavaFieldType, ModelField, ModelRelation } from '@vmfvmf/ywtc-lib'; import { BackEndGenerator } from '../../../shared/generator'; import { getEnumById, getModelById, getPrjSrd } from '../../../router.gen'; export function gen(model: Model): Rule { model = new Model(model); let fkColumnsDeclaration = getFkColumnsDeclaration(model); if (fkColumnsDeclaration) { fkColumnsDeclaration = "\n\t" + fkColumnsDeclaration; } const columnsDeclaration = getColumnsDeclaration(model.fields); return new BackEndGenerator(__filename).gen({ ...model, ...getPrjSrd(), columnsDeclaration, fkColumnsDeclaration }); } function getColumnsDeclaration(fields: ModelField[]) { return fields .map(f => getColumnDeclaration(f)).join(`,\n\t`) + ','; } function getFkColumnsDeclaration(model: Model) { let r = []; r.push(...model.relations .filter((rel: ModelRelation) => [ClassRelationEnum.OneToOne, ClassRelationEnum.ManyToOne].includes(rel.relation)) // fk on parent .map(r => `\`${r.name}_id\` BIGINT NOT NULL`)); r.push(...model.othersideRelations .filter((orel: ModelRelation) => [ClassRelationEnum.OneToMany].includes(orel.relation)) // fk on child, on child its a ManyToOne .map(orel => `\`${getModelById(orel.modelId).name.toLowerCase()}_id\` BIGINT NOT NULL`)); let ret = r.join(`,\n\t`); if (ret.length > 0) return ret + ','; return ''; } function getColumnDeclaration(field: ModelField) { // var field = new ModelField(ifield); const fieldName = dasherize(field.name!).replace('-', '_'); return `\`${field.colName || fieldName}\` ${getMysqlTypeForModelField(field)}${field.getColNullable() == false ? ' NOT NULL' : ''}`; } function getMysqlTypeForModelField(ifield: ModelField) { var field = new ModelField(ifield); let sqlColType = field.colLongText ? 'TEXT': javaTypeMySqlMap.get(field.javaType!); if (sqlColType === 'VARCHAR') { return `${sqlColType}(${field.getColLength() || 255})` } else if (sqlColType === 'ENUM') { const enumDef = getEnumById(field.enumDefId); return `${field.collection ? 'SET': sqlColType}(${enumDef.options!.map(e => `'${e.value}'`).join(',')})`; } return sqlColType; } const javaTypeMySqlMap = new Map([ [JavaFieldType.BigDecimal,'DECIMAL'], [JavaFieldType.Boolean,'TINYINT'], [JavaFieldType.Double,'DOUBLE'], [JavaFieldType.Enum,'ENUM'], [JavaFieldType.Float,'FLOAT'], [JavaFieldType.Integer,'INTEGER'], [JavaFieldType.LocalDate,'DATE'], [JavaFieldType.LocalDateTime,'DATETIME'], [JavaFieldType.Long,'BIGINT'], [JavaFieldType.String,'VARCHAR'], ]);