From 7afd893fa131f85ffc656cf56d091625d7a03ea3 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:15:53 +0000 Subject: [PATCH] implement custom typeorm naming strategy --- apps/server/src/database/naming-strategy.ts | 61 +++++++++++++++++++++ apps/server/src/database/typeorm.config.ts | 2 + 2 files changed, 63 insertions(+) create mode 100644 apps/server/src/database/naming-strategy.ts diff --git a/apps/server/src/database/naming-strategy.ts b/apps/server/src/database/naming-strategy.ts new file mode 100644 index 0000000..120f4fa --- /dev/null +++ b/apps/server/src/database/naming-strategy.ts @@ -0,0 +1,61 @@ +import { DefaultNamingStrategy, Table } from 'typeorm'; + +export class NamingStrategy extends DefaultNamingStrategy { + primaryKeyName(tableOrName: Table | string, columnNames: string[]): string { + const tableName = this.normalizeTableName(tableOrName); + return `pk_${tableName}_${columnNames.join('_')}`; + } + + indexName( + tableOrName: Table | string, + columnNames: string[], + where?: string, + ): string { + const tableName = this.normalizeTableName(tableOrName); + + let name = `${tableName}_${columnNames.join('_')}`; + if (where) name += '_' + where; + + return `idx_${name}`; + } + + uniqueConstraintName( + tableOrName: Table | string, + columnNames: string[], + ): string { + const tableName = this.normalizeTableName(tableOrName); + + return `uq_${tableName}_${columnNames.join('_')}`; + } + + foreignKeyName( + tableOrName: Table | string, + columnNames: string[], + _referencedTablePath?: string, + _referencedColumnNames?: string[], + ): string { + const tableName = this.normalizeTableName(tableOrName); + const targetTable = this.normalizeTableName(_referencedTablePath); + + const name = `${tableName}_${targetTable}_${columnNames.join('_')}`; + return `fk_${name}`; + } + + relationConstraintName( + tableOrName: Table | string, + columnNames: string[], + where?: string, + ): string { + const tableName = this.normalizeTableName(tableOrName); + + let name = `${tableName}_${columnNames.join('_')}`; + if (where) name += '_' + where; + + return `rel_${name}`; + } + + normalizeTableName(tableOrName: Table | string): string { + const tableName = this.getTableName(tableOrName); + return tableName.replace('.', '_'); + } +} diff --git a/apps/server/src/database/typeorm.config.ts b/apps/server/src/database/typeorm.config.ts index a7433ff..4a96c2a 100644 --- a/apps/server/src/database/typeorm.config.ts +++ b/apps/server/src/database/typeorm.config.ts @@ -1,5 +1,6 @@ import { DataSource } from 'typeorm'; import * as dotenv from 'dotenv'; +import { NamingStrategy } from './naming-strategy'; dotenv.config(); export const AppDataSource: DataSource = new DataSource({ type: 'postgres', @@ -10,5 +11,6 @@ export const AppDataSource: DataSource = new DataSource({ migrations: ['src/**/migrations/*.{ts,js}'], subscribers: [], synchronize: false, + //namingStrategy: new NamingStrategy(), logging: process.env.NODE_ENV === 'development', });