Files
twenty/packages/twenty-server/src/engine/metadata-modules/remote-server/remote-table/utils/get-remote-table-local-name.util.ts
T
Thomas Trompette 36e54119a3 Enable remotes with existing name (#5433)
- Check if a table with the same name already exists
- If yes, add a number suffix, and check again

Co-authored-by: Thomas Trompette <thomast@twenty.com>
2024-05-17 10:38:17 +02:00

60 lines
1.5 KiB
TypeScript

import { BadRequestException } from '@nestjs/common/exceptions';
import { singular } from 'pluralize';
import { DataSource } from 'typeorm';
import { camelCase } from 'src/utils/camel-case';
const MAX_SUFFIX = 10;
type RemoteTableLocalName = {
baseName: string;
suffix?: number;
};
const isNameAvailable = async (
tableName: string,
workspaceSchemaName: string,
workspaceDataSource: DataSource,
) => {
const numberOfTablesWithSameName = +(
await workspaceDataSource.query(
`SELECT count(table_name) FROM information_schema.tables WHERE table_name LIKE '${tableName}' AND table_schema IN ('core', 'metadata', '${workspaceSchemaName}')`,
)
)[0].count;
return numberOfTablesWithSameName === 0;
};
export const getRemoteTableLocalName = async (
distantTableName: string,
workspaceSchemaName: string,
workspaceDataSource: DataSource,
): Promise<RemoteTableLocalName> => {
const baseName = singular(camelCase(distantTableName));
const isBaseNameValid = await isNameAvailable(
baseName,
workspaceSchemaName,
workspaceDataSource,
);
if (isBaseNameValid) {
return { baseName };
}
for (let suffix = 2; suffix < MAX_SUFFIX; suffix++) {
const name = `${baseName}${suffix}`;
const isNameWithSuffixValid = await isNameAvailable(
name,
workspaceSchemaName,
workspaceDataSource,
);
if (isNameWithSuffixValid) {
return { baseName, suffix };
}
}
throw new BadRequestException('Table name is already taken.');
};