Add viewField creation to fieldMetadata creation service (#2685)

* Add viewField creation to fieldMetadata creation service

* fix reduce with no initial value
This commit is contained in:
Weiko
2023-11-24 10:02:37 +01:00
committed by GitHub
parent c395955f12
commit cc526517b3
4 changed files with 53 additions and 14 deletions

View File

@ -155,22 +155,13 @@ export const SettingsObjectNewFieldStep2 = () => {
}); });
}); });
} else { } else {
const createdField = await createMetadataField({ await createMetadataField({
description: validatedFormValues.description, description: validatedFormValues.description,
icon: validatedFormValues.icon, icon: validatedFormValues.icon,
label: validatedFormValues.label, label: validatedFormValues.label,
objectMetadataId: activeObjectMetadataItem.id, objectMetadataId: activeObjectMetadataItem.id,
type: validatedFormValues.type, type: validatedFormValues.type,
}); });
objectViews.forEach(async (view) => {
await createOneViewField?.({
view: view.id,
fieldMetadataId: createdField.data?.createOneField.id,
position: activeObjectMetadataItem.fields.length,
isVisible: true,
size: 100,
});
});
} }
navigate(`/settings/objects/${objectSlug}`); navigate(`/settings/objects/${objectSlug}`);

View File

@ -11,6 +11,8 @@ import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migratio
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard'; import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { FieldMetadataService } from './field-metadata.service'; import { FieldMetadataService } from './field-metadata.service';
import { FieldMetadataEntity } from './field-metadata.entity'; import { FieldMetadataEntity } from './field-metadata.entity';
@ -27,6 +29,8 @@ import { UpdateFieldInput } from './dtos/update-field.input';
WorkspaceMigrationModule, WorkspaceMigrationModule,
WorkspaceMigrationRunnerModule, WorkspaceMigrationRunnerModule,
ObjectMetadataModule, ObjectMetadataModule,
DataSourceModule,
TypeORMModule,
], ],
services: [FieldMetadataService], services: [FieldMetadataService],
resolvers: [ resolvers: [

View File

@ -15,6 +15,8 @@ import { CreateFieldInput } from 'src/metadata/field-metadata/dtos/create-field.
import { WorkspaceMigrationTableAction } from 'src/metadata/workspace-migration/workspace-migration.entity'; import { WorkspaceMigrationTableAction } from 'src/metadata/workspace-migration/workspace-migration.entity';
import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util'; import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util';
import { convertFieldMetadataToColumnActions } from 'src/metadata/field-metadata/utils/convert-field-metadata-to-column-action.util'; import { convertFieldMetadataToColumnActions } from 'src/metadata/field-metadata/utils/convert-field-metadata-to-column-action.util';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { FieldMetadataEntity } from './field-metadata.entity'; import { FieldMetadataEntity } from './field-metadata.entity';
@ -27,6 +29,8 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
private readonly objectMetadataService: ObjectMetadataService, private readonly objectMetadataService: ObjectMetadataService,
private readonly workspaceMigrationService: WorkspaceMigrationService, private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
private readonly dataSourceService: DataSourceService,
private readonly typeORMService: TypeORMService,
) { ) {
super(fieldMetadataRepository); super(fieldMetadataRepository);
} }
@ -56,10 +60,6 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
throw new ConflictException('Field already exists'); throw new ConflictException('Field already exists');
} }
if (record.name == record.label) {
throw new ConflictException('Field name and label cannot be the same');
}
const createdFieldMetadata = await super.createOne({ const createdFieldMetadata = await super.createOne({
...record, ...record,
targetColumnMap: generateTargetColumnMap(record.type, true, record.name), targetColumnMap: generateTargetColumnMap(record.type, true, record.name),
@ -82,6 +82,44 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
record.workspaceId, record.workspaceId,
); );
// TODO: Move viewField creation to a cdc scheduler
const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
record.workspaceId,
);
const workspaceDataSource = await this.typeORMService.connectToDataSource(
dataSourceMetadata,
);
// TODO: use typeorm repository
const view = await workspaceDataSource?.query(
`SELECT id FROM ${dataSourceMetadata.schema}."view"
WHERE "objectMetadataId" = '${createdFieldMetadata.objectMetadataId}'`,
);
const existingViewFields = await workspaceDataSource?.query(
`SELECT * FROM ${dataSourceMetadata.schema}."viewField"
WHERE "viewId" = '${view[0].id}'`,
);
const lastPosition = existingViewFields
.map((viewField) => viewField.position)
.reduce((acc, position) => {
if (position > acc) {
return position;
}
return acc;
}, -1);
await workspaceDataSource?.query(
`INSERT INTO ${dataSourceMetadata.schema}."viewField"
("fieldMetadataId", "position", "isVisible", "size", "viewId")
VALUES ('${createdFieldMetadata.id}', '${lastPosition + 1}', true, 180, '${
view[0].id
}')`,
);
return createdFieldMetadata; return createdFieldMetadata;
} }

View File

@ -54,6 +54,12 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
record.workspaceId, record.workspaceId,
); );
if (record.labelSingular === record.labelPlural) {
throw new Error(
'The singular and plural labels cannot be the same for an object',
);
}
const createdObjectMetadata = await super.createOne({ const createdObjectMetadata = await super.createOne({
...record, ...record,
dataSourceId: lastDataSourceMetadata.id, dataSourceId: lastDataSourceMetadata.id,