feat: conditional schema based on column map instead of column field (#1978)

* feat: wip conditional schema based on column map instead of column field

* feat: conditionalSchema columnMap and singular plural

* fix: remove uuid fix

* feat: add name and label (singular/plural) drop old tableColumnName
This commit is contained in:
Jérémy M
2023-10-12 18:28:27 +02:00
committed by GitHub
parent 8fbad7d3ba
commit 4e993316a6
44 changed files with 1577 additions and 311 deletions

View File

@ -13,7 +13,22 @@ export class CreateFieldInput {
@IsString()
@IsNotEmpty()
@Field()
displayName: string;
nameSingular: string;
@IsString()
@IsOptional()
@Field({ nullable: true })
namePlural?: string;
@IsString()
@IsNotEmpty()
@Field()
labelSingular: string;
@IsString()
@IsOptional()
@Field({ nullable: true })
labelPlural?: string;
// Todo: use a type enum and share with typeorm entity
@IsEnum([

View File

@ -7,7 +7,22 @@ export class UpdateFieldInput {
@IsString()
@IsOptional()
@Field({ nullable: true })
displayName: string;
nameSingular?: string;
@IsString()
@IsOptional()
@Field({ nullable: true })
namePlural?: string;
@IsString()
@IsOptional()
@Field({ nullable: true })
labelSingular?: string;
@IsString()
@IsOptional()
@Field({ nullable: true })
labelPlural?: string;
@IsString()
@IsOptional()

View File

@ -50,11 +50,23 @@ export class FieldMetadata {
type: string;
@Field()
@Column({ nullable: false, name: 'display_name' })
displayName: string;
@Column({ nullable: false, name: 'name_singular' })
nameSingular: string;
@Column({ nullable: false, name: 'target_column_name' })
targetColumnName: string;
@Field()
@Column({ nullable: true, name: 'name_plural' })
namePlural: string;
@Field()
@Column({ nullable: false, name: 'label_singular' })
labelSingular: string;
@Field()
@Column({ nullable: true, name: 'label_plural' })
labelPlural: string;
@Column({ nullable: false, name: 'target_column_map', type: 'jsonb' })
targetColumnMap: FieldMetadataTargetColumnMap;
@Field({ nullable: true })
@Column({ nullable: true, name: 'description', type: 'text' })
@ -68,9 +80,6 @@ export class FieldMetadata {
@Column({ nullable: true, name: 'placeholder' })
placeholder: string;
@Column({ nullable: true, name: 'target_column_map', type: 'jsonb' })
targetColumnMap: FieldMetadataTargetColumnMap;
@Column('text', { nullable: true, array: true })
enums: string[];

View File

@ -11,17 +11,12 @@ import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm';
import { FieldMetadata } from 'src/metadata/field-metadata/field-metadata.entity';
import {
convertFieldMetadataToColumnChanges,
convertMetadataTypeToColumnType,
generateColumnName,
generateTargetColumnMap,
} from 'src/metadata/field-metadata/utils/field-metadata.util';
import { MigrationRunnerService } from 'src/metadata/migration-runner/migration-runner.service';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { ObjectMetadataService } from 'src/metadata/object-metadata/services/object-metadata.service';
import {
TenantMigrationColumnChange,
TenantMigrationTableChange,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
import { TenantMigrationTableChange } from 'src/metadata/tenant-migration/tenant-migration.entity';
@Injectable()
export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
@ -49,7 +44,8 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
const fieldAlreadyExists = await this.fieldMetadataRepository.findOne({
where: {
displayName: record.displayName,
nameSingular: record.nameSingular,
namePlural: record.namePlural,
objectId: record.objectId,
workspaceId: record.workspaceId,
},
@ -61,7 +57,6 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
const createdFieldMetadata = await super.createOne({
...record,
targetColumnName: generateColumnName(record.displayName), // deprecated
targetColumnMap: generateTargetColumnMap(record.type),
});
@ -69,15 +64,7 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
{
name: objectMetadata.targetTableName,
change: 'alter',
columns: [
...convertFieldMetadataToColumnChanges(createdFieldMetadata),
// Deprecated
{
name: createdFieldMetadata.targetColumnName,
type: convertMetadataTypeToColumnType(record.type),
change: 'create',
} satisfies TenantMigrationColumnChange,
],
columns: convertFieldMetadataToColumnChanges(createdFieldMetadata),
} satisfies TenantMigrationTableChange,
]);
@ -87,13 +74,4 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
return createdFieldMetadata;
}
public async getFieldMetadataByDisplayNameAndObjectId(
name: string,
objectId: string,
): Promise<FieldMetadata | null> {
return await this.fieldMetadataRepository.findOne({
where: { displayName: name, objectId },
});
}
}

View File

@ -35,17 +35,17 @@ export function generateTargetColumnMap(
case 'boolean':
case 'date':
return {
value: uuidToBase36(v4()),
value: `column_${uuidToBase36(v4())}`,
};
case 'url':
return {
text: uuidToBase36(v4()),
link: uuidToBase36(v4()),
text: `column_${uuidToBase36(v4())}`,
link: `column_${uuidToBase36(v4())}`,
};
case 'money':
return {
amount: uuidToBase36(v4()),
currency: uuidToBase36(v4()),
amount: `column_${uuidToBase36(v4())}`,
currency: `column_${uuidToBase36(v4())}`,
};
default:
throw new Error(`Unknown type ${type}`);