datasquirel/package-shared/shell/utils/handle-table-foreign-key.ts
2026-01-03 05:34:24 +01:00

61 lines
1.7 KiB
TypeScript

import {
DSQL_FieldSchemaType,
DSQL_ForeignKeyType,
DSQL_MYSQL_FOREIGN_KEYS_Type,
} from "../../types";
import dbHandler from "../../functions/backend/dbHandler";
type Param = {
dbFullName: string;
tableName: string;
fields: DSQL_FieldSchemaType[];
clone?: boolean;
};
/**
* Handle MYSQL Foreign Keys
* ===================================================
* @description Iterate through each datasquirel schema
* table index(if available), and perform operations
*/
export default async function handleTableForeignKey({
dbFullName,
tableName,
fields,
clone,
}: Param) {
let addFkSQL = `ALTER TABLE \`${dbFullName}\`.\`${tableName}\``;
for (let i = 0; i < fields.length; i++) {
const { fieldName, foreignKey } = fields[i];
if (!clone && foreignKey && fieldName) {
const {
destinationTableName,
destinationTableColumnName,
cascadeDelete,
cascadeUpdate,
foreignKeyName,
} = foreignKey;
addFkSQL += ` ADD CONSTRAINT \`${foreignKeyName}\` FOREIGN KEY (\`${fieldName}\`)`;
addFkSQL += ` REFERENCES \`${destinationTableName}\`(\`${destinationTableColumnName}\`)`;
if (cascadeDelete) addFkSQL += ` ON DELETE CASCADE`;
if (cascadeUpdate) addFkSQL += ` ON UPDATE CASCADE`;
addFkSQL += `,`;
}
}
const finalAddFKSQL = addFkSQL.endsWith(",")
? addFkSQL.replace(/\,$/, "")
: undefined;
if (finalAddFKSQL) {
const addForeignKey = (await dbHandler({
query: finalAddFKSQL,
})) as any;
}
}