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:
Raphaël Bosi
2025-08-07 18:45:04 +02:00
committed by GitHub
parent caabe8738d
commit 593b064448
134 changed files with 10987 additions and 62 deletions
@@ -5,7 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewField } from 'src/engine/metadata-modules/view/view-field.entity';
import { ViewField } from 'src/engine/core-modules/view/entities/view-field.entity';
import { ViewFieldWorkspaceEntity } from 'src/modules/view/standard-objects/view-field.workspace-entity';
@Injectable()
@@ -5,8 +5,8 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewFilterGroupLogicalOperator } from 'src/engine/metadata-modules/view/enums/view-filter-group-logical-operator';
import { ViewFilterGroup } from 'src/engine/metadata-modules/view/view-filter-group.entity';
import { ViewFilterGroup } from 'src/engine/core-modules/view/entities/view-filter-group.entity';
import { ViewFilterGroupLogicalOperator } from 'src/engine/core-modules/view/enums/view-filter-group-logical-operator';
import { ViewFilterGroupWorkspaceEntity } from 'src/modules/view/standard-objects/view-filter-group.workspace-entity';
@Injectable()
@@ -1,12 +1,14 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ViewFilterOperand as SharedViewFilterOperand } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewFilter } from 'src/engine/metadata-modules/view/view-filter.entity';
import { ViewFilter } from 'src/engine/core-modules/view/entities/view-filter.entity';
import { ViewFilterWorkspaceEntity } from 'src/modules/view/standard-objects/view-filter.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';
@Injectable()
@@ -33,6 +35,10 @@ export class ViewFilterSyncService {
updateData[key] = transformViewFilterWorkspaceValueToCoreValue(
diffValue.after,
);
} else if (key === 'operand' && diffValue.after) {
updateData[key] = convertViewFilterOperandToCoreOperand(
diffValue.after as SharedViewFilterOperand,
);
} else {
updateData[key] = diffValue.after;
}
@@ -54,7 +60,9 @@ export class ViewFilterSyncService {
id: workspaceViewFilter.id,
fieldMetadataId: workspaceViewFilter.fieldMetadataId,
viewId: workspaceViewFilter.viewId,
operand: workspaceViewFilter.operand,
operand: convertViewFilterOperandToCoreOperand(
workspaceViewFilter.operand as SharedViewFilterOperand,
),
value: transformViewFilterWorkspaceValueToCoreValue(
workspaceViewFilter.value,
),
@@ -5,7 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewGroup } from 'src/engine/metadata-modules/view/view-group.entity';
import { ViewGroup } from 'src/engine/core-modules/view/entities/view-group.entity';
import { ViewGroupWorkspaceEntity } from 'src/modules/view/standard-objects/view-group.workspace-entity';
@Injectable()
@@ -5,8 +5,8 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewSortDirection } from 'src/engine/metadata-modules/view/enums/view-sort-direction';
import { ViewSort } from 'src/engine/metadata-modules/view/view-sort.entity';
import { ViewSort } from 'src/engine/core-modules/view/entities/view-sort.entity';
import { ViewSortDirection } from 'src/engine/core-modules/view/enums/view-sort-direction';
import { ViewSortWorkspaceEntity } from 'src/modules/view/standard-objects/view-sort.workspace-entity';
@Injectable()
@@ -5,8 +5,9 @@ import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { ObjectRecordDiff } from 'src/engine/core-modules/event-emitter/types/object-record-diff';
import { ViewOpenRecordIn } from 'src/engine/metadata-modules/view/enums/view-open-record-in';
import { View } from 'src/engine/metadata-modules/view/view.entity';
import { View } from 'src/engine/core-modules/view/entities/view.entity';
import { ViewOpenRecordIn } from 'src/engine/core-modules/view/enums/view-open-record-in';
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
import { ViewWorkspaceEntity } from 'src/modules/view/standard-objects/view.workspace-entity';
@Injectable()
@@ -34,6 +35,9 @@ export class ViewSyncService {
diffValue.after === 'SIDE_PANEL'
? ViewOpenRecordIn.SIDE_PANEL
: ViewOpenRecordIn.RECORD_PAGE;
} else if (key === 'type') {
updateData[key] =
diffValue.after === 'table' ? ViewType.TABLE : ViewType.KANBAN;
} else {
updateData[key] = diffValue.after;
}
@@ -51,7 +55,7 @@ export class ViewSyncService {
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,