import { underscore } from '@angular-devkit/core/src/utils/strings'; import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; import { Model, ModelRelation, ClassRelationEnum } from '@vmfvmf/ywtc-lib'; import { error } from 'console'; import { getPrjSrd } from '../../router.gen'; let fileName = 'create-relations-fks.sql'; export function gen(model: Model): Rule { return (tree: Tree, _context: SchematicContext) => { const createRelationsFksSqlPath = `ywtc-output/${getPrjSrd().prjNDashd}-backend/sql/${fileName}`; const updatedCreateRelationsFksSql = updateCreateRelationsFksSql(getFileContent(tree, createRelationsFksSqlPath)!, model); tree.overwrite(createRelationsFksSqlPath, updatedCreateRelationsFksSql); return tree; }; } function getFileContent(tree: Tree, fileName: string) { if (!tree.exists(fileName)) { throw new Error(`File: ${fileName} NOT FOUND.`) } return tree.read(fileName)?.toString(); } // fks are created on child side ever. function updateCreateRelationsFksSql(content: string, model: Model) { const jtcAdd = '/*JTCADD*/'; if (content.includes(jtcAdd)) { let txt = getFks(model); if (txt) { content = content.replace(jtcAdd, `${txt}\n\n${jtcAdd}`); } } else { throw error(`The ${fileName} file is missing ${jtcAdd}!!!`); } return content; } function getFks(model: Model) { return model.relations .filter((rel: ModelRelation) => ([ClassRelationEnum.ManyToOne].includes(rel.relation))) .map((rel: ModelRelation) => getFk(underscore(model.name), underscore(rel.toModelName))) .join('\n\n') + model.relations .filter((rel: ModelRelation) => ([ClassRelationEnum.OneToOne].includes(rel.relation))) .map((rel: ModelRelation) => getFk(underscore(model.name), underscore(rel.toModelName))) .join('\n\n'); } function getFk(tableWithFk: string, otherTable: string) { return `ALTER TABLE ${getPrjSrd().dbName}.${tableWithFk} ADD \tCONSTRAINT \`fk_${tableWithFk}_${otherTable}\` \tFOREIGN KEY (\`${otherTable}_id\`) \tREFERENCES \`${getPrjSrd().dbName}\`.\`${otherTable}\` (\`id\`) \tON DELETE CASCADE \tON UPDATE RESTRICT;`; }