Seed core views in dev + fixes (#14071)

Seed core views in dev

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Raphaël Bosi
2025-08-26 13:05:20 +02:00
committed by GitHub
parent ab4fd6a182
commit 048455bbb6
13 changed files with 151 additions and 38 deletions
@@ -58,7 +58,7 @@ export const seedFeatureFlags = async (
{
key: FeatureFlagKey.IS_CORE_VIEW_ENABLED,
workspaceId: workspaceId,
value: false,
value: true,
},
{
key: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
@@ -1,5 +1,8 @@
import { Injectable } from '@nestjs/common';
import { isDefined } from 'class-validator';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service';
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
@@ -16,12 +19,14 @@ import { ROCKET_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seed
import { SURVEY_RESULT_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seeder/metadata/custom-objects/constants/survey-results-object-seed.constant';
import { type FieldMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/field-metadata-seed.type';
import { type ObjectMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/object-metadata-seed.type';
import { prefillCoreViews } from 'src/engine/workspace-manager/standard-objects-prefill-data/prefill-core-views';
@Injectable()
export class DevSeederMetadataService {
constructor(
private readonly objectMetadataService: ObjectMetadataService,
private readonly fieldMetadataService: FieldMetadataService,
private readonly typeORMService: TypeORMService,
) {}
private readonly workspaceConfigs: Record<
@@ -97,6 +102,8 @@ export class DevSeederMetadataService {
fieldMetadataSeeds: fieldConfig.seeds,
});
}
await this.seedCoreViews(workspaceId);
}
private async seedCustomObject({
@@ -143,4 +150,17 @@ export class DevSeederMetadataService {
})),
);
}
private async seedCoreViews(workspaceId: string): Promise<void> {
const mainDataSource = this.typeORMService.getMainDataSource();
if (!isDefined(mainDataSource)) {
throw new Error('Could not connect to main data source');
}
const createdObjectMetadata =
await this.objectMetadataService.findManyWithinWorkspace(workspaceId);
await prefillCoreViews(mainDataSource, workspaceId, createdObjectMetadata);
}
}
@@ -13,7 +13,6 @@ import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { type ViewDefinition } from 'src/engine/workspace-manager/standard-objects-prefill-data/types/view-definition.interface';
import { companiesAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/companies-all.view';
import { customAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/custom-all.view';
import { notesAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/notes-all.view';
import { opportunitiesAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/opportunities-all.view';
import { opportunitiesTableByStageView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-table-by-stage.view';
@@ -24,6 +23,7 @@ import { tasksByStatusView } from 'src/engine/workspace-manager/standard-objects
import { workflowRunsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view';
import { workflowVersionsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view';
import { workflowsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view';
import { ViewOpenRecordInType } from 'src/modules/view/standard-objects/view.workspace-entity';
import { convertViewFilterOperandToCoreOperand } from 'src/modules/view/utils/convert-view-filter-operand-to-core-operand.util';
export const prefillCoreViews = async (
@@ -31,14 +31,6 @@ export const prefillCoreViews = async (
workspaceId: string,
objectMetadataItems: ObjectMetadataEntity[],
): Promise<View[]> => {
const customObjectMetadataItems = objectMetadataItems.filter(
(item) => item.isCustom,
);
const customViews = customObjectMetadataItems.map((item) =>
customAllView(item, true),
);
const views = [
companiesAllView(objectMetadataItems, true),
peopleAllView(objectMetadataItems, true),
@@ -51,7 +43,6 @@ export const prefillCoreViews = async (
workflowsAllView(objectMetadataItems, true),
workflowVersionsAllView(objectMetadataItems, true),
workflowRunsAllView(objectMetadataItems, true),
...customViews,
];
const queryRunner = dataSource.createQueryRunner();
@@ -110,9 +101,9 @@ const createCoreViews = async (
isCompact: false,
isCustom: isCustom ?? false,
openRecordIn:
openRecordIn === 'SIDE_PANEL'
? ViewOpenRecordIn.SIDE_PANEL
: ViewOpenRecordIn.RECORD_PAGE,
openRecordIn === ViewOpenRecordInType.RECORD_PAGE
? ViewOpenRecordIn.RECORD_PAGE
: ViewOpenRecordIn.SIDE_PANEL,
kanbanAggregateOperation,
kanbanAggregateOperationFieldMetadataId,
workspaceId,