Create resolvers and controllers for core views (#13624)
Created: - Services - Resolvers - Controllers - Tests for services - Integration tests for GraphQL and Rest Updated the Rest API playground Added new feature flag `IS_CORE_VIEW_ENABLED` Updated `viewFilter` `operand` and `view` `type` to be enums rather than strings and generated migration file. Closes https://github.com/twentyhq/core-team-issues/issues/1259 --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
+16
-11
@@ -1,6 +1,7 @@
|
||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
|
||||
import { Command } from 'nest-commander';
|
||||
import { ViewFilterOperand as SharedViewFilterOperand } from 'twenty-shared/types';
|
||||
import { DataSource, QueryRunner, Repository } from 'typeorm';
|
||||
|
||||
import {
|
||||
@@ -9,16 +10,17 @@ import {
|
||||
} from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner';
|
||||
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 { ViewField } from 'src/engine/core-modules/view/entities/view-field.entity';
|
||||
import { ViewFilterGroup } from 'src/engine/core-modules/view/entities/view-filter-group.entity';
|
||||
import { ViewFilter } from 'src/engine/core-modules/view/entities/view-filter.entity';
|
||||
import { ViewGroup } from 'src/engine/core-modules/view/entities/view-group.entity';
|
||||
import { ViewSort } from 'src/engine/core-modules/view/entities/view-sort.entity';
|
||||
import { View } from 'src/engine/core-modules/view/entities/view.entity';
|
||||
import { ViewFilterGroupLogicalOperator } from 'src/engine/core-modules/view/enums/view-filter-group-logical-operator';
|
||||
import { ViewOpenRecordIn } from 'src/engine/core-modules/view/enums/view-open-record-in';
|
||||
import { ViewSortDirection } from 'src/engine/core-modules/view/enums/view-sort-direction';
|
||||
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
||||
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { ViewFilterGroupLogicalOperator } from 'src/engine/metadata-modules/view/enums/view-filter-group-logical-operator';
|
||||
import { ViewOpenRecordIn } from 'src/engine/metadata-modules/view/enums/view-open-record-in';
|
||||
import { ViewSortDirection } from 'src/engine/metadata-modules/view/enums/view-sort-direction';
|
||||
import { ViewField } from 'src/engine/metadata-modules/view/view-field.entity';
|
||||
import { ViewFilterGroup } from 'src/engine/metadata-modules/view/view-filter-group.entity';
|
||||
import { ViewFilter } from 'src/engine/metadata-modules/view/view-filter.entity';
|
||||
import { ViewGroup } from 'src/engine/metadata-modules/view/view-group.entity';
|
||||
import { ViewSort } from 'src/engine/metadata-modules/view/view-sort.entity';
|
||||
import { View } from 'src/engine/metadata-modules/view/view.entity';
|
||||
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
||||
import { ViewFieldWorkspaceEntity } from 'src/modules/view/standard-objects/view-field.workspace-entity';
|
||||
import { ViewFilterGroupWorkspaceEntity } from 'src/modules/view/standard-objects/view-filter-group.workspace-entity';
|
||||
@@ -26,6 +28,7 @@ import { ViewFilterWorkspaceEntity } from 'src/modules/view/standard-objects/vie
|
||||
import { ViewGroupWorkspaceEntity } from 'src/modules/view/standard-objects/view-group.workspace-entity';
|
||||
import { ViewSortWorkspaceEntity } from 'src/modules/view/standard-objects/view-sort.workspace-entity';
|
||||
import { ViewWorkspaceEntity } from 'src/modules/view/standard-objects/view.workspace-entity';
|
||||
import { convertViewFilterOperandToCoreOperand } from 'src/modules/view/utils/convert-view-filter-operand-to-core-operand.util';
|
||||
import { transformViewFilterWorkspaceValueToCoreValue } from 'src/modules/view/utils/transform-view-filter-workspace-value-to-core-value';
|
||||
|
||||
@Command({
|
||||
@@ -247,7 +250,7 @@ export class MigrateViewsToCoreCommand extends ActiveOrSuspendedWorkspacesMigrat
|
||||
id: workspaceView.id,
|
||||
name: workspaceView.name,
|
||||
objectMetadataId: workspaceView.objectMetadataId,
|
||||
type: workspaceView.type,
|
||||
type: workspaceView.type === 'table' ? ViewType.TABLE : ViewType.KANBAN,
|
||||
key: workspaceView.key,
|
||||
icon: workspaceView.icon,
|
||||
position: workspaceView.position,
|
||||
@@ -315,7 +318,9 @@ export class MigrateViewsToCoreCommand extends ActiveOrSuspendedWorkspacesMigrat
|
||||
id: filter.id,
|
||||
fieldMetadataId: filter.fieldMetadataId,
|
||||
viewId: filter.viewId,
|
||||
operand: filter.operand,
|
||||
operand: convertViewFilterOperandToCoreOperand(
|
||||
filter.operand as SharedViewFilterOperand,
|
||||
),
|
||||
value: transformViewFilterWorkspaceValueToCoreValue(filter.value),
|
||||
viewFilterGroupId: filter.viewFilterGroupId,
|
||||
workspaceId,
|
||||
|
||||
+197
@@ -0,0 +1,197 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
|
||||
export class UpdateCoreViewDataModel1754578392938
|
||||
implements MigrationInterface
|
||||
{
|
||||
name = 'UpdateCoreViewDataModel1754578392938';
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewField_aggregateoperation_enum" RENAME TO "viewField_aggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."AggregateOperations" AS ENUM('MIN', 'MAX', 'AVG', 'SUM', 'COUNT', 'COUNT_UNIQUE_VALUES', 'COUNT_EMPTY', 'COUNT_NOT_EMPTY', 'COUNT_TRUE', 'COUNT_FALSE', 'PERCENTAGE_EMPTY', 'PERCENTAGE_NOT_EMPTY')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewField" ALTER COLUMN "aggregateOperation" TYPE "core"."AggregateOperations" USING "aggregateOperation"::"text"::"core"."AggregateOperations"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`DROP TYPE "core"."viewField_aggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" DROP COLUMN "operand"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."ViewFilterOperand" AS ENUM('IS', 'IS_NOT_NULL', 'IS_NOT', 'LESS_THAN_OR_EQUAL', 'GREATER_THAN_OR_EQUAL', 'IS_BEFORE', 'IS_AFTER', 'CONTAINS', 'DOES_NOT_CONTAIN', 'IS_EMPTY', 'IS_NOT_EMPTY', 'IS_RELATIVE', 'IS_IN_PAST', 'IS_IN_FUTURE', 'IS_TODAY', 'VECTOR_SEARCH')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" ADD "operand" "core"."ViewFilterOperand" NOT NULL DEFAULT 'CONTAINS'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewFilterGroup_logicaloperator_enum" RENAME TO "viewFilterGroup_logicaloperator_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."ViewFilterGroupLogicalOperator" AS ENUM('AND', 'OR', 'NOT')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" TYPE "core"."ViewFilterGroupLogicalOperator" USING "logicalOperator"::"text"::"core"."ViewFilterGroupLogicalOperator"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" SET DEFAULT 'NOT'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`DROP TYPE "core"."viewFilterGroup_logicaloperator_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewSort_direction_enum" RENAME TO "viewSort_direction_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."ViewSortDirection" AS ENUM('ASC', 'DESC')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" TYPE "core"."ViewSortDirection" USING "direction"::"text"::"core"."ViewSortDirection"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" SET DEFAULT 'ASC'`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."viewSort_direction_enum_old"`);
|
||||
await queryRunner.query(`ALTER TABLE "core"."view" DROP COLUMN "type"`);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."ViewType" AS ENUM('TABLE', 'KANBAN')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ADD "type" "core"."ViewType" NOT NULL DEFAULT 'TABLE'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_openrecordin_enum" RENAME TO "view_openrecordin_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."ViewOpenRecordIn" AS ENUM('SIDE_PANEL', 'RECORD_PAGE')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" TYPE "core"."ViewOpenRecordIn" USING "openRecordIn"::"text"::"core"."ViewOpenRecordIn"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" SET DEFAULT 'SIDE_PANEL'`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."view_openrecordin_enum_old"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_kanbanaggregateoperation_enum" RENAME TO "view_kanbanaggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."KanbanAggregateOperations" AS ENUM('MIN', 'MAX', 'AVG', 'SUM', 'COUNT', 'COUNT_UNIQUE_VALUES', 'COUNT_EMPTY', 'COUNT_NOT_EMPTY', 'COUNT_TRUE', 'COUNT_FALSE', 'PERCENTAGE_EMPTY', 'PERCENTAGE_NOT_EMPTY')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "kanbanAggregateOperation" TYPE "core"."KanbanAggregateOperations" USING "kanbanAggregateOperation"::"text"::"core"."KanbanAggregateOperations"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`DROP TYPE "core"."view_kanbanaggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" ADD CONSTRAINT "FK_b518bd61175e0963370e09ef15e" FOREIGN KEY ("viewFilterGroupId") REFERENCES "core"."viewFilterGroup"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ADD CONSTRAINT "FK_6aa17342705ae5526de377bf7ed" FOREIGN KEY ("parentViewFilterGroupId") REFERENCES "core"."viewFilterGroup"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
|
||||
);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" DROP CONSTRAINT "FK_6aa17342705ae5526de377bf7ed"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" DROP CONSTRAINT "FK_b518bd61175e0963370e09ef15e"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."view_kanbanaggregateoperation_enum_old" AS ENUM('MIN', 'MAX', 'AVG', 'SUM', 'COUNT', 'COUNT_UNIQUE_VALUES', 'COUNT_EMPTY', 'COUNT_NOT_EMPTY', 'COUNT_TRUE', 'COUNT_FALSE', 'PERCENTAGE_EMPTY', 'PERCENTAGE_NOT_EMPTY')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "kanbanAggregateOperation" TYPE "core"."view_kanbanaggregateoperation_enum_old" USING "kanbanAggregateOperation"::"text"::"core"."view_kanbanaggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."KanbanAggregateOperations"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_kanbanaggregateoperation_enum_old" RENAME TO "view_kanbanaggregateoperation_enum"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."view_openrecordin_enum_old" AS ENUM('SIDE_PANEL', 'RECORD_PAGE')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" TYPE "core"."view_openrecordin_enum_old" USING "openRecordIn"::"text"::"core"."view_openrecordin_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ALTER COLUMN "openRecordIn" SET DEFAULT 'SIDE_PANEL'`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."ViewOpenRecordIn"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."view_openrecordin_enum_old" RENAME TO "view_openrecordin_enum"`,
|
||||
);
|
||||
await queryRunner.query(`ALTER TABLE "core"."view" DROP COLUMN "type"`);
|
||||
await queryRunner.query(`DROP TYPE "core"."ViewType"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."view" ADD "type" character varying NOT NULL DEFAULT 'table'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."viewSort_direction_enum_old" AS ENUM('ASC', 'DESC')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" TYPE "core"."viewSort_direction_enum_old" USING "direction"::"text"::"core"."viewSort_direction_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewSort" ALTER COLUMN "direction" SET DEFAULT 'ASC'`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."ViewSortDirection"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewSort_direction_enum_old" RENAME TO "viewSort_direction_enum"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."viewFilterGroup_logicaloperator_enum_old" AS ENUM('AND', 'OR', 'NOT')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" DROP DEFAULT`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" TYPE "core"."viewFilterGroup_logicaloperator_enum_old" USING "logicalOperator"::"text"::"core"."viewFilterGroup_logicaloperator_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilterGroup" ALTER COLUMN "logicalOperator" SET DEFAULT 'NOT'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`DROP TYPE "core"."ViewFilterGroupLogicalOperator"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewFilterGroup_logicaloperator_enum_old" RENAME TO "viewFilterGroup_logicaloperator_enum"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" DROP COLUMN "operand"`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."ViewFilterOperand"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewFilter" ADD "operand" character varying NOT NULL DEFAULT 'Contains'`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "core"."viewField_aggregateoperation_enum_old" AS ENUM('MIN', 'MAX', 'AVG', 'SUM', 'COUNT', 'COUNT_UNIQUE_VALUES', 'COUNT_EMPTY', 'COUNT_NOT_EMPTY', 'COUNT_TRUE', 'COUNT_FALSE', 'PERCENTAGE_EMPTY', 'PERCENTAGE_NOT_EMPTY')`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "core"."viewField" ALTER COLUMN "aggregateOperation" TYPE "core"."viewField_aggregateoperation_enum_old" USING "aggregateOperation"::"text"::"core"."viewField_aggregateoperation_enum_old"`,
|
||||
);
|
||||
await queryRunner.query(`DROP TYPE "core"."AggregateOperations"`);
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "core"."viewField_aggregateoperation_enum_old" RENAME TO "viewField_aggregateoperation_enum"`,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user