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:
@ -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}`);
|
||||||
|
|||||||
@ -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: [
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user