[BREAKING_CHANGE/GRAPHQL/OBJECT_METADATA_CREATE_ONE] Remove object/fields/view-fields v1 implementation (#15823)

# Introduction
Remove the v2 feature flag for view-field field-metadata and
object-metadata metadata entities

## Some details
- Disabled nestjs-query for object metadata creation and explicitly
calling it
- removed all v1 integration tests files

## Remarks
Not remove v2 referencing in both filenaming right now will handle that
globally later

## Breaking change
Due to object metadata resolver createOne standardization had to rename
the input from `CreateObjectInput` to `CreateOneObjectInput`
This commit is contained in:
Paul Rastoin
2025-11-17 10:55:19 +01:00
committed by GitHub
parent c1dcda6475
commit a39efeb1ab
75 changed files with 425 additions and 15441 deletions
@@ -13,8 +13,6 @@ import {
import { isDefined } from 'twenty-shared/utils';
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
@@ -32,7 +30,6 @@ import {
} from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception';
import { ViewFieldRestApiExceptionFilter } from 'src/engine/metadata-modules/view-field/filters/view-field-rest-api-exception.filter';
import { ViewFieldV2Service } from 'src/engine/metadata-modules/view-field/services/view-field-v2.service';
import { ViewFieldService } from 'src/engine/metadata-modules/view-field/services/view-field.service';
import { CreateViewFieldPermissionGuard } from 'src/engine/metadata-modules/view-permissions/guards/create-view-field-permission.guard';
import { DeleteViewFieldPermissionGuard } from 'src/engine/metadata-modules/view-permissions/guards/delete-view-field-permission.guard';
import { UpdateViewFieldPermissionGuard } from 'src/engine/metadata-modules/view-permissions/guards/update-view-field-permission.guard';
@@ -41,11 +38,7 @@ import { UpdateViewFieldPermissionGuard } from 'src/engine/metadata-modules/view
@UseGuards(WorkspaceAuthGuard)
@UseFilters(ViewFieldRestApiExceptionFilter)
export class ViewFieldController {
constructor(
private readonly viewFieldService: ViewFieldService,
private readonly viewFieldV2Service: ViewFieldV2Service,
private readonly featureFlagService: FeatureFlagService,
) {}
constructor(private readonly viewFieldV2Service: ViewFieldV2Service) {}
@Get()
@UseGuards(NoPermissionGuard)
@@ -54,10 +47,10 @@ export class ViewFieldController {
@Query('viewId') viewId?: string,
): Promise<ViewFieldEntity[]> {
if (viewId) {
return this.viewFieldService.findByViewId(workspace.id, viewId);
return this.viewFieldV2Service.findByViewId(workspace.id, viewId);
}
return this.viewFieldService.findByWorkspaceId(workspace.id);
return this.viewFieldV2Service.findByWorkspaceId(workspace.id);
}
@Get(':id')
@@ -66,7 +59,7 @@ export class ViewFieldController {
@Param('id') id: string,
@AuthWorkspace() workspace: WorkspaceEntity,
): Promise<ViewFieldEntity> {
const viewField = await this.viewFieldService.findById(id, workspace.id);
const viewField = await this.viewFieldV2Service.findById(id, workspace.id);
if (!isDefined(viewField)) {
throw new ViewFieldException(
@@ -93,39 +86,10 @@ export class ViewFieldController {
@Body() input: UpdateViewFieldInput['update'],
@AuthWorkspace() workspace: WorkspaceEntity,
): Promise<ViewFieldDTO> {
const isWorkspaceMigrationV2Enabled =
await this.featureFlagService.isFeatureEnabled(
FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
workspace.id,
);
if (isWorkspaceMigrationV2Enabled) {
return await this.viewFieldV2Service.updateOne({
updateViewFieldInput: { id, update: input },
workspaceId: workspace.id,
});
}
const updatedViewField = await this.viewFieldService.update(
id,
workspace.id,
input,
);
// Convert ViewFieldEntity to ViewFieldDTO for consistency
return {
id: updatedViewField.id,
fieldMetadataId: updatedViewField.fieldMetadataId,
isVisible: updatedViewField.isVisible,
size: updatedViewField.size,
position: updatedViewField.position,
aggregateOperation: updatedViewField.aggregateOperation,
viewId: updatedViewField.viewId,
workspaceId: updatedViewField.workspaceId,
createdAt: updatedViewField.createdAt,
updatedAt: updatedViewField.updatedAt,
deletedAt: updatedViewField.deletedAt,
};
return await this.viewFieldV2Service.updateOne({
updateViewFieldInput: { id, update: input },
workspaceId: workspace.id,
});
}
@Post()
@@ -134,38 +98,10 @@ export class ViewFieldController {
@Body() input: CreateViewFieldInput,
@AuthWorkspace() workspace: WorkspaceEntity,
): Promise<ViewFieldDTO> {
const isWorkspaceMigrationV2Enabled =
await this.featureFlagService.isFeatureEnabled(
FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
workspace.id,
);
if (isWorkspaceMigrationV2Enabled) {
return await this.viewFieldV2Service.createOne({
createViewFieldInput: input,
workspaceId: workspace.id,
});
}
const createdViewField = await this.viewFieldService.create({
...input,
return await this.viewFieldV2Service.createOne({
createViewFieldInput: input,
workspaceId: workspace.id,
});
// Convert ViewFieldEntity to ViewFieldDTO for consistency
return {
id: createdViewField.id,
fieldMetadataId: createdViewField.fieldMetadataId,
isVisible: createdViewField.isVisible,
size: createdViewField.size,
position: createdViewField.position,
aggregateOperation: createdViewField.aggregateOperation,
viewId: createdViewField.viewId,
workspaceId: createdViewField.workspaceId,
createdAt: createdViewField.createdAt,
updatedAt: createdViewField.updatedAt,
deletedAt: createdViewField.deletedAt,
};
}
@Delete(':id')
@@ -174,25 +110,10 @@ export class ViewFieldController {
@Param('id') id: string,
@AuthWorkspace() workspace: WorkspaceEntity,
): Promise<{ success: boolean }> {
const isWorkspaceMigrationV2Enabled =
await this.featureFlagService.isFeatureEnabled(
FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
workspace.id,
);
if (isWorkspaceMigrationV2Enabled) {
const deletedViewField = await this.viewFieldV2Service.deleteOne({
deleteViewFieldInput: { id },
workspaceId: workspace.id,
});
return { success: isDefined(deletedViewField) };
}
const deletedViewField = await this.viewFieldService.delete(
id,
workspace.id,
);
const deletedViewField = await this.viewFieldV2Service.deleteOne({
deleteViewFieldInput: { id },
workspaceId: workspace.id,
});
return { success: isDefined(deletedViewField) };
}