diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 0b23d36e0df..ed6d628bbd1 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1065,6 +1065,11 @@ export type DeleteViewFilterInput = { id: Scalars['UUID']; }; +export type DeleteViewGroupInput = { + /** The id of the view group to delete. */ + id: Scalars['UUID']; +}; + export type DeleteWebhookDto = { id: Scalars['UUID']; }; @@ -1095,6 +1100,11 @@ export type DestroyViewFilterInput = { id: Scalars['UUID']; }; +export type DestroyViewGroupInput = { + /** The id of the view group to destroy. */ + id: Scalars['UUID']; +}; + /** Schema update on a table */ export enum DistantTableUpdate { COLUMNS_ADDED = 'COLUMNS_ADDED', @@ -1727,7 +1737,7 @@ export type Mutation = { deleteCoreViewField: CoreViewField; deleteCoreViewFilter: CoreViewFilter; deleteCoreViewFilterGroup: Scalars['Boolean']; - deleteCoreViewGroup: Scalars['Boolean']; + deleteCoreViewGroup: CoreViewGroup; deleteCoreViewSort: Scalars['Boolean']; deleteCurrentWorkspace: Workspace; deleteDatabaseConfigVariable: Scalars['Boolean']; @@ -1757,7 +1767,7 @@ export type Mutation = { destroyCoreViewField: CoreViewField; destroyCoreViewFilter: CoreViewFilter; destroyCoreViewFilterGroup: Scalars['Boolean']; - destroyCoreViewGroup: Scalars['Boolean']; + destroyCoreViewGroup: CoreViewGroup; destroyCoreViewSort: Scalars['Boolean']; destroyPageLayout: Scalars['Boolean']; destroyPageLayoutTab: Scalars['Boolean']; @@ -2117,7 +2127,7 @@ export type MutationDeleteCoreViewFilterGroupArgs = { export type MutationDeleteCoreViewGroupArgs = { - id: Scalars['String']; + input: DeleteViewGroupInput; }; @@ -2257,7 +2267,7 @@ export type MutationDestroyCoreViewFilterGroupArgs = { export type MutationDestroyCoreViewGroupArgs = { - id: Scalars['String']; + input: DestroyViewGroupInput; }; @@ -2536,7 +2546,6 @@ export type MutationUpdateCoreViewFilterGroupArgs = { export type MutationUpdateCoreViewGroupArgs = { - id: Scalars['String']; input: UpdateViewGroupInput; }; @@ -4153,12 +4162,17 @@ export type UpdateViewFilterInputUpdates = { }; export type UpdateViewGroupInput = { + /** The id of the view group to update */ + id: Scalars['UUID']; + /** The view group to update */ + update: UpdateViewGroupInputUpdates; +}; + +export type UpdateViewGroupInputUpdates = { fieldMetadataId?: InputMaybe; fieldValue?: InputMaybe; - id?: InputMaybe; isVisible?: InputMaybe; position?: InputMaybe; - viewId?: InputMaybe; }; export type UpdateViewInput = { @@ -5637,9 +5651,9 @@ export type ViewFilterFragmentFragment = { __typename?: 'CoreViewFilter', id: st export type ViewFilterGroupFragmentFragment = { __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }; -export type ViewFragmentFragment = { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> }; +export type ViewFragmentFragment = { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> }; -export type ViewGroupFragmentFragment = { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }; +export type ViewGroupFragmentFragment = { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }; export type ViewSortFragmentFragment = { __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }; @@ -5648,7 +5662,7 @@ export type CreateCoreViewMutationVariables = Exact<{ }>; -export type CreateCoreViewMutation = { __typename?: 'Mutation', createCoreView: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> } }; +export type CreateCoreViewMutation = { __typename?: 'Mutation', createCoreView: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> } }; export type CreateCoreViewFieldMutationVariables = Exact<{ input: CreateViewFieldInput; @@ -5676,7 +5690,7 @@ export type CreateCoreViewGroupMutationVariables = Exact<{ }>; -export type CreateCoreViewGroupMutation = { __typename?: 'Mutation', createCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string } }; +export type CreateCoreViewGroupMutation = { __typename?: 'Mutation', createCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type CreateCoreViewSortMutationVariables = Exact<{ input: CreateViewSortInput; @@ -5714,11 +5728,11 @@ export type DeleteCoreViewFilterGroupMutationVariables = Exact<{ export type DeleteCoreViewFilterGroupMutation = { __typename?: 'Mutation', deleteCoreViewFilterGroup: boolean }; export type DeleteCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; + input: DeleteViewGroupInput; }>; -export type DeleteCoreViewGroupMutation = { __typename?: 'Mutation', deleteCoreViewGroup: boolean }; +export type DeleteCoreViewGroupMutation = { __typename?: 'Mutation', deleteCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type DeleteCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -5756,11 +5770,11 @@ export type DestroyCoreViewFilterGroupMutationVariables = Exact<{ export type DestroyCoreViewFilterGroupMutation = { __typename?: 'Mutation', destroyCoreViewFilterGroup: boolean }; export type DestroyCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; + input: DestroyViewGroupInput; }>; -export type DestroyCoreViewGroupMutation = { __typename?: 'Mutation', destroyCoreViewGroup: boolean }; +export type DestroyCoreViewGroupMutation = { __typename?: 'Mutation', destroyCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type DestroyCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -5775,7 +5789,7 @@ export type UpdateCoreViewMutationVariables = Exact<{ }>; -export type UpdateCoreViewMutation = { __typename?: 'Mutation', updateCoreView: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> } }; +export type UpdateCoreViewMutation = { __typename?: 'Mutation', updateCoreView: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> } }; export type UpdateCoreViewFieldMutationVariables = Exact<{ input: UpdateViewFieldInput; @@ -5800,12 +5814,11 @@ export type UpdateCoreViewFilterGroupMutationVariables = Exact<{ export type UpdateCoreViewFilterGroupMutation = { __typename?: 'Mutation', updateCoreViewFilterGroup: { __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string } }; export type UpdateCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; input: UpdateViewGroupInput; }>; -export type UpdateCoreViewGroupMutation = { __typename?: 'Mutation', updateCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string } }; +export type UpdateCoreViewGroupMutation = { __typename?: 'Mutation', updateCoreViewGroup: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type UpdateCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -5818,7 +5831,7 @@ export type UpdateCoreViewSortMutation = { __typename?: 'Mutation', updateCoreVi export type FindAllCoreViewsQueryVariables = Exact<{ [key: string]: never; }>; -export type FindAllCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> }> }; +export type FindAllCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> }> }; export type FindManyCoreViewFieldsQueryVariables = Exact<{ viewId: Scalars['String']; @@ -5846,7 +5859,7 @@ export type FindManyCoreViewGroupsQueryVariables = Exact<{ }>; -export type FindManyCoreViewGroupsQuery = { __typename?: 'Query', getCoreViewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> }; +export type FindManyCoreViewGroupsQuery = { __typename?: 'Query', getCoreViewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> }; export type FindManyCoreViewSortsQueryVariables = Exact<{ viewId?: InputMaybe; @@ -5860,14 +5873,14 @@ export type FindManyCoreViewsQueryVariables = Exact<{ }>; -export type FindManyCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> }> }; +export type FindManyCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> }> }; export type FindOneCoreViewQueryVariables = Exact<{ id: Scalars['String']; }>; -export type FindOneCoreViewQuery = { __typename?: 'Query', getCoreView?: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string }> } | null }; +export type FindOneCoreViewQuery = { __typename?: 'Query', getCoreView?: { __typename?: 'CoreView', id: string, name: string, objectMetadataId: string, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: string | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: string | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: string, fieldMetadataId: string, viewId: string, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: string, fieldMetadataId: string, operand: ViewFilterOperand, value: any, viewFilterGroupId?: string | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: string, parentViewFilterGroupId?: string | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: string }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: string, fieldMetadataId: string, direction: ViewSortDirection, viewId: string }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null }> } | null }; export type FindOneCoreViewFieldQueryVariables = Exact<{ id: Scalars['String']; @@ -5895,7 +5908,7 @@ export type FindOneCoreViewGroupQueryVariables = Exact<{ }>; -export type FindOneCoreViewGroupQuery = { __typename?: 'Query', getCoreViewGroup?: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string } | null }; +export type FindOneCoreViewGroupQuery = { __typename?: 'Query', getCoreViewGroup?: { __typename?: 'CoreViewGroup', id: string, fieldMetadataId: string, isVisible: boolean, fieldValue: string, position: number, viewId: string, createdAt: string, updatedAt: string, deletedAt?: string | null } | null }; export type FindOneCoreViewSortQueryVariables = Exact<{ id: Scalars['String']; @@ -6517,6 +6530,9 @@ export const ViewGroupFragmentFragmentDoc = gql` fieldValue position viewId + createdAt + updatedAt + deletedAt } `; export const ViewFragmentFragmentDoc = gql` @@ -12144,10 +12160,12 @@ export type DeleteCoreViewFilterGroupMutationHookResult = ReturnType; export type DeleteCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const DeleteCoreViewGroupDocument = gql` - mutation DeleteCoreViewGroup($id: String!) { - deleteCoreViewGroup(id: $id) + mutation DeleteCoreViewGroup($input: DeleteViewGroupInput!) { + deleteCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } - `; + ${ViewGroupFragmentFragmentDoc}`; export type DeleteCoreViewGroupMutationFn = Apollo.MutationFunction; /** @@ -12163,7 +12181,7 @@ export type DeleteCoreViewGroupMutationFn = Apollo.MutationFunction; export type DestroyCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const DestroyCoreViewGroupDocument = gql` - mutation DestroyCoreViewGroup($id: String!) { - destroyCoreViewGroup(id: $id) + mutation DestroyCoreViewGroup($input: DestroyViewGroupInput!) { + destroyCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } - `; + ${ViewGroupFragmentFragmentDoc}`; export type DestroyCoreViewGroupMutationFn = Apollo.MutationFunction; /** @@ -12353,7 +12373,7 @@ export type DestroyCoreViewGroupMutationFn = Apollo.MutationFunction; export type UpdateCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const UpdateCoreViewGroupDocument = gql` - mutation UpdateCoreViewGroup($id: String!, $input: UpdateViewGroupInput!) { - updateCoreViewGroup(id: $id, input: $input) { + mutation UpdateCoreViewGroup($input: UpdateViewGroupInput!) { + updateCoreViewGroup(input: $input) { ...ViewGroupFragment } } @@ -12551,7 +12571,6 @@ export type UpdateCoreViewGroupMutationFn = Apollo.MutationFunction; fieldValue?: InputMaybe; - id?: InputMaybe; isVisible?: InputMaybe; position?: InputMaybe; - viewId?: InputMaybe; }; export type UpdateViewInput = { @@ -4494,9 +4508,9 @@ export type ViewFilterFragmentFragment = { __typename?: 'CoreViewFilter', id: an export type ViewFilterGroupFragmentFragment = { __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }; -export type ViewFragmentFragment = { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> }; +export type ViewFragmentFragment = { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> }; -export type ViewGroupFragmentFragment = { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }; +export type ViewGroupFragmentFragment = { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }; export type ViewSortFragmentFragment = { __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }; @@ -4505,7 +4519,7 @@ export type CreateCoreViewMutationVariables = Exact<{ }>; -export type CreateCoreViewMutation = { __typename?: 'Mutation', createCoreView: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> } }; +export type CreateCoreViewMutation = { __typename?: 'Mutation', createCoreView: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> } }; export type CreateCoreViewFieldMutationVariables = Exact<{ input: CreateViewFieldInput; @@ -4533,7 +4547,7 @@ export type CreateCoreViewGroupMutationVariables = Exact<{ }>; -export type CreateCoreViewGroupMutation = { __typename?: 'Mutation', createCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any } }; +export type CreateCoreViewGroupMutation = { __typename?: 'Mutation', createCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type CreateCoreViewSortMutationVariables = Exact<{ input: CreateViewSortInput; @@ -4571,11 +4585,11 @@ export type DeleteCoreViewFilterGroupMutationVariables = Exact<{ export type DeleteCoreViewFilterGroupMutation = { __typename?: 'Mutation', deleteCoreViewFilterGroup: boolean }; export type DeleteCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; + input: DeleteViewGroupInput; }>; -export type DeleteCoreViewGroupMutation = { __typename?: 'Mutation', deleteCoreViewGroup: boolean }; +export type DeleteCoreViewGroupMutation = { __typename?: 'Mutation', deleteCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type DeleteCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -4613,11 +4627,11 @@ export type DestroyCoreViewFilterGroupMutationVariables = Exact<{ export type DestroyCoreViewFilterGroupMutation = { __typename?: 'Mutation', destroyCoreViewFilterGroup: boolean }; export type DestroyCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; + input: DestroyViewGroupInput; }>; -export type DestroyCoreViewGroupMutation = { __typename?: 'Mutation', destroyCoreViewGroup: boolean }; +export type DestroyCoreViewGroupMutation = { __typename?: 'Mutation', destroyCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type DestroyCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -4632,7 +4646,7 @@ export type UpdateCoreViewMutationVariables = Exact<{ }>; -export type UpdateCoreViewMutation = { __typename?: 'Mutation', updateCoreView: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> } }; +export type UpdateCoreViewMutation = { __typename?: 'Mutation', updateCoreView: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> } }; export type UpdateCoreViewFieldMutationVariables = Exact<{ input: UpdateViewFieldInput; @@ -4657,12 +4671,11 @@ export type UpdateCoreViewFilterGroupMutationVariables = Exact<{ export type UpdateCoreViewFilterGroupMutation = { __typename?: 'Mutation', updateCoreViewFilterGroup: { __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any } }; export type UpdateCoreViewGroupMutationVariables = Exact<{ - id: Scalars['String']; input: UpdateViewGroupInput; }>; -export type UpdateCoreViewGroupMutation = { __typename?: 'Mutation', updateCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any } }; +export type UpdateCoreViewGroupMutation = { __typename?: 'Mutation', updateCoreViewGroup: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null } }; export type UpdateCoreViewSortMutationVariables = Exact<{ id: Scalars['String']; @@ -4675,7 +4688,7 @@ export type UpdateCoreViewSortMutation = { __typename?: 'Mutation', updateCoreVi export type FindAllCoreViewsQueryVariables = Exact<{ [key: string]: never; }>; -export type FindAllCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> }> }; +export type FindAllCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> }> }; export type FindManyCoreViewFieldsQueryVariables = Exact<{ viewId: Scalars['String']; @@ -4703,7 +4716,7 @@ export type FindManyCoreViewGroupsQueryVariables = Exact<{ }>; -export type FindManyCoreViewGroupsQuery = { __typename?: 'Query', getCoreViewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> }; +export type FindManyCoreViewGroupsQuery = { __typename?: 'Query', getCoreViewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> }; export type FindManyCoreViewSortsQueryVariables = Exact<{ viewId?: InputMaybe; @@ -4717,14 +4730,14 @@ export type FindManyCoreViewsQueryVariables = Exact<{ }>; -export type FindManyCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> }> }; +export type FindManyCoreViewsQuery = { __typename?: 'Query', getCoreViews: Array<{ __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> }> }; export type FindOneCoreViewQueryVariables = Exact<{ id: Scalars['String']; }>; -export type FindOneCoreViewQuery = { __typename?: 'Query', getCoreView?: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any }> } | null }; +export type FindOneCoreViewQuery = { __typename?: 'Query', getCoreView?: { __typename?: 'CoreView', id: any, name: string, objectMetadataId: any, type: ViewType, key?: ViewKey | null, icon: string, position: number, isCompact: boolean, openRecordIn: ViewOpenRecordIn, kanbanAggregateOperation?: AggregateOperations | null, kanbanAggregateOperationFieldMetadataId?: any | null, anyFieldFilterValue?: string | null, calendarFieldMetadataId?: any | null, calendarLayout?: ViewCalendarLayout | null, viewFields: Array<{ __typename?: 'CoreViewField', id: any, fieldMetadataId: any, viewId: any, isVisible: boolean, position: number, size: number, aggregateOperation?: AggregateOperations | null, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilters: Array<{ __typename?: 'CoreViewFilter', id: any, fieldMetadataId: any, operand: ViewFilterOperand, value: any, viewFilterGroupId?: any | null, positionInViewFilterGroup?: number | null, subFieldName?: string | null, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }>, viewFilterGroups: Array<{ __typename?: 'CoreViewFilterGroup', id: any, parentViewFilterGroupId?: any | null, logicalOperator: ViewFilterGroupLogicalOperator, positionInViewFilterGroup?: number | null, viewId: any }>, viewSorts: Array<{ __typename?: 'CoreViewSort', id: any, fieldMetadataId: any, direction: ViewSortDirection, viewId: any }>, viewGroups: Array<{ __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null }> } | null }; export type FindOneCoreViewFieldQueryVariables = Exact<{ id: Scalars['String']; @@ -4752,7 +4765,7 @@ export type FindOneCoreViewGroupQueryVariables = Exact<{ }>; -export type FindOneCoreViewGroupQuery = { __typename?: 'Query', getCoreViewGroup?: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any } | null }; +export type FindOneCoreViewGroupQuery = { __typename?: 'Query', getCoreViewGroup?: { __typename?: 'CoreViewGroup', id: any, fieldMetadataId: any, isVisible: boolean, fieldValue: string, position: number, viewId: any, createdAt: string, updatedAt: string, deletedAt?: string | null } | null }; export type FindOneCoreViewSortQueryVariables = Exact<{ id: Scalars['String']; @@ -4906,6 +4919,9 @@ export const ViewGroupFragmentFragmentDoc = gql` fieldValue position viewId + createdAt + updatedAt + deletedAt } `; export const ViewFragmentFragmentDoc = gql` @@ -5418,10 +5434,12 @@ export type DeleteCoreViewFilterGroupMutationHookResult = ReturnType; export type DeleteCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const DeleteCoreViewGroupDocument = gql` - mutation DeleteCoreViewGroup($id: String!) { - deleteCoreViewGroup(id: $id) + mutation DeleteCoreViewGroup($input: DeleteViewGroupInput!) { + deleteCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } - `; + ${ViewGroupFragmentFragmentDoc}`; export type DeleteCoreViewGroupMutationFn = Apollo.MutationFunction; /** @@ -5437,7 +5455,7 @@ export type DeleteCoreViewGroupMutationFn = Apollo.MutationFunction; export type DestroyCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const DestroyCoreViewGroupDocument = gql` - mutation DestroyCoreViewGroup($id: String!) { - destroyCoreViewGroup(id: $id) + mutation DestroyCoreViewGroup($input: DestroyViewGroupInput!) { + destroyCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } - `; + ${ViewGroupFragmentFragmentDoc}`; export type DestroyCoreViewGroupMutationFn = Apollo.MutationFunction; /** @@ -5627,7 +5647,7 @@ export type DestroyCoreViewGroupMutationFn = Apollo.MutationFunction; export type UpdateCoreViewFilterGroupMutationOptions = Apollo.BaseMutationOptions; export const UpdateCoreViewGroupDocument = gql` - mutation UpdateCoreViewGroup($id: String!, $input: UpdateViewGroupInput!) { - updateCoreViewGroup(id: $id, input: $input) { + mutation UpdateCoreViewGroup($input: UpdateViewGroupInput!) { + updateCoreViewGroup(input: $input) { ...ViewGroupFragment } } @@ -5825,7 +5845,6 @@ export type UpdateCoreViewGroupMutationFn = Apollo.MutationFunction { fieldMetadataId: randomFieldForKanban, } satisfies ViewGroup); - await createViewGroupRecords({ - viewGroupsToCreate, - viewId: currentViewId, - }); + await createViewGroupRecords( + viewGroupsToCreate.map((viewGroup) => ({ + input: { + ...viewGroup, + viewId: currentViewId, + }, + })), + ); return viewGroupsToCreate; }, diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleRecordGroupField.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleRecordGroupField.ts index 47ce8cb39e0..3e3ebe6253f 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleRecordGroupField.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleRecordGroupField.ts @@ -106,14 +106,22 @@ export const useHandleRecordGroupField = () => { ); if (viewGroupsToCreate.length > 0) { - await createViewGroupRecords({ viewGroupsToCreate, viewId: view.id }); + await createViewGroupRecords( + viewGroupsToCreate.map((viewGroup) => ({ + input: { + ...viewGroup, + viewId: view.id, + }, + })), + ); } if (viewGroupsToDelete.length > 0) { await deleteViewGroupRecords( viewGroupsToDelete.map((group) => ({ - id: group.id, - viewId: view.id, + input: { + id: group.id, + }, })), ); } @@ -151,8 +159,9 @@ export const useHandleRecordGroupField = () => { await deleteViewGroupRecords( view.viewGroups.map((group) => ({ - id: group.id, - viewId: view.id, + input: { + id: group.id, + }, })), ); diff --git a/packages/twenty-front/src/modules/views/graphql/fragments/viewGroupFragment.ts b/packages/twenty-front/src/modules/views/graphql/fragments/viewGroupFragment.ts index bcd91d780cc..777b1b1cd5f 100644 --- a/packages/twenty-front/src/modules/views/graphql/fragments/viewGroupFragment.ts +++ b/packages/twenty-front/src/modules/views/graphql/fragments/viewGroupFragment.ts @@ -8,5 +8,8 @@ export const VIEW_GROUP_FRAGMENT = gql` fieldValue position viewId + createdAt + updatedAt + deletedAt } `; diff --git a/packages/twenty-front/src/modules/views/graphql/mutations/deleteCoreViewGroup.ts b/packages/twenty-front/src/modules/views/graphql/mutations/deleteCoreViewGroup.ts index e2da3700491..8d4d56f36af 100644 --- a/packages/twenty-front/src/modules/views/graphql/mutations/deleteCoreViewGroup.ts +++ b/packages/twenty-front/src/modules/views/graphql/mutations/deleteCoreViewGroup.ts @@ -1,7 +1,11 @@ +import { VIEW_GROUP_FRAGMENT } from '@/views/graphql/fragments/viewGroupFragment'; import { gql } from '@apollo/client'; export const DELETE_CORE_VIEW_GROUP = gql` - mutation DeleteCoreViewGroup($id: String!) { - deleteCoreViewGroup(id: $id) + ${VIEW_GROUP_FRAGMENT} + mutation DeleteCoreViewGroup($input: DeleteViewGroupInput!) { + deleteCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } `; diff --git a/packages/twenty-front/src/modules/views/graphql/mutations/destroyCoreViewGroup.ts b/packages/twenty-front/src/modules/views/graphql/mutations/destroyCoreViewGroup.ts index ce088e33a44..27a118d4a94 100644 --- a/packages/twenty-front/src/modules/views/graphql/mutations/destroyCoreViewGroup.ts +++ b/packages/twenty-front/src/modules/views/graphql/mutations/destroyCoreViewGroup.ts @@ -1,7 +1,11 @@ +import { VIEW_GROUP_FRAGMENT } from '@/views/graphql/fragments/viewGroupFragment'; import { gql } from '@apollo/client'; export const DESTROY_CORE_VIEW_GROUP = gql` - mutation DestroyCoreViewGroup($id: String!) { - destroyCoreViewGroup(id: $id) + ${VIEW_GROUP_FRAGMENT} + mutation DestroyCoreViewGroup($input: DestroyViewGroupInput!) { + destroyCoreViewGroup(input: $input) { + ...ViewGroupFragment + } } `; diff --git a/packages/twenty-front/src/modules/views/graphql/mutations/updateCoreViewGroup.ts b/packages/twenty-front/src/modules/views/graphql/mutations/updateCoreViewGroup.ts index 542f0cb5050..7cb9464dfb1 100644 --- a/packages/twenty-front/src/modules/views/graphql/mutations/updateCoreViewGroup.ts +++ b/packages/twenty-front/src/modules/views/graphql/mutations/updateCoreViewGroup.ts @@ -3,8 +3,8 @@ import { gql } from '@apollo/client'; export const UPDATE_CORE_VIEW_GROUP = gql` ${VIEW_GROUP_FRAGMENT} - mutation UpdateCoreViewGroup($id: String!, $input: UpdateViewGroupInput!) { - updateCoreViewGroup(id: $id, input: $input) { + mutation UpdateCoreViewGroup($input: UpdateViewGroupInput!) { + updateCoreViewGroup(input: $input) { ...ViewGroupFragment } } diff --git a/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewGroupRecords.ts b/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewGroupRecords.ts index 65dc65965e2..dbff7ac0aae 100644 --- a/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewGroupRecords.ts +++ b/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewGroupRecords.ts @@ -1,115 +1,128 @@ import { useCallback } from 'react'; -import { CREATE_CORE_VIEW_GROUP } from '@/views/graphql/mutations/createCoreViewGroup'; -import { DESTROY_CORE_VIEW_GROUP } from '@/views/graphql/mutations/destroyCoreViewGroup'; -import { UPDATE_CORE_VIEW_GROUP } from '@/views/graphql/mutations/updateCoreViewGroup'; import { useTriggerViewGroupOptimisticEffect } from '@/views/optimistic-effects/hooks/useTriggerViewGroupOptimisticEffect'; -import { type ViewGroup } from '@/views/types/ViewGroup'; -import { useApolloClient } from '@apollo/client'; -import { type CoreViewGroup } from '~/generated/graphql'; - -type CreateViewGroupRecordsArgs = { - viewGroupsToCreate: ViewGroup[]; - viewId: string; -}; +import { isDefined } from 'twenty-shared/utils'; +import { + type CreateCoreViewGroupMutationVariables, + type DeleteCoreViewGroupMutationVariables, + type DestroyCoreViewGroupMutationVariables, + type UpdateCoreViewGroupMutationVariables, + useCreateCoreViewGroupMutation, + useDeleteCoreViewGroupMutation, + useDestroyCoreViewGroupMutation, + useUpdateCoreViewGroupMutation, +} from '~/generated/graphql'; export const usePersistViewGroupRecords = () => { - const apolloClient = useApolloClient(); - const { triggerViewGroupOptimisticEffect } = useTriggerViewGroupOptimisticEffect(); + const [createCoreViewGroupMutation] = useCreateCoreViewGroupMutation(); + const [updateCoreViewGroupMutation] = useUpdateCoreViewGroupMutation(); + const [deleteCoreViewGroupMutation] = useDeleteCoreViewGroupMutation(); + const [destroyCoreViewGroupMutation] = useDestroyCoreViewGroupMutation(); const createCoreViewGroupRecords = useCallback( - ({ viewGroupsToCreate, viewId }: CreateViewGroupRecordsArgs) => { - if (viewGroupsToCreate.length === 0) return; + (createCoreViewGroupInputs: CreateCoreViewGroupMutationVariables[]) => { + if (createCoreViewGroupInputs.length === 0) { + return; + } return Promise.all( - viewGroupsToCreate.map((viewGroup) => - apolloClient.mutate({ - mutation: CREATE_CORE_VIEW_GROUP, - variables: { - input: { - id: viewGroup.id, - viewId, - fieldMetadataId: viewGroup.fieldMetadataId, - fieldValue: viewGroup.fieldValue, - isVisible: viewGroup.isVisible, - position: viewGroup.position, - }, - }, + createCoreViewGroupInputs.map((variables) => + createCoreViewGroupMutation({ + variables, update: (_cache, { data }) => { - const record = data?.['createCoreViewGroup']; - if (!record) return; + const createdViewGroup = data?.createCoreViewGroup; + if (!isDefined(createdViewGroup)) { + return; + } triggerViewGroupOptimisticEffect({ - createdViewGroups: [record], + createdViewGroups: [createdViewGroup], }); }, }), ), ); }, - [apolloClient, triggerViewGroupOptimisticEffect], + [triggerViewGroupOptimisticEffect, createCoreViewGroupMutation], ); const updateCoreViewGroupRecords = useCallback( - async (viewGroupsToUpdate: ViewGroup[]) => { - if (!viewGroupsToUpdate.length) return; - - const mutationPromises = viewGroupsToUpdate.map((viewGroup) => - apolloClient.mutate<{ updateCoreViewGroup: CoreViewGroup }>({ - mutation: UPDATE_CORE_VIEW_GROUP, - variables: { - id: viewGroup.id, - input: { - isVisible: viewGroup.isVisible, - position: viewGroup.position, - }, - }, - // Avoid cache being updated with stale data - fetchPolicy: 'no-cache', - update: (_cache, { data }) => { - const record = data?.['updateCoreViewGroup']; - if (!record) return; - - triggerViewGroupOptimisticEffect({ - updatedViewGroups: [record], - }); - }, - }), - ); - - return Promise.all(mutationPromises); - }, - [apolloClient, triggerViewGroupOptimisticEffect], - ); - - const deleteCoreViewGroupRecords = useCallback( - async (viewGroupsToDelete: Pick[]) => { - if (!viewGroupsToDelete.length) return; + (updateCoreViewGroupInputs: UpdateCoreViewGroupMutationVariables[]) => { + if (updateCoreViewGroupInputs.length === 0) { + return; + } return Promise.all( - viewGroupsToDelete.map((viewGroup) => - apolloClient.mutate({ - mutation: DESTROY_CORE_VIEW_GROUP, - variables: { - id: viewGroup.id, - }, - update: () => { + updateCoreViewGroupInputs.map((variables) => + updateCoreViewGroupMutation({ + variables, + update: (_cache, { data }) => { + const updatedViewGroup = data?.updateCoreViewGroup; + if (!isDefined(updatedViewGroup)) { + return; + } + triggerViewGroupOptimisticEffect({ - deletedViewGroups: [viewGroup], + updatedViewGroups: [updatedViewGroup], }); }, }), ), ); }, - [apolloClient, triggerViewGroupOptimisticEffect], + [triggerViewGroupOptimisticEffect, updateCoreViewGroupMutation], + ); + + const deleteCoreViewGroupRecords = useCallback( + (deleteCoreViewGroupInputs: DeleteCoreViewGroupMutationVariables[]) => { + if (deleteCoreViewGroupInputs.length === 0) { + return; + } + + return Promise.all( + deleteCoreViewGroupInputs.map((variables) => + deleteCoreViewGroupMutation({ + variables, + update: (_cache, { data }) => { + const deletedViewGroup = data?.deleteCoreViewGroup; + if (!isDefined(deletedViewGroup)) { + return; + } + + triggerViewGroupOptimisticEffect({ + deletedViewGroups: [deletedViewGroup], + }); + }, + }), + ), + ); + }, + [triggerViewGroupOptimisticEffect, deleteCoreViewGroupMutation], + ); + + const destroyCoreViewGroupRecords = useCallback( + (destroyCoreViewGroupInputs: DestroyCoreViewGroupMutationVariables[]) => { + if (destroyCoreViewGroupInputs.length === 0) { + return; + } + + return Promise.all( + destroyCoreViewGroupInputs.map((variables) => + destroyCoreViewGroupMutation({ + variables, + }), + ), + ); + }, + [destroyCoreViewGroupMutation], ); return { createViewGroupRecords: createCoreViewGroupRecords, updateViewGroupRecords: updateCoreViewGroupRecords, deleteViewGroupRecords: deleteCoreViewGroupRecords, + destroyViewGroupRecords: destroyCoreViewGroupRecords, }; }; diff --git a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts index 14b03f3d28a..e78b5bf2fcb 100644 --- a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts @@ -194,10 +194,14 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { fieldMetadataId: kanbanFieldMetadataId, } satisfies ViewGroup); - await createViewGroupRecords({ - viewGroupsToCreate, - viewId: newViewId, - }); + await createViewGroupRecords( + viewGroupsToCreate.map((viewGroup) => ({ + input: { + ...viewGroup, + viewId: newViewId, + }, + })), + ); } if (shouldCopyFiltersAndSortsAndAggregate === true) { diff --git a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts index 02431bf0ff7..b45b1a90a84 100644 --- a/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts +++ b/packages/twenty-front/src/modules/views/hooks/useSaveCurrentViewGroups.ts @@ -63,7 +63,17 @@ export const useSaveCurrentViewGroups = () => { } await updateViewGroupRecords([ - { ...viewGroupToSave, id: existingField.id }, + { + input: { + id: existingField.id, + update: { + isVisible: viewGroupToSave.isVisible, + position: viewGroupToSave.position, + fieldMetadataId: viewGroupToSave.fieldMetadataId, + fieldValue: viewGroupToSave.fieldValue, + }, + }, + }, ]); }, [ @@ -118,7 +128,17 @@ export const useSaveCurrentViewGroups = () => { return undefined; } - return { ...viewGroupToSave, id: existingField.id }; + return { + input: { + id: existingField.id, + update: { + isVisible: viewGroupToSave.isVisible, + position: viewGroupToSave.position, + fieldMetadataId: viewGroupToSave.fieldMetadataId, + fieldValue: viewGroupToSave.fieldValue, + }, + }, + }; }) .filter(isDefined); @@ -131,7 +151,14 @@ export const useSaveCurrentViewGroups = () => { ); await Promise.all([ - createViewGroupRecords({ viewGroupsToCreate, viewId: view.id }), + createViewGroupRecords( + viewGroupsToCreate.map((viewGroup) => ({ + input: { + ...viewGroup, + viewId: view.id, + }, + })), + ), updateViewGroupRecords(viewGroupsToUpdate), ]); }, diff --git a/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewGroupOptimisticEffect.ts b/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewGroupOptimisticEffect.ts index c6a6a5bd1d1..a449aa6d7f3 100644 --- a/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewGroupOptimisticEffect.ts +++ b/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewGroupOptimisticEffect.ts @@ -6,7 +6,11 @@ import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; import { type CoreViewGroup } from '~/generated/graphql'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; - +type UpdatedDeletedCoreViewGroup = { + createdViewGroups?: Omit[]; + updatedViewGroups?: Omit[]; + deletedViewGroups?: Pick[]; +}; export const useTriggerViewGroupOptimisticEffect = () => { const apolloClient = useApolloClient(); @@ -18,11 +22,7 @@ export const useTriggerViewGroupOptimisticEffect = () => { createdViewGroups = [], updatedViewGroups = [], deletedViewGroups = [], - }: { - createdViewGroups?: CoreViewGroup[]; - updatedViewGroups?: CoreViewGroup[]; - deletedViewGroups?: Pick[]; - }) => { + }: UpdatedDeletedCoreViewGroup) => { const coreViews = getSnapshotValue(snapshot, coreViewsState); let newCoreViews = [...coreViews]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-maps-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-maps-properties.constant.ts index 47c7cf66276..2081fc0179e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-maps-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-maps-properties.constant.ts @@ -1,14 +1,6 @@ -import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -export const ALL_FLAT_ENTITY_MAPS_PROPERTIES = [ - 'flatObjectMetadataMaps', - 'flatViewFieldMaps', - 'flatViewMaps', - 'flatIndexMaps', - 'flatServerlessFunctionMaps', - 'flatDatabaseEventTriggerMaps', - 'flatCronTriggerMaps', - 'flatRouteTriggerMaps', - 'flatFieldMetadataMaps', - 'flatViewFilterMaps', -] as const satisfies (keyof AllFlatEntityMaps)[]; +export const ALL_FLAT_ENTITY_MAPS_PROPERTIES = Object.keys( + ALL_METADATA_NAME, +).map(getMetadataFlatEntityMapsKey); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts index 2adf75ad798..6e9e4686f3b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-flat-entity-properties-to-compare-and-stringify.constant.ts @@ -5,6 +5,7 @@ import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity import { FLAT_FIELD_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant'; import { FLAT_VIEW_FIELD_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant'; import { FLAT_VIEW_FILTER_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant'; +import { FLAT_VIEW_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant'; import { FLAT_VIEW_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view/constants/flat-view-editable-properties.constant'; import { FLAT_ROUTE_TRIGGER_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/route-trigger/constants/flat-route-trigger-editable-properties.constant'; import { FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/serverless-function/constants/flat-serverless-function-editable-properties.constant'; @@ -49,6 +50,10 @@ export const ALL_FLAT_ENTITY_PROPERTIES_TO_COMPARE_AND_STRINGIFY = { propertiesToCompare: [...FLAT_VIEW_FIELD_EDITABLE_PROPERTIES, 'deletedAt'], propertiesToStringify: [], }, + viewGroup: { + propertiesToCompare: [...FLAT_VIEW_GROUP_EDITABLE_PROPERTIES, 'deletedAt'], + propertiesToStringify: [], + }, index: { propertiesToCompare: [ 'indexType', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-many-to-one-relations.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-many-to-one-relations.constant.ts index 85a12133f7c..8141c7bc665 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-many-to-one-relations.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-many-to-one-relations.constant.ts @@ -42,6 +42,10 @@ export const ALL_METADATA_NAME_MANY_TO_ONE_RELATIONS = { view: 'viewId', fieldMetadata: 'fieldMetadataId', }, + viewGroup: { + view: 'viewId', + fieldMetadata: 'fieldMetadataId', + }, index: { objectMetadata: 'objectMetadataId', }, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant.ts index 6749c9a1a03..ba65f2c301f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant.ts @@ -3,6 +3,7 @@ export const ALL_METADATA_NAME = { objectMetadata: 'objectMetadata', view: 'view', viewField: 'viewField', + viewGroup: 'viewGroup', index: 'index', serverlessFunction: 'serverlessFunction', cronTrigger: 'cronTrigger', diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts index 08703385669..7fe2d91e48c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-metadata-required-metadata-for-validation.constant.ts @@ -43,4 +43,8 @@ export const ALL_METADATA_REQUIRED_METADATA_FOR_VALIDATION = { view: true, fieldMetadata: true, }, + viewGroup: { + fieldMetadata: true, + view: true, + }, } as const satisfies MetadataRequiredForValidation; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant.ts index f915f233293..0beadbc3c6e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant.ts @@ -1,15 +1,15 @@ +import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant'; import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -export const EMPTY_ALL_FLAT_ENTITY_MAPS = { - flatObjectMetadataMaps: EMPTY_FLAT_ENTITY_MAPS, - flatFieldMetadataMaps: EMPTY_FLAT_ENTITY_MAPS, - flatIndexMaps: EMPTY_FLAT_ENTITY_MAPS, - flatViewFieldMaps: EMPTY_FLAT_ENTITY_MAPS, - flatViewMaps: EMPTY_FLAT_ENTITY_MAPS, - flatServerlessFunctionMaps: EMPTY_FLAT_ENTITY_MAPS, - flatCronTriggerMaps: EMPTY_FLAT_ENTITY_MAPS, - flatDatabaseEventTriggerMaps: EMPTY_FLAT_ENTITY_MAPS, - flatRouteTriggerMaps: EMPTY_FLAT_ENTITY_MAPS, - flatViewFilterMaps: EMPTY_FLAT_ENTITY_MAPS, -} as const satisfies AllFlatEntityMaps; +export const EMPTY_ALL_FLAT_ENTITY_MAPS = ( + Object.keys(ALL_METADATA_NAME) as AllMetadataName[] +).reduce( + (acc, metadataName) => ({ + ...acc, + [getMetadataFlatEntityMapsKey(metadataName)]: EMPTY_FLAT_ENTITY_MAPS, + }), + {} as AllFlatEntityMaps, +); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts index 71edfb34856..bfe8ee69fa0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-by-metadata-engine-name-test.type.ts @@ -1,6 +1,7 @@ import { type Expect } from 'twenty-shared/testing'; import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; +import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type'; import { type FlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type'; import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; @@ -19,6 +20,16 @@ type ExpectedGenericAllFlatEntityInformationByMetadataEngine = { // eslint-disable-next-line unused-imports/no-unused-vars type Assertions = [ + Expect< + keyof AllFlatEntityTypesByMetadataName extends AllMetadataName + ? true + : false + >, + Expect< + AllMetadataName extends keyof AllFlatEntityTypesByMetadataName + ? true + : false + >, Expect< AllFlatEntityTypesByMetadataName extends ExpectedGenericAllFlatEntityInformationByMetadataEngine ? true diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts index 941113c0a93..71194ad8cb0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts @@ -8,6 +8,7 @@ import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-m import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -17,6 +18,7 @@ import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serve import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type'; import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { type CreateCronTriggerAction, @@ -62,6 +64,11 @@ import { type DeleteViewFilterAction, type UpdateViewFilterAction, } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type'; +import { + type CreateViewGroupAction, + type DeleteViewGroupAction, + type UpdateViewGroupAction, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type'; import { type CreateViewAction, type DeleteViewAction, @@ -105,6 +112,15 @@ export type AllFlatEntityTypesByMetadataName = { flatEntity: FlatViewField; entity: ViewFieldEntity; }; + viewGroup: { + actions: { + created: CreateViewGroupAction; + updated: UpdateViewGroupAction; + deleted: DeleteViewGroupAction; + }; + flatEntity: FlatViewGroup; + entity: ViewGroupEntity; + }; index: { actions: { created: CreateIndexAction; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts index 225d65755a5..d5c9773e079 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts @@ -2,6 +2,7 @@ import { type FieldInputTranspilationResult, type SuccessfulFieldInputTranspilation, } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type'; +import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; // This could be improved by still running the build and validate with available valid inputs @@ -24,11 +25,7 @@ export const throwOnFieldInputTranspilationsError: ThrowOnFieldInputTranspilatio throw new WorkspaceMigrationBuilderExceptionV2( { report: { - viewFilter: [], - fieldMetadata: [], - index: [], - view: [], - viewField: [], + ...EMPTY_ORCHESTRATOR_FAILURE_REPORT, objectMetadata: [ { errors: failedInputTranspilationErrors, @@ -36,10 +33,6 @@ export const throwOnFieldInputTranspilationsError: ThrowOnFieldInputTranspilatio flatEntityMinimalInformation: {}, }, ], - serverlessFunction: [], - databaseEventTrigger: [], - cronTrigger: [], - routeTrigger: [], }, status: 'fail', }, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts new file mode 100644 index 00000000000..3d6c17d55e4 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts @@ -0,0 +1,8 @@ +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; + +export const FLAT_VIEW_GROUP_EDITABLE_PROPERTIES = [ + 'isVisible', + 'fieldValue', + 'position', + 'fieldMetadataId', +] as const satisfies (keyof FlatViewGroup)[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts new file mode 100644 index 00000000000..1876833055b --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant.ts @@ -0,0 +1,7 @@ +import { type ViewGroupEntityRelationProperties } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; + +export const VIEW_GROUP_ENTITY_RELATION_PROPERTIES = [ + 'fieldMetadata', + 'view', + 'workspace', +] as const satisfies ViewGroupEntityRelationProperties[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/services/workspace-flat-view-group-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/services/workspace-flat-view-group-map-cache.service.ts new file mode 100644 index 00000000000..1b6a81e9422 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/services/workspace-flat-view-group-map-cache.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; + +import { Repository } from 'typeorm'; + +import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator'; +import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; +import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum'; +import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; +import { fromViewGroupEntityToFlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util'; +import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { WorkspaceFlatMapCache } from 'src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator'; +import { WorkspaceFlatMapCacheService } from 'src/engine/workspace-flat-map-cache/services/workspace-flat-map-cache.service'; + +@Injectable() +@WorkspaceFlatMapCache('flatViewGroupMaps') +export class WorkspaceFlatViewGroupMapCacheService extends WorkspaceFlatMapCacheService { + constructor( + @InjectCacheStorage(CacheStorageNamespace.EngineWorkspace) + cacheStorageService: CacheStorageService, + @InjectRepository(ViewGroupEntity) + private readonly viewGroupRepository: Repository, + ) { + super(cacheStorageService); + } + + protected async computeFlatMap({ + workspaceId, + }: { + workspaceId: string; + }): Promise { + const existingViewGroups = await this.viewGroupRepository.find({ + where: { + workspaceId, + }, + withDeleted: true, + }); + + return existingViewGroups.reduce((flatViewGroupMaps, viewGroupEntity) => { + const flatViewGroup = fromViewGroupEntityToFlatViewGroup(viewGroupEntity); + + return addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: flatViewGroup, + flatEntityMaps: flatViewGroupMaps, + }); + }, EMPTY_FLAT_ENTITY_MAPS); + } +} diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type.ts new file mode 100644 index 00000000000..4325752e533 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type.ts @@ -0,0 +1,4 @@ +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; + +export type FlatViewGroupMaps = FlatEntityMaps; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts new file mode 100644 index 00000000000..bbd6e4d6f14 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/types/flat-view-group.type.ts @@ -0,0 +1,18 @@ +import { type Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; +import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type'; + +export type ViewGroupEntityRelationProperties = + ExtractRecordTypeOrmRelationProperties< + ViewGroupEntity, + FieldMetadataEntity | ViewEntity | Workspace + >; + +export type FlatViewGroup = Omit< + ViewGroupEntity, + ViewGroupEntityRelationProperties +> & { + universalIdentifier: string; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts new file mode 100644 index 00000000000..1ab4cf106a3 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts @@ -0,0 +1,36 @@ +import { trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties } from 'twenty-shared/utils'; +import { v4 } from 'uuid'; + +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; + +export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ + createViewGroupInput: rawCreateViewGroupInput, + workspaceId, +}: { + createViewGroupInput: CreateViewGroupInput; + workspaceId: string; +}): FlatViewGroup => { + const { fieldMetadataId, viewId, ...createViewGroupInput } = + trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( + rawCreateViewGroupInput, + ['fieldMetadataId', 'fieldValue', 'id', 'viewId'], + ); + + const createdAt = new Date(); + const viewGroupId = createViewGroupInput.id ?? v4(); + + return { + id: viewGroupId, + fieldMetadataId, + viewId, + workspaceId, + createdAt: createdAt, + updatedAt: createdAt, + deletedAt: null, + universalIdentifier: viewGroupId, + isVisible: createViewGroupInput.isVisible ?? true, + fieldValue: createViewGroupInput.fieldValue, + position: createViewGroupInput.position ?? 0, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts new file mode 100644 index 00000000000..1416c2e5f32 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util.ts @@ -0,0 +1,40 @@ +import { t } from '@lingui/core/macro'; +import { + extractAndSanitizeObjectStringFields, + isDefined, +} from 'twenty-shared/utils'; + +import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; +import { + ViewGroupException, + ViewGroupExceptionCode, +} from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; + +export const fromDeleteViewGroupInputToFlatViewGroupOrThrow = ({ + deleteViewGroupInput: rawDeleteViewGroupInput, + flatViewGroupMaps, +}: { + deleteViewGroupInput: DeleteViewGroupInput; + flatViewGroupMaps: FlatViewGroupMaps; +}): FlatViewGroup => { + const { id: viewGroupId } = extractAndSanitizeObjectStringFields( + rawDeleteViewGroupInput, + ['id'], + ); + + const existingFlatViewGroupToDelete = flatViewGroupMaps.byId[viewGroupId]; + + if (!isDefined(existingFlatViewGroupToDelete)) { + throw new ViewGroupException( + t`View group to delete not found`, + ViewGroupExceptionCode.VIEW_GROUP_NOT_FOUND, + ); + } + + return { + ...existingFlatViewGroupToDelete, + deletedAt: new Date(), + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts new file mode 100644 index 00000000000..316292e52df --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util.ts @@ -0,0 +1,37 @@ +import { t } from '@lingui/core/macro'; +import { + extractAndSanitizeObjectStringFields, + isDefined, +} from 'twenty-shared/utils'; + +import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; +import { + ViewGroupException, + ViewGroupExceptionCode, +} from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; + +export const fromDestroyViewGroupInputToFlatViewGroupOrThrow = ({ + destroyViewGroupInput, + flatViewGroupMaps, +}: { + destroyViewGroupInput: DestroyViewGroupInput; + flatViewGroupMaps: FlatViewGroupMaps; +}): FlatViewGroup => { + const { id: viewGroupId } = extractAndSanitizeObjectStringFields( + destroyViewGroupInput, + ['id'], + ); + + const existingFlatViewGroupToDestroy = flatViewGroupMaps.byId[viewGroupId]; + + if (!isDefined(existingFlatViewGroupToDestroy)) { + throw new ViewGroupException( + t`View group to destroy not found`, + ViewGroupExceptionCode.VIEW_GROUP_NOT_FOUND, + ); + } + + return existingFlatViewGroupToDestroy; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts new file mode 100644 index 00000000000..be1225296db --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util.ts @@ -0,0 +1,50 @@ +import { t } from '@lingui/core/macro'; +import { + extractAndSanitizeObjectStringFields, + isDefined, + trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties, +} from 'twenty-shared/utils'; + +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { FLAT_VIEW_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input'; +import { + ViewGroupException, + ViewGroupExceptionCode, +} from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; +import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; + +export const fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow = ({ + updateViewGroupInput: rawUpdateViewGroupInput, + flatViewGroupMaps, +}: { + updateViewGroupInput: UpdateViewGroupInput; + flatViewGroupMaps: FlatEntityMaps; +}): FlatViewGroup => { + const { id: viewGroupToUpdateId, update } = + trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( + rawUpdateViewGroupInput, + ['id'], + ); + + const existingFlatViewGroupToUpdate = + flatViewGroupMaps.byId[viewGroupToUpdateId]; + + if (!isDefined(existingFlatViewGroupToUpdate)) { + throw new ViewGroupException( + t`View group to update not found`, + ViewGroupExceptionCode.VIEW_GROUP_NOT_FOUND, + ); + } + const updatedEditableGroupProperties = extractAndSanitizeObjectStringFields( + update, + FLAT_VIEW_GROUP_EDITABLE_PROPERTIES, + ); + + return mergeUpdateInExistingRecord({ + existing: existingFlatViewGroupToUpdate, + properties: FLAT_VIEW_GROUP_EDITABLE_PROPERTIES, + update: updatedEditableGroupProperties, + }); +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts new file mode 100644 index 00000000000..e8cc3b83227 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-view-group-entity-to-flat-view-group.util.ts @@ -0,0 +1,21 @@ +import { removePropertiesFromRecord } from 'twenty-shared/utils'; + +import { VIEW_GROUP_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/view-group-entity-relation-properties.constant'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const fromViewGroupEntityToFlatViewGroup = ( + viewGroupEntity: ViewGroupEntity, +): FlatViewGroup => { + const viewGroupEntityWithoutRelations = removePropertiesFromRecord( + viewGroupEntity, + VIEW_GROUP_ENTITY_RELATION_PROPERTIES, + ); + + return { + ...viewGroupEntityWithoutRelations, + universalIdentifier: + viewGroupEntityWithoutRelations.universalIdentifier ?? + viewGroupEntityWithoutRelations.id, + }; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/services/workspace-flat-view-map-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/services/workspace-flat-view-map-cache.service.ts index 1c16d692233..7ec8f35491b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/services/workspace-flat-view-map-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/services/workspace-flat-view-map-cache.service.ts @@ -43,7 +43,7 @@ export class WorkspaceFlatViewMapCacheService extends WorkspaceFlatMapCacheServi id: true, }, }, - relations: ['viewFields', 'viewFilters'], + relations: ['viewFields', 'viewFilters', 'viewGroups'], withDeleted: true, }); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts index e0cde363079..837a19c1dc2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/types/flat-view.type.ts @@ -24,4 +24,5 @@ export type FlatView = Omit & { universalIdentifier: string; viewFieldIds: string[]; viewFilterIds: string[]; + viewGroupIds: string[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts index ca60edc0f5f..b36066d5270 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-create-view-input-to-flat-view-to-create.util.ts @@ -45,5 +45,6 @@ export const fromCreateViewInputToFlatViewToCreate = ({ universalIdentifier: v4(), viewFieldIds: [], viewFilterIds: [], + viewGroupIds: [], }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts index 704df22f0c5..4966e2101ad 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view/utils/from-view-entity-to-flat-view.util.ts @@ -17,5 +17,6 @@ export const fromViewEntityToFlatView = (viewEntity: ViewEntity): FlatView => { viewEntityWithoutRelations.id, viewFieldIds: viewEntity.viewFields.map((viewField) => viewField.id), viewFilterIds: viewEntity.viewFilters.map((viewFilter) => viewFilter.id), + viewGroupIds: viewEntity.viewGroups.map((viewGroup) => viewGroup.id), }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input.ts index f0362675a49..f7747d548e2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input.ts @@ -1,24 +1,41 @@ import { Field, InputType } from '@nestjs/graphql'; +import { + IsBoolean, + IsNumber, + IsOptional, + IsString, + IsUUID, +} from 'class-validator'; + import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; @InputType() export class CreateViewGroupInput { + @IsOptional() + @IsUUID() @Field(() => UUIDScalarType, { nullable: true }) id?: string; + @IsUUID() @Field(() => UUIDScalarType, { nullable: false }) fieldMetadataId: string; + @IsOptional() + @IsBoolean() @Field({ nullable: true, defaultValue: true }) isVisible?: boolean; + @IsString() @Field({ nullable: false }) fieldValue: string; + @IsOptional() + @IsNumber() @Field({ nullable: true, defaultValue: 0 }) position?: number; + @IsUUID() @Field(() => UUIDScalarType, { nullable: false }) viewId: string; } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input.ts new file mode 100644 index 00000000000..a9d4f995115 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input.ts @@ -0,0 +1,15 @@ +import { InputType } from '@nestjs/graphql'; + +import { IDField } from '@ptc-org/nestjs-query-graphql'; +import { IsUUID } from 'class-validator'; + +import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; + +@InputType() +export class DeleteViewGroupInput { + @IDField(() => UUIDScalarType, { + description: 'The id of the view group to delete.', + }) + @IsUUID() + id: string; +} diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input.ts new file mode 100644 index 00000000000..652c220a29e --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input.ts @@ -0,0 +1,15 @@ +import { InputType } from '@nestjs/graphql'; + +import { IDField } from '@ptc-org/nestjs-query-graphql'; +import { IsUUID } from 'class-validator'; + +import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; + +@InputType() +export class DestroyViewGroupInput { + @IDField(() => UUIDScalarType, { + description: 'The id of the view group to destroy.', + }) + @IsUUID() + id: string; +} diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input.ts index 49b107aec26..c05fbbf90d0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input.ts @@ -1,6 +1,54 @@ -import { InputType, PartialType } from '@nestjs/graphql'; +import { Field, InputType } from '@nestjs/graphql'; -import { CreateViewGroupInput } from './create-view-group.input'; +import { + IsBoolean, + IsNotEmpty, + IsNumber, + IsOptional, + IsString, + IsUUID, + ValidateNested, +} from 'class-validator'; +import { Type } from 'class-transformer'; + +import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; @InputType() -export class UpdateViewGroupInput extends PartialType(CreateViewGroupInput) {} +class UpdateViewGroupInputUpdates { + @IsOptional() + @IsUUID() + @Field(() => UUIDScalarType, { nullable: true }) + fieldMetadataId?: string; + + @IsOptional() + @IsBoolean() + @Field({ nullable: true }) + isVisible?: boolean; + + @IsOptional() + @IsString() + @Field({ nullable: true }) + fieldValue?: string; + + @IsOptional() + @IsNumber() + @Field({ nullable: true }) + position?: number; +} + +@InputType() +export class UpdateViewGroupInput { + @IsUUID() + @IsNotEmpty() + @Field(() => UUIDScalarType, { + description: 'The id of the view group to update', + }) + id: string; + + @Type(() => UpdateViewGroupInputUpdates) + @ValidateNested() + @Field(() => UpdateViewGroupInputUpdates, { + description: 'The view group to update', + }) + update: UpdateViewGroupInputUpdates; +} diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts index 2e8757faa5f..64b742b674c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts @@ -57,7 +57,7 @@ export class ViewGroupEntity extends SyncableEntity { updatedAt: Date; @DeleteDateColumn({ type: 'timestamptz' }) - deletedAt?: Date | null; + deletedAt: Date | null; @ManyToOne(() => Workspace, { onDelete: 'CASCADE', diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/resolvers/view-group.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/resolvers/view-group.resolver.ts index 2522a3d3e1f..39ca1cfc1a7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/resolvers/view-group.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/resolvers/view-group.resolver.ts @@ -1,14 +1,17 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; -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 { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; import { CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; +import { DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; +import { DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; import { UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input'; import { ViewGroupDTO } from 'src/engine/metadata-modules/view-group/dtos/view-group.dto'; +import { ViewGroupV2Service } from 'src/engine/metadata-modules/view-group/services/view-group-v2.service'; import { ViewGroupService } from 'src/engine/metadata-modules/view-group/services/view-group.service'; import { ViewGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/view/utils/view-graphql-api-exception.filter'; @@ -16,7 +19,11 @@ import { ViewGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/view/ @UseFilters(ViewGraphqlApiExceptionFilter) @UseGuards(WorkspaceAuthGuard) export class ViewGroupResolver { - constructor(private readonly viewGroupService: ViewGroupService) {} + constructor( + private readonly viewGroupService: ViewGroupService, + private readonly featureFlagService: FeatureFlagService, + private readonly viewGroupV2Service: ViewGroupV2Service, + ) {} @Query(() => [ViewGroupDTO]) async getCoreViewGroups( @@ -41,47 +48,104 @@ export class ViewGroupResolver { @Mutation(() => ViewGroupDTO) async createCoreViewGroup( - @Args('input') input: CreateViewGroupInput, - @AuthWorkspace() workspace: Workspace, + @Args('input') createViewGroupInput: CreateViewGroupInput, + @AuthWorkspace() { id: workspaceId }: Workspace, ): Promise { + const isWorkspaceMigrationV2Enabled = + await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + workspaceId, + ); + + if (isWorkspaceMigrationV2Enabled) { + return await this.viewGroupV2Service.createOne({ + createViewGroupInput, + workspaceId, + }); + } + return this.viewGroupService.create({ - ...input, - workspaceId: workspace.id, + ...createViewGroupInput, + workspaceId, }); } @Mutation(() => ViewGroupDTO) async updateCoreViewGroup( - @Args('id', { type: () => String }) id: string, - @Args('input') input: UpdateViewGroupInput, - @AuthWorkspace() workspace: Workspace, + @Args('input') updateViewGroupInput: UpdateViewGroupInput, + @AuthWorkspace() { id: workspaceId }: Workspace, ): Promise { - return this.viewGroupService.update(id, workspace.id, input); + const isWorkspaceMigrationV2Enabled = + await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + workspaceId, + ); + + if (isWorkspaceMigrationV2Enabled) { + return await this.viewGroupV2Service.updateOne({ + updateViewGroupInput, + workspaceId, + }); + } + + return this.viewGroupService.update( + updateViewGroupInput.id, + workspaceId, + updateViewGroupInput.update, + ); } - @Mutation(() => Boolean) + @Mutation(() => ViewGroupDTO) async deleteCoreViewGroup( - @Args('id', { type: () => String }) id: string, - @AuthWorkspace() workspace: Workspace, - ): Promise { + @Args('input') deleteViewGroupInput: DeleteViewGroupInput, + @AuthWorkspace() { id: workspaceId }: Workspace, + ): Promise { + const isWorkspaceMigrationV2Enabled = + await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + workspaceId, + ); + + if (isWorkspaceMigrationV2Enabled) { + return await this.viewGroupV2Service.deleteOne({ + deleteViewGroupInput, + workspaceId, + }); + } + const deletedViewGroup = await this.viewGroupService.delete( - id, - workspace.id, + deleteViewGroupInput.id, + workspaceId, ); - return isDefined(deletedViewGroup); + return deletedViewGroup; } - @Mutation(() => Boolean) + @Mutation(() => ViewGroupDTO) async destroyCoreViewGroup( - @Args('id', { type: () => String }) id: string, - @AuthWorkspace() workspace: Workspace, - ): Promise { - const deletedViewGroup = await this.viewGroupService.destroy( - id, - workspace.id, + @Args('input') destroyViewGroupInput: DestroyViewGroupInput, + @AuthWorkspace() { id: workspaceId }: Workspace, + ): Promise { + const isWorkspaceMigrationV2Enabled = + await this.featureFlagService.isFeatureEnabled( + FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + workspaceId, + ); + + if (isWorkspaceMigrationV2Enabled) { + const destroyedViewGroup = await this.viewGroupV2Service.destroyOne({ + destroyViewGroupInput, + workspaceId, + }); + + return destroyedViewGroup; + } + + const destroyedViewGroup = await this.viewGroupService.destroy( + destroyViewGroupInput.id, + workspaceId, ); - return isDefined(deletedViewGroup); + return destroyedViewGroup; } } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/tests/view-group.service.spec.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/tests/view-group.service.spec.ts index ab884d1f77f..068d4c23fe5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/tests/view-group.service.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/tests/view-group.service.spec.ts @@ -315,7 +315,7 @@ describe('ViewGroupService', () => { expect(viewGroupService.findById).toHaveBeenCalledWith(id, workspaceId); expect(viewGroupRepository.delete).toHaveBeenCalledWith(id); - expect(result).toEqual(true); + expect(result).toEqual(mockViewGroup); }); }); }); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group-v2.service.ts new file mode 100644 index 00000000000..acdd581d3c0 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group-v2.service.ts @@ -0,0 +1,323 @@ +import { Injectable } from '@nestjs/common'; + +import { isDefined } from 'twenty-shared/utils'; + +import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-flat-entity-maps.constant'; +import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util'; +import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; +import { fromCreateViewGroupInputToFlatViewGroupToCreate } from 'src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util'; +import { fromDeleteViewGroupInputToFlatViewGroupOrThrow } from 'src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util'; +import { fromDestroyViewGroupInputToFlatViewGroupOrThrow } from 'src/engine/metadata-modules/flat-view-group/utils/from-destroy-view-group-input-to-flat-view-group-or-throw.util'; +import { fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow } from 'src/engine/metadata-modules/flat-view-group/utils/from-update-view-group-input-to-flat-view-group-to-update-or-throw.util'; +import { CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; +import { DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; +import { DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; +import { UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input'; +import { ViewGroupDTO } from 'src/engine/metadata-modules/view-group/dtos/view-group.dto'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; +import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; + +@Injectable() +export class ViewGroupV2Service { + constructor( + private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, + private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, + ) {} + + async createOne({ + createViewGroupInput, + workspaceId, + }: { + createViewGroupInput: CreateViewGroupInput; + workspaceId: string; + }): Promise { + const { + flatViewGroupMaps: existingFlatViewGroupMaps, + flatViewMaps, + flatFieldMetadataMaps, + } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: [ + 'flatViewGroupMaps', + 'flatViewMaps', + 'flatFieldMetadataMaps', + ], + }, + ); + + const flatViewGroupToCreate = + fromCreateViewGroupInputToFlatViewGroupToCreate({ + createViewGroupInput, + workspaceId, + }); + + const toFlatViewGroupMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: flatViewGroupToCreate, + flatEntityMaps: existingFlatViewGroupMaps, + }); + + const validateAndBuildResult = + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( + { + fromToAllFlatEntityMaps: { + flatViewGroupMaps: { + from: existingFlatViewGroupMaps, + to: toFlatViewGroupMaps, + }, + }, + dependencyAllFlatEntityMaps: { + flatFieldMetadataMaps, + flatViewMaps, + }, + buildOptions: { + isSystemBuild: false, + inferDeletionFromMissingEntities: false, + }, + workspaceId, + }, + ); + + if (isDefined(validateAndBuildResult)) { + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while creating view group', + ); + } + + const { flatViewGroupMaps: recomputedExistingFlatViewGroupMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: ['flatViewGroupMaps'], + }, + ); + + return findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: flatViewGroupToCreate.id, + flatEntityMaps: recomputedExistingFlatViewGroupMaps, + }); + } + + async updateOne({ + updateViewGroupInput, + workspaceId, + }: { + workspaceId: string; + updateViewGroupInput: UpdateViewGroupInput; + }): Promise { + const { + flatViewGroupMaps: existingFlatViewGroupMaps, + flatViewMaps, + flatFieldMetadataMaps, + } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: [ + 'flatViewGroupMaps', + 'flatViewMaps', + 'flatFieldMetadataMaps', + ], + }, + ); + + const optimisticallyUpdatedFlatViewGroup = + fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow({ + flatViewGroupMaps: existingFlatViewGroupMaps, + updateViewGroupInput, + }); + + const toFlatViewGroupMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: optimisticallyUpdatedFlatViewGroup, + flatEntityMaps: EMPTY_FLAT_ENTITY_MAPS, + }); + + const validateAndBuildResult = + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( + { + fromToAllFlatEntityMaps: { + flatViewGroupMaps: { + from: existingFlatViewGroupMaps, + to: toFlatViewGroupMaps, + }, + }, + dependencyAllFlatEntityMaps: { + flatViewMaps, + flatFieldMetadataMaps, + }, + buildOptions: { + isSystemBuild: false, + inferDeletionFromMissingEntities: false, + }, + workspaceId, + }, + ); + + if (isDefined(validateAndBuildResult)) { + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while updating view group', + ); + } + + const { flatViewGroupMaps: recomputedExistingFlatViewGroupMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: ['flatViewGroupMaps'], + }, + ); + + return findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewGroup.id, + flatEntityMaps: recomputedExistingFlatViewGroupMaps, + }); + } + + async deleteOne({ + deleteViewGroupInput, + workspaceId, + }: { + deleteViewGroupInput: DeleteViewGroupInput; + workspaceId: string; + }): Promise { + const { + flatViewGroupMaps: existingFlatViewGroupMaps, + flatViewMaps, + flatFieldMetadataMaps, + } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: [ + 'flatViewGroupMaps', + 'flatViewMaps', + 'flatFieldMetadataMaps', + ], + }, + ); + + const optimisticallyUpdatedFlatViewGroupWithDeletedAt = + fromDeleteViewGroupInputToFlatViewGroupOrThrow({ + flatViewGroupMaps: existingFlatViewGroupMaps, + deleteViewGroupInput, + }); + + const toFlatViewGroupMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: optimisticallyUpdatedFlatViewGroupWithDeletedAt, + flatEntityMaps: existingFlatViewGroupMaps, + }); + + const validateAndBuildResult = + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( + { + fromToAllFlatEntityMaps: { + flatViewGroupMaps: { + from: existingFlatViewGroupMaps, + to: toFlatViewGroupMaps, + }, + }, + dependencyAllFlatEntityMaps: { + flatFieldMetadataMaps, + flatViewMaps, + }, + buildOptions: { + isSystemBuild: false, + inferDeletionFromMissingEntities: false, + }, + workspaceId, + }, + ); + + if (isDefined(validateAndBuildResult)) { + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while deleting view group', + ); + } + + const { flatViewGroupMaps: recomputedExistingFlatViewGroupMaps } = + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: ['flatViewGroupMaps'], + }, + ); + + return findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: optimisticallyUpdatedFlatViewGroupWithDeletedAt.id, + flatEntityMaps: recomputedExistingFlatViewGroupMaps, + }); + } + + async destroyOne({ + destroyViewGroupInput, + workspaceId, + }: { + destroyViewGroupInput: DestroyViewGroupInput; + workspaceId: string; + }): Promise { + const { + flatViewGroupMaps: existingFlatViewGroupMaps, + flatViewMaps: existingFlatViewMaps, + flatFieldMetadataMaps: existingFlatFieldMetadataMaps, + } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( + { + workspaceId, + flatMapsKeys: [ + 'flatViewGroupMaps', + 'flatViewMaps', + 'flatFieldMetadataMaps', + ], + }, + ); + + const existingViewGroupToDelete = + fromDestroyViewGroupInputToFlatViewGroupOrThrow({ + destroyViewGroupInput, + flatViewGroupMaps: existingFlatViewGroupMaps, + }); + + const fromFlatViewGroupMaps = getSubFlatEntityMapsOrThrow({ + flatEntityIds: [existingViewGroupToDelete.id], + flatEntityMaps: existingFlatViewGroupMaps, + }); + const toFlatViewGroupMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ + flatEntityMaps: fromFlatViewGroupMaps, + entityToDeleteId: existingViewGroupToDelete.id, + }); + + const validateAndBuildResult = + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( + { + fromToAllFlatEntityMaps: { + flatViewGroupMaps: { + from: fromFlatViewGroupMaps, + to: toFlatViewGroupMaps, + }, + }, + dependencyAllFlatEntityMaps: { + flatViewMaps: existingFlatViewMaps, + flatFieldMetadataMaps: existingFlatFieldMetadataMaps, + }, + buildOptions: { + isSystemBuild: false, + inferDeletionFromMissingEntities: true, + }, + workspaceId, + }, + ); + + if (isDefined(validateAndBuildResult)) { + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while destroying view group', + ); + } + + return existingViewGroupToDelete; + } +} diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts index 6d0e7f2c03d..fd8dd9b8ac0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts @@ -168,7 +168,7 @@ export class ViewGroupService { return viewGroup; } - async destroy(id: string, workspaceId: string): Promise { + async destroy(id: string, workspaceId: string): Promise { const viewGroup = await this.findById(id, workspaceId); if (!isDefined(viewGroup)) { @@ -185,7 +185,7 @@ export class ViewGroupService { await this.flushGraphQLCache(workspaceId); - return true; + return viewGroup; } private async flushGraphQLCache(workspaceId: string): Promise { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/view-group.module.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/view-group.module.ts index 48c1f6bbf1e..aaa378e13c0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/view-group.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/view-group.module.ts @@ -1,19 +1,26 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; +import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module'; import { ViewGroupController } from 'src/engine/metadata-modules/view-group/controllers/view-group.controller'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; import { ViewGroupResolver } from 'src/engine/metadata-modules/view-group/resolvers/view-group.resolver'; +import { ViewGroupV2Service } from 'src/engine/metadata-modules/view-group/services/view-group-v2.service'; import { ViewGroupService } from 'src/engine/metadata-modules/view-group/services/view-group.service'; import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/workspace-cache-storage.module'; +import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module'; @Module({ imports: [ TypeOrmModule.forFeature([ViewGroupEntity]), WorkspaceCacheStorageModule, + FeatureFlagModule, + WorkspaceMigrationV2Module, + WorkspaceManyOrAllFlatEntityMapsCacheModule, ], controllers: [ViewGroupController], - providers: [ViewGroupService, ViewGroupResolver], + providers: [ViewGroupService, ViewGroupV2Service, ViewGroupResolver], exports: [ViewGroupService], }) export class ViewGroupModule {} diff --git a/packages/twenty-server/src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator.ts b/packages/twenty-server/src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator.ts index 7e7c64466ad..4acd19193d9 100644 --- a/packages/twenty-server/src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator.ts +++ b/packages/twenty-server/src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator.ts @@ -1,9 +1,10 @@ import { SetMetadata } from '@nestjs/common'; -import { type ALL_FLAT_ENTITY_MAPS_PROPERTIES } from 'src/engine/metadata-modules/flat-entity/constant/all-flat-entity-maps-properties.constant'; +import { type AllMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-metadata-name.type'; +import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; export const WORKSPACE_FLAT_MAP_CACHE_KEY = 'workspaceFlatMapCacheKey'; export const WorkspaceFlatMapCache = ( - cacheKey: (typeof ALL_FLAT_ENTITY_MAPS_PROPERTIES)[number], + cacheKey: MetadataToFlatEntityMapsKey, ) => SetMetadata(WORKSPACE_FLAT_MAP_CACHE_KEY, cacheKey); diff --git a/packages/twenty-server/src/engine/workspace-flat-map-cache/workspace-flat-map-cache.module.ts b/packages/twenty-server/src/engine/workspace-flat-map-cache/workspace-flat-map-cache.module.ts index a18221e2d9c..6808ad106b8 100644 --- a/packages/twenty-server/src/engine/workspace-flat-map-cache/workspace-flat-map-cache.module.ts +++ b/packages/twenty-server/src/engine/workspace-flat-map-cache/workspace-flat-map-cache.module.ts @@ -8,11 +8,13 @@ import { WorkspaceFlatIndexMapCacheService } from 'src/engine/metadata-modules/f import { WorkspaceFlatObjectMetadataMapCacheService } from 'src/engine/metadata-modules/flat-object-metadata/services/workspace-flat-object-metadata-map-cache.service'; import { WorkspaceFlatViewFieldMapCacheService } from 'src/engine/metadata-modules/flat-view-field/services/workspace-flat-view-field-map-cache.service'; import { WorkspaceFlatViewFilterMapCacheService } from 'src/engine/metadata-modules/flat-view-filter/services/workspace-flat-view-filter-map-cache.service'; +import { WorkspaceFlatViewGroupMapCacheService } from 'src/engine/metadata-modules/flat-view-group/services/workspace-flat-view-group-map-cache.service'; import { WorkspaceFlatViewMapCacheService } from 'src/engine/metadata-modules/flat-view/services/workspace-flat-view-map-cache.service'; import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; +import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { WorkspaceMetadataCacheModule } from 'src/engine/metadata-modules/workspace-metadata-cache/workspace-metadata-cache.module'; import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module'; @@ -32,6 +34,7 @@ import { WorkspaceFlatMapCacheRegistryService } from 'src/engine/workspace-flat- IndexMetadataEntity, FieldMetadataEntity, ObjectMetadataEntity, + ViewGroupEntity, ]), ], providers: [ @@ -42,6 +45,7 @@ import { WorkspaceFlatMapCacheRegistryService } from 'src/engine/workspace-flat- WorkspaceFlatViewFilterMapCacheService, WorkspaceFlatIndexMapCacheService, WorkspaceFlatFieldMetadataMapCacheService, + WorkspaceFlatViewGroupMapCacheService, ], exports: [ WorkspaceFlatMapCacheRegistryService, @@ -51,6 +55,7 @@ import { WorkspaceFlatMapCacheRegistryService } from 'src/engine/workspace-flat- WorkspaceFlatViewFilterMapCacheService, WorkspaceFlatIndexMapCacheService, WorkspaceFlatFieldMetadataMapCacheService, + WorkspaceFlatViewGroupMapCacheService, ], }) export class WorkspaceFlatMapCacheModule {} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant.ts new file mode 100644 index 00000000000..5a18a7447cc --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant.ts @@ -0,0 +1,12 @@ +import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant'; +import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; + +export const EMPTY_ORCHESTRATOR_FAILURE_REPORT = ( + Object.keys(ALL_METADATA_NAME) as (keyof typeof ALL_METADATA_NAME)[] +).reduce( + (orchestratorReport, metadataName) => ({ + ...orchestratorReport, + [metadataName]: [], + }), + {} as OrchestratorFailureReport, +); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts index 0525c8814ff..334496f5433 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts @@ -1,5 +1,6 @@ import { type I18n } from '@lingui/core'; +import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant'; import { type WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { type ValidationErrorResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type'; import { translateOrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/translate-validation-errors.util'; @@ -20,20 +21,10 @@ export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = ( invalidCronTrigger: 0, invalidRouteTrigger: 0, invalidFieldMetadata: 0, + invalidViewGroup: 0, totalErrors: 0, }, - errors: { - fieldMetadata: [], - index: [], - objectMetadata: [], - view: [], - viewField: [], - serverlessFunction: [], - databaseEventTrigger: [], - cronTrigger: [], - routeTrigger: [], - viewFilter: [], - }, + errors: EMPTY_ORCHESTRATOR_FAILURE_REPORT, }; const report = diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts index 60e904f9ccf..5fbe9b14c45 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts @@ -5,8 +5,8 @@ import { isDefined } from 'twenty-shared/utils'; import { EMPTY_ALL_FLAT_ENTITY_MAPS } from 'src/engine/metadata-modules/flat-entity/constant/empty-all-flat-entity-maps.constant'; import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { EMPTY_ORCHESTRATOR_ACTIONS_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-actions-report.constant'; +import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant'; import { - OrchestratorFailureReport, WorkspaceMigrationOrchestratorBuildArgs, WorkspaceMigrationOrchestratorFailedResult, WorkspaceMigrationOrchestratorSuccessfulResult, @@ -21,7 +21,9 @@ import { WorkspaceMigrationV2RouteTriggerActionsBuilderService } from 'src/engin import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service'; import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; import { WorkspaceMigrationV2ViewFilterActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/workspace-migration-v2-view-filter-actions-builder.service'; +import { WorkspaceMigrationV2ViewGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/workspace-migration-v2-view-group-actions-builder.service'; import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; + @Injectable() export class WorkspaceMigrationBuildOrchestratorService { constructor( @@ -30,6 +32,7 @@ export class WorkspaceMigrationBuildOrchestratorService { private readonly workspaceMigrationV2ViewActionsBuilderService: WorkspaceMigrationV2ViewActionsBuilderService, private readonly workspaceMigrationV2ViewFieldActionsBuilderService: WorkspaceMigrationV2ViewFieldActionsBuilderService, private readonly workspaceMigrationV2ViewFilterActionsBuilderService: WorkspaceMigrationV2ViewFilterActionsBuilderService, + private readonly workspaceMigrationV2ViewGroupActionsBuilderService: WorkspaceMigrationV2ViewGroupActionsBuilderService, private readonly workspaceMigrationV2ServerlessFunctionActionsBuilderService: WorkspaceMigrationV2ServerlessFunctionActionsBuilderService, private readonly workspaceMigrationV2DatabaseEventTriggerActionsBuilderService: WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService, private readonly workspaceMigrationV2CronTriggerActionsBuilderService: WorkspaceMigrationV2CronTriggerActionsBuilderService, @@ -80,18 +83,9 @@ export class WorkspaceMigrationBuildOrchestratorService { const orchestratorActionsReport = structuredClone({ ...EMPTY_ORCHESTRATOR_ACTIONS_REPORT, }); - const orchestratorFailureReport: OrchestratorFailureReport = { - objectMetadata: [], - view: [], - viewField: [], - index: [], - serverlessFunction: [], - databaseEventTrigger: [], - cronTrigger: [], - routeTrigger: [], - fieldMetadata: [], - viewFilter: [], - }; + const orchestratorFailureReport = structuredClone( + EMPTY_ORCHESTRATOR_FAILURE_REPORT, + ); const optimisticAllFlatEntityMaps = this.setupOptimisticCache({ fromToAllFlatEntityMaps, @@ -108,6 +102,7 @@ export class WorkspaceMigrationBuildOrchestratorService { flatRouteTriggerMaps, flatFieldMetadataMaps, flatViewFilterMaps, + flatViewGroupMaps, } = fromToAllFlatEntityMaps; if (isDefined(flatObjectMetadataMaps)) { @@ -302,6 +297,36 @@ export class WorkspaceMigrationBuildOrchestratorService { } } + if (isDefined(flatViewGroupMaps)) { + const { from: fromFlatViewGroupMaps, to: toFlatViewGroupMaps } = + flatViewGroupMaps; + const viewGroupResult = + await this.workspaceMigrationV2ViewGroupActionsBuilderService.validateAndBuild( + { + from: fromFlatViewGroupMaps, + to: toFlatViewGroupMaps, + buildOptions, + dependencyOptimisticFlatEntityMaps: { + flatFieldMetadataMaps: + optimisticAllFlatEntityMaps.flatFieldMetadataMaps, + flatViewMaps: optimisticAllFlatEntityMaps.flatViewMaps, + }, + workspaceId, + }, + ); + + optimisticAllFlatEntityMaps.flatViewGroupMaps = + viewGroupResult.optimisticFlatEntityMaps; + optimisticAllFlatEntityMaps.flatViewMaps = + viewGroupResult.dependencyOptimisticFlatEntityMaps.flatViewMaps; + + if (viewGroupResult.status === 'fail') { + orchestratorFailureReport.viewGroup.push(...viewGroupResult.errors); + } else { + orchestratorActionsReport.viewGroup = viewGroupResult.actions; + } + } + if (isDefined(flatServerlessFunctionMaps)) { const { from: fromFlatServerlessFunctionMaps, @@ -471,6 +496,9 @@ export class WorkspaceMigrationBuildOrchestratorService { ...aggregatedOrchestratorActionsReport.viewFilter.deleted, ...aggregatedOrchestratorActionsReport.viewFilter.created, ...aggregatedOrchestratorActionsReport.viewFilter.updated, + ...aggregatedOrchestratorActionsReport.viewGroup.deleted, + ...aggregatedOrchestratorActionsReport.viewGroup.created, + ...aggregatedOrchestratorActionsReport.viewGroup.updated, /// // Serverless functions diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type.ts new file mode 100644 index 00000000000..38fb501a113 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type.ts @@ -0,0 +1,26 @@ +import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; +import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; + +export type CreateViewGroupAction = { + type: 'create_view_group'; + viewGroup: FlatViewGroup; +}; + +export type UpdateViewGroupAction = { + type: 'update_view_group'; + viewGroupId: string; + updates: FlatEntityPropertiesUpdates<'viewGroup'>; +}; + +export type DeleteViewGroupAction = { + type: 'delete_view_group'; + viewGroupId: string; +}; + +export type WorkspaceMigrationViewGroupActionV2 = + | CreateViewGroupAction + | UpdateViewGroupAction + | DeleteViewGroupAction; + +export type WorkspaceMigrationViewGroupActionTypeV2 = + WorkspaceMigrationViewGroupActionV2['type']; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/workspace-migration-v2-view-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/workspace-migration-v2-view-group-actions-builder.service.ts new file mode 100644 index 00000000000..e27d8d282fa --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/workspace-migration-v2-view-group-actions-builder.service.ts @@ -0,0 +1,164 @@ +import { Injectable } from '@nestjs/common'; + +import { isDefined } from 'twenty-shared/utils'; + +import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; +import { UpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type'; +import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type'; +import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type'; +import { FlatEntityValidationReturnType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-result.type'; +import { FlatViewGroupValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-group-validator.service'; + +@Injectable() +export class WorkspaceMigrationV2ViewGroupActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service< + typeof ALL_METADATA_NAME.viewGroup +> { + constructor( + private readonly flatViewGroupValidatorService: FlatViewGroupValidatorService, + ) { + super(ALL_METADATA_NAME.viewGroup); + } + + protected async validateFlatEntityCreation( + args: FlatEntityValidationArgs, + ): Promise< + FlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.viewGroup, + 'created' + > + > { + const validationResult = + this.flatViewGroupValidatorService.validateFlatViewGroupCreation(args); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + const { + flatEntityToValidate: flatViewGroupToValidate, + dependencyOptimisticFlatEntityMaps, + } = args; + + const flatView = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: flatViewGroupToValidate.viewId, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps, + }); + + const updatedFlatViewMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: { + ...flatView, + viewGroupIds: [...flatView.viewGroupIds, flatViewGroupToValidate.id], + }, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps, + }); + + return { + status: 'success', + action: { + type: 'create_view_group', + viewGroup: flatViewGroupToValidate, + }, + dependencyOptimisticFlatEntityMaps: { + ...dependencyOptimisticFlatEntityMaps, + flatViewMaps: updatedFlatViewMaps, + }, + }; + } + + protected async validateFlatEntityDeletion( + args: FlatEntityValidationArgs, + ): Promise< + FlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.viewGroup, + 'deleted' + > + > { + const validationResult = + this.flatViewGroupValidatorService.validateFlatViewGroupDeletion(args); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + const { + flatEntityToValidate: flatViewGroupToValidate, + dependencyOptimisticFlatEntityMaps, + } = args; + + const flatView = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: flatViewGroupToValidate.viewId, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps, + }); + + const updatedFlatViewMaps = isDefined(flatView) + ? replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: { + ...flatView, + viewGroupIds: flatView.viewGroupIds.filter( + (id) => id !== flatViewGroupToValidate.id, + ), + }, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps, + }) + : dependencyOptimisticFlatEntityMaps.flatViewMaps; + + return { + status: 'success', + action: { + type: 'delete_view_group', + viewGroupId: flatViewGroupToValidate.id, + }, + dependencyOptimisticFlatEntityMaps: { + ...dependencyOptimisticFlatEntityMaps, + flatViewMaps: updatedFlatViewMaps, + }, + }; + } + + protected async validateFlatEntityUpdate( + args: FlatEntityUpdateValidationArgs, + ): Promise< + FlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.viewGroup, + 'updated' + > + > { + const validationResult = + this.flatViewGroupValidatorService.validateFlatViewGroupUpdate(args); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + const { + dependencyOptimisticFlatEntityMaps, + flatEntityId, + flatEntityUpdates, + } = args; + + const updateViewGroupAction: UpdateViewGroupAction = { + type: 'update_view_group', + viewGroupId: flatEntityId, + updates: flatEntityUpdates, + }; + + return { + status: 'success', + action: updateViewGroupAction, + dependencyOptimisticFlatEntityMaps, + }; + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-group-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-group-validator.service.ts new file mode 100644 index 00000000000..8835fe1ca6d --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-group-validator.service.ts @@ -0,0 +1,184 @@ +import { Injectable } from '@nestjs/common'; + +import { msg, t } from '@lingui/core/macro'; +import { isDefined } from 'twenty-shared/utils'; + +import { ALL_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-name.constant'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { ViewExceptionCode } from 'src/engine/metadata-modules/view/exceptions/view.exception'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; +import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type'; +import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type'; +import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; + +@Injectable() +export class FlatViewGroupValidatorService { + public validateFlatViewGroupUpdate({ + flatEntityId, + flatEntityUpdates, + optimisticFlatEntityMaps: optimisticFlatViewGroupMaps, + dependencyOptimisticFlatEntityMaps, + }: FlatEntityUpdateValidationArgs< + typeof ALL_METADATA_NAME.viewGroup + >): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { + type: 'update_view_group', + errors: [], + flatEntityMinimalInformation: { + id: flatEntityId, + }, + }; + + const existingFlatViewGroup = + optimisticFlatViewGroupMaps.byId[flatEntityId]; + + if (!isDefined(existingFlatViewGroup)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group to update not found`, + userFriendlyMessage: msg`View group to update not found`, + }); + + return validationResult; + } + + const updatedFlatViewGroup = { + ...existingFlatViewGroup, + ...fromFlatEntityPropertiesUpdatesToPartialFlatEntity({ + updates: flatEntityUpdates, + }), + }; + + validationResult.flatEntityMinimalInformation = { + id: updatedFlatViewGroup.id, + viewId: updatedFlatViewGroup.viewId, + fieldMetadataId: updatedFlatViewGroup.fieldMetadataId, + }; + + const flatView = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: updatedFlatViewGroup.viewId, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatViewMaps, + }); + + if (!isDefined(flatView)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group to update parent view not found`, + userFriendlyMessage: msg`View group to update parent view not found`, + }); + } + + const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: updatedFlatViewGroup.fieldMetadataId, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps, + }); + + if (!isDefined(flatFieldMetadata)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group to update parent field not found`, + userFriendlyMessage: msg`View group to update parent field not found`, + }); + } + + return validationResult; + } + + public validateFlatViewGroupDeletion({ + flatEntityToValidate: { id: viewGroupIdToDelete }, + optimisticFlatEntityMaps: optimisticFlatViewGroupMaps, + }: FlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewGroup + >): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { + type: 'delete_view_group', + errors: [], + flatEntityMinimalInformation: { + id: viewGroupIdToDelete, + }, + }; + + const existingFlatViewGroup = + optimisticFlatViewGroupMaps.byId[viewGroupIdToDelete]; + + if (!isDefined(existingFlatViewGroup)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group to delete not found`, + userFriendlyMessage: msg`View group to delete not found`, + }); + } else { + if (!isDefined(existingFlatViewGroup.deletedAt)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group to delete has not been soft deleted`, + userFriendlyMessage: msg`View group to delete has not been soft deleted`, + }); + } + } + + return validationResult; + } + + public validateFlatViewGroupCreation({ + flatEntityToValidate: flatViewGroupToValidate, + optimisticFlatEntityMaps: optimisticFlatViewGroupMaps, + dependencyOptimisticFlatEntityMaps, + }: FlatEntityValidationArgs< + typeof ALL_METADATA_NAME.viewGroup + >): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { + type: 'create_view_group', + errors: [], + flatEntityMinimalInformation: { + id: flatViewGroupToValidate.id, + viewId: flatViewGroupToValidate.viewId, + fieldMetadataId: flatViewGroupToValidate.fieldMetadataId, + }, + }; + + const existingFlatViewGroup = + optimisticFlatViewGroupMaps.byId[flatViewGroupToValidate.id]; + + if (isDefined(existingFlatViewGroup)) { + const flatViewGroupId = flatViewGroupToValidate.id; + + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View group metadata with id ${flatViewGroupId} already exists`, + userFriendlyMessage: msg`View group metadata already exists`, + }); + } + + const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: flatViewGroupToValidate.fieldMetadataId, + flatEntityMaps: dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps, + }); + + if (!isDefined(flatFieldMetadata)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`Field metadata not found`, + userFriendlyMessage: msg`Field metadata not found`, + }); + } + + const flatView = + dependencyOptimisticFlatEntityMaps.flatViewMaps.byId[ + flatViewGroupToValidate.viewId + ]; + + if (!isDefined(flatView)) { + validationResult.errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View not found`, + userFriendlyMessage: msg`View not found`, + }); + + return validationResult; + } + + return validationResult; + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module.ts index a214fab1b02..04930f1b95b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module.ts @@ -11,6 +11,7 @@ import { FlatRouteTriggerValidatorService } from 'src/engine/workspace-manager/w import { FlatServerlessFunctionValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-serverless-function-validator.service'; import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service'; import { FlatViewFilterValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-filter-validator.service'; +import { FlatViewGroupValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-group-validator.service'; import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service'; @Module({ @@ -19,6 +20,7 @@ import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace FlatViewValidatorService, FlatViewFieldValidatorService, FlatViewFilterValidatorService, + FlatViewGroupValidatorService, FlatIndexValidatorService, FlatFieldMetadataValidatorService, FlatObjectMetadataValidatorService, @@ -32,6 +34,7 @@ import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace FlatViewValidatorService, FlatViewFieldValidatorService, FlatViewFilterValidatorService, + FlatViewGroupValidatorService, FlatIndexValidatorService, FlatFieldMetadataValidatorService, FlatObjectMetadataValidatorService, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts index f4761aa3c29..a0d0f52b348 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts @@ -11,6 +11,7 @@ import { WorkspaceMigrationV2RouteTriggerActionsBuilderService } from 'src/engin import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service'; import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; import { WorkspaceMigrationV2ViewFilterActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/workspace-migration-v2-view-filter-actions-builder.service'; +import { WorkspaceMigrationV2ViewGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/workspace-migration-v2-view-group-actions-builder.service'; import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module'; @@ -22,6 +23,7 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace- WorkspaceMigrationV2ViewActionsBuilderService, WorkspaceMigrationV2ViewFieldActionsBuilderService, WorkspaceMigrationV2ViewFilterActionsBuilderService, + WorkspaceMigrationV2ViewGroupActionsBuilderService, WorkspaceMigrationV2IndexActionsBuilderService, WorkspaceMigrationV2ServerlessFunctionActionsBuilderService, WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService, @@ -35,6 +37,7 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace- WorkspaceMigrationV2ObjectActionsBuilderService, WorkspaceMigrationV2ViewFieldActionsBuilderService, WorkspaceMigrationV2ViewFilterActionsBuilderService, + WorkspaceMigrationV2ViewGroupActionsBuilderService, WorkspaceMigrationV2FieldActionsBuilderService, WorkspaceMigrationV2ServerlessFunctionActionsBuilderService, WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/create-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/create-view-group-action-handler.service.ts new file mode 100644 index 00000000000..24935c67f8e --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/create-view-group-action-handler.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@nestjs/common'; + +import { + OptimisticallyApplyActionOnAllFlatEntityMapsArgs, + WorkspaceMigrationRunnerActionHandler, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface'; + +import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { CreateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class CreateViewGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( + 'create_view_group', +) { + optimisticallyApplyActionOnAllFlatEntityMaps({ + action, + allFlatEntityMaps, + }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Partial { + const { flatViewGroupMaps } = allFlatEntityMaps; + const { viewGroup } = action; + + const updatedFlatViewGroupMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: viewGroup, + flatEntityMaps: flatViewGroupMaps, + }); + + return { + flatViewGroupMaps: updatedFlatViewGroupMaps, + }; + } + + async executeForMetadata( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, queryRunner, workspaceId } = context; + const { viewGroup } = action; + + const viewGroupRepository = + queryRunner.manager.getRepository(ViewGroupEntity); + + await viewGroupRepository.insert({ + ...viewGroup, + workspaceId, + }); + } + + async executeForWorkspaceSchema( + _context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return; + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/delete-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/delete-view-group-action-handler.service.ts new file mode 100644 index 00000000000..62ac20b9cf0 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/delete-view-group-action-handler.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@nestjs/common'; + +import { + OptimisticallyApplyActionOnAllFlatEntityMapsArgs, + WorkspaceMigrationRunnerActionHandler, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface'; + +import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; +import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { DeleteViewGroupAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class DeleteViewGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( + 'delete_view_group', +) { + optimisticallyApplyActionOnAllFlatEntityMaps({ + action, + allFlatEntityMaps, + }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Partial { + const { flatViewGroupMaps } = allFlatEntityMaps; + const { viewGroupId } = action; + + const updatedFlatViewGroupMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ + entityToDeleteId: viewGroupId, + flatEntityMaps: flatViewGroupMaps, + }); + + return { + flatViewGroupMaps: updatedFlatViewGroupMaps, + }; + } + + async executeForMetadata( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, queryRunner, workspaceId } = context; + const { viewGroupId } = action; + + const viewGroupRepository = + queryRunner.manager.getRepository(ViewGroupEntity); + + await viewGroupRepository.delete({ + id: viewGroupId, + workspaceId, + }); + } + + async executeForWorkspaceSchema( + _context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return; + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/update-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/update-view-group-action-handler.service.ts new file mode 100644 index 00000000000..ee7963d01dc --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/update-view-group-action-handler.service.ts @@ -0,0 +1,66 @@ +import { Injectable } from '@nestjs/common'; + +import { + OptimisticallyApplyActionOnAllFlatEntityMapsArgs, + WorkspaceMigrationRunnerActionHandler, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface'; + +import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; +import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { UpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; +import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; + +@Injectable() +export class UpdateViewGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( + 'update_view_group', +) { + optimisticallyApplyActionOnAllFlatEntityMaps({ + action, + allFlatEntityMaps, + }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Partial { + const { flatViewGroupMaps } = allFlatEntityMaps; + const { viewGroupId } = action; + + const existingViewGroup = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: viewGroupId, + flatEntityMaps: flatViewGroupMaps, + }); + + const updatedViewGroup = { + ...existingViewGroup, + ...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + }; + + const updatedFlatViewGroupMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: updatedViewGroup, + flatEntityMaps: flatViewGroupMaps, + }); + + return { + flatViewGroupMaps: updatedFlatViewGroupMaps, + }; + } + + async executeForMetadata( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, queryRunner } = context; + const { viewGroupId } = action; + + const viewGroupRepository = + queryRunner.manager.getRepository(ViewGroupEntity); + + const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + + await viewGroupRepository.update(viewGroupId, update); + } + + async executeForWorkspaceSchema( + _context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return; + } +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts index 0f8f6699eb3..673436333d6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts @@ -27,6 +27,9 @@ import { UpdateViewFieldActionHandlerService } from 'src/engine/workspace-manage import { CreateViewFilterActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-filter/services/create-view-filter-action-handler.service'; import { DeleteViewFilterActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-filter/services/delete-view-filter-action-handler.service'; import { UpdateViewFilterActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-filter/services/update-view-filter-action-handler.service'; +import { CreateViewGroupActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/create-view-group-action-handler.service'; +import { DeleteViewGroupActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/delete-view-group-action-handler.service'; +import { UpdateViewGroupActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-group/services/update-view-group-action-handler.service'; import { CreateViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view/services/create-view-action-handler.service'; import { DeleteViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view/services/delete-view-action-handler.service'; import { UpdateViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view/services/update-view-action-handler.service'; @@ -57,6 +60,10 @@ import { UpdateViewActionHandlerService } from 'src/engine/workspace-manager/wor UpdateViewFilterActionHandlerService, DeleteViewFilterActionHandlerService, + CreateViewGroupActionHandlerService, + UpdateViewGroupActionHandlerService, + DeleteViewGroupActionHandlerService, + CreateServerlessFunctionActionHandlerService, DeleteServerlessFunctionActionHandlerService, UpdateServerlessFunctionActionHandlerService, diff --git a/packages/twenty-server/test/integration/constants/view-gql-fields.constants.ts b/packages/twenty-server/test/integration/constants/view-gql-fields.constants.ts index 15e03b1fe26..81e98b07a4c 100644 --- a/packages/twenty-server/test/integration/constants/view-gql-fields.constants.ts +++ b/packages/twenty-server/test/integration/constants/view-gql-fields.constants.ts @@ -57,6 +57,7 @@ export const VIEW_GROUP_GQL_FIELDS = ` viewId createdAt updatedAt + deletedAt `; export const VIEW_FILTER_GROUP_GQL_FIELDS = ` diff --git a/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/view-group-resolver.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/view-group-resolver.integration-spec.ts.snap new file mode 100644 index 00000000000..056f7503f43 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/view-group-resolver.integration-spec.ts.snap @@ -0,0 +1,34 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`View Group Resolver deleteCoreViewGroup should throw an error when deleting non-existent view group 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View group to delete not found", + "name": "NotFoundError", +} +`; + +exports[`View Group Resolver destroyCoreViewGroup should throw an error when destroying non-existent view group 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View group to destroy not found", + "name": "NotFoundError", +} +`; + +exports[`View Group Resolver updateCoreViewGroup should throw an error when updating non-existent view group 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View group to update not found", + "name": "NotFoundError", +} +`; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap index 9b9128a3ad5..e09312f8b50 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap @@ -32,6 +32,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 Should fail to crea }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -45,6 +46,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 Should fail to crea "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -86,6 +88,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -99,6 +102,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -140,6 +144,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -153,6 +158,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap index bae0827e700..8c7d1d3b5bb 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap @@ -32,6 +32,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -45,6 +46,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -86,6 +88,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -99,6 +102,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -138,6 +142,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -151,6 +156,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -192,6 +198,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -205,6 +212,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -246,6 +254,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -259,6 +268,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-group-resolver.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/view-group-resolver.integration-spec.ts index 38c21179e1a..6efeee7520e 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-group-resolver.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-group-resolver.integration-spec.ts @@ -1,35 +1,21 @@ import { TEST_NOT_EXISTING_VIEW_GROUP_ID } from 'test/integration/constants/test-view-ids.constants'; -import { createViewGroupOperationFactory } from 'test/integration/graphql/utils/create-view-group-operation-factory.util'; -import { deleteViewGroupOperationFactory } from 'test/integration/graphql/utils/delete-view-group-operation-factory.util'; -import { destroyViewGroupOperationFactory } from 'test/integration/graphql/utils/destroy-view-group-operation-factory.util'; -import { findViewGroupsOperationFactory } from 'test/integration/graphql/utils/find-view-groups-operation-factory.util'; -import { - assertGraphQLErrorResponse, - assertGraphQLSuccessfulResponse, -} from 'test/integration/graphql/utils/graphql-test-assertions.util'; -import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; -import { updateViewGroupOperationFactory } from 'test/integration/graphql/utils/update-view-group-operation-factory.util'; -import { - createViewGroupData, - updateViewGroupData, -} from 'test/integration/graphql/utils/view-data-factory.util'; +import { expectOneNotInternalServerErrorSnapshot } from 'test/integration/graphql/utils/expect-one-not-internal-server-error-snapshot.util'; import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util'; import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; +import { createOneCoreViewGroup } from 'test/integration/metadata/suites/view-group/utils/create-one-core-view-group.util'; +import { deleteOneCoreViewGroup } from 'test/integration/metadata/suites/view-group/utils/delete-one-core-view-group.util'; +import { destroyOneCoreViewGroup } from 'test/integration/metadata/suites/view-group/utils/destroy-one-core-view-group.util'; +import { findCoreViewGroups } from 'test/integration/metadata/suites/view-group/utils/find-core-view-groups.util'; +import { updateOneCoreViewGroup } from 'test/integration/metadata/suites/view-group/utils/update-one-core-view-group.util'; import { assertViewGroupStructure, cleanupViewRecords, } from 'test/integration/utils/view-test.util'; import { FieldMetadataType } from 'twenty-shared/types'; -import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; -import { - generateViewGroupExceptionMessage, - ViewGroupExceptionMessageKey, -} from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; - describe('View Group Resolver', () => { let testViewId: string; let testObjectMetadataId: string; @@ -101,34 +87,33 @@ describe('View Group Resolver', () => { describe('getCoreViewGroups', () => { it('should return empty array when no view groups exist', async () => { - const operation = findViewGroupsOperationFactory({ viewId: testViewId }); - const response = await makeGraphqlAPIRequest(operation); + const { data } = await findCoreViewGroups({ + viewId: testViewId, + expectToFail: false, + }); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.getCoreViewGroups).toEqual([]); + expect(data.getCoreViewGroups).toEqual([]); }); it('should return view groups for a specific view', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: true, - fieldValue: 'active', - position: 0, - fieldMetadataId: testFieldMetadataId, - }); - const createOperation = createViewGroupOperationFactory({ - data: groupData, + await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: true, + fieldValue: 'active', + position: 0, + }, }); - await makeGraphqlAPIRequest(createOperation); - - const getOperation = findViewGroupsOperationFactory({ + const { data } = await findCoreViewGroups({ viewId: testViewId, + expectToFail: false, }); - const response = await makeGraphqlAPIRequest(getOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.getCoreViewGroups).toHaveLength(1); - assertViewGroupStructure(response.body.data.getCoreViewGroups[0], { + expect(data.getCoreViewGroups).toHaveLength(1); + assertViewGroupStructure(data.getCoreViewGroups[0], { fieldMetadataId: testFieldMetadataId, isVisible: true, fieldValue: 'active', @@ -140,20 +125,18 @@ describe('View Group Resolver', () => { describe('createCoreViewGroup', () => { it('should create a new view group', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: false, - fieldValue: 'inactive', - position: 1, - fieldMetadataId: testFieldMetadataId, + const { data } = await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: false, + fieldValue: 'inactive', + position: 1, + }, }); - const operation = createViewGroupOperationFactory({ - data: groupData, - }); - const response = await makeGraphqlAPIRequest(operation); - - assertGraphQLSuccessfulResponse(response); - assertViewGroupStructure(response.body.data.createCoreViewGroup, { + assertViewGroupStructure(data.createCoreViewGroup, { fieldMetadataId: testFieldMetadataId, isVisible: false, fieldValue: 'inactive', @@ -163,20 +146,18 @@ describe('View Group Resolver', () => { }); it('should create a view group with null fieldValue', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: true, - fieldValue: '', - position: 2, - fieldMetadataId: testFieldMetadataId, + const { data } = await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: true, + fieldValue: '', + position: 2, + }, }); - const operation = createViewGroupOperationFactory({ - data: groupData, - }); - const response = await makeGraphqlAPIRequest(operation); - - assertGraphQLSuccessfulResponse(response); - assertViewGroupStructure(response.body.data.createCoreViewGroup, { + assertViewGroupStructure(data.createCoreViewGroup, { fieldMetadataId: testFieldMetadataId, isVisible: true, fieldValue: '', @@ -187,32 +168,31 @@ describe('View Group Resolver', () => { describe('updateCoreViewGroup', () => { it('should update an existing view group', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: true, - fieldValue: 'original', - position: 0, - fieldMetadataId: testFieldMetadataId, + const { data: createData } = await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: true, + fieldValue: 'original', + position: 0, + }, }); - const createOperation = createViewGroupOperationFactory({ - data: groupData, - }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewGroup = createResponse.body.data.createCoreViewGroup; + const viewGroup = createData.createCoreViewGroup; - const updateInput = updateViewGroupData({ - isVisible: false, - fieldValue: 'updated', - position: 5, - fieldMetadataId: testFieldMetadataId, + const { data } = await updateOneCoreViewGroup({ + expectToFail: false, + input: { + id: viewGroup.id, + update: { + isVisible: false, + fieldValue: 'updated', + position: 5, + }, + }, }); - const updateOperation = updateViewGroupOperationFactory({ - viewGroupId: viewGroup.id, - data: updateInput, - }); - const response = await makeGraphqlAPIRequest(updateOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.updateCoreViewGroup).toMatchObject({ + expect(data.updateCoreViewGroup).toMatchObject({ id: viewGroup.id, isVisible: false, fieldValue: 'updated', @@ -221,99 +201,101 @@ describe('View Group Resolver', () => { }); it('should throw an error when updating non-existent view group', async () => { - const operation = updateViewGroupOperationFactory({ - viewGroupId: TEST_NOT_EXISTING_VIEW_GROUP_ID, + const { errors } = await updateOneCoreViewGroup({ + expectToFail: true, + input: { + id: TEST_NOT_EXISTING_VIEW_GROUP_ID, + update: { + isVisible: false, + }, + }, }); - const response = await makeGraphqlAPIRequest(operation); - assertGraphQLErrorResponse( - response, - ErrorCode.NOT_FOUND, - generateViewGroupExceptionMessage( - ViewGroupExceptionMessageKey.VIEW_GROUP_NOT_FOUND, - TEST_NOT_EXISTING_VIEW_GROUP_ID, - ), - ); + expectOneNotInternalServerErrorSnapshot({ errors }); }); }); describe('deleteCoreViewGroup', () => { it('should delete an existing view group', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: true, - fieldValue: 'to delete', - position: 0, - fieldMetadataId: testFieldMetadataId, + const { data: createData } = await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: true, + fieldValue: 'to delete', + position: 0, + }, }); - const createOperation = createViewGroupOperationFactory({ - data: groupData, - }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewGroup = createResponse.body.data.createCoreViewGroup; + const viewGroup = createData.createCoreViewGroup; - const deleteOperation = deleteViewGroupOperationFactory({ - viewGroupId: viewGroup.id, + const { data } = await deleteOneCoreViewGroup({ + expectToFail: false, + input: { + id: viewGroup.id, + }, }); - const response = await makeGraphqlAPIRequest(deleteOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.deleteCoreViewGroup).toBe(true); + expect(data.deleteCoreViewGroup).toMatchObject({ + id: viewGroup.id, + }); + expect(data.deleteCoreViewGroup.deletedAt).toBeDefined(); }); it('should throw an error when deleting non-existent view group', async () => { - const operation = deleteViewGroupOperationFactory({ - viewGroupId: TEST_NOT_EXISTING_VIEW_GROUP_ID, + const { errors } = await deleteOneCoreViewGroup({ + expectToFail: true, + input: { + id: TEST_NOT_EXISTING_VIEW_GROUP_ID, + }, }); - const response = await makeGraphqlAPIRequest(operation); - assertGraphQLErrorResponse( - response, - ErrorCode.NOT_FOUND, - generateViewGroupExceptionMessage( - ViewGroupExceptionMessageKey.VIEW_GROUP_NOT_FOUND, - TEST_NOT_EXISTING_VIEW_GROUP_ID, - ), - ); + expectOneNotInternalServerErrorSnapshot({ errors }); }); }); describe('destroyCoreViewGroup', () => { it('should destroy an existing view group', async () => { - const groupData = createViewGroupData(testViewId, { - isVisible: true, - fieldValue: 'to destroy', - position: 0, - fieldMetadataId: testFieldMetadataId, + const { data: createData } = await createOneCoreViewGroup({ + expectToFail: false, + input: { + viewId: testViewId, + fieldMetadataId: testFieldMetadataId, + isVisible: true, + fieldValue: 'to destroy', + position: 0, + }, }); - const createOperation = createViewGroupOperationFactory({ - data: groupData, - }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewGroup = createResponse.body.data.createCoreViewGroup; + const viewGroup = createData.createCoreViewGroup; - const destroyOperation = destroyViewGroupOperationFactory({ - viewGroupId: viewGroup.id, + await deleteOneCoreViewGroup({ + input: { + id: viewGroup.id, + }, + expectToFail: false, }); - const response = await makeGraphqlAPIRequest(destroyOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.destroyCoreViewGroup).toBe(true); + const { data } = await destroyOneCoreViewGroup({ + expectToFail: false, + input: { + id: viewGroup.id, + }, + }); + + expect(data.destroyCoreViewGroup).toMatchObject({ + id: viewGroup.id, + }); }); it('should throw an error when destroying non-existent view group', async () => { - const operation = destroyViewGroupOperationFactory({ - viewGroupId: TEST_NOT_EXISTING_VIEW_GROUP_ID, + const { errors } = await destroyOneCoreViewGroup({ + expectToFail: true, + input: { + id: TEST_NOT_EXISTING_VIEW_GROUP_ID, + }, }); - const response = await makeGraphqlAPIRequest(operation); - assertGraphQLErrorResponse( - response, - ErrorCode.NOT_FOUND, - generateViewGroupExceptionMessage( - ViewGroupExceptionMessageKey.VIEW_GROUP_NOT_FOUND, - TEST_NOT_EXISTING_VIEW_GROUP_ID, - ), - ); + expectOneNotInternalServerErrorSnapshot({ errors }); }); }); }); diff --git a/packages/twenty-server/test/integration/graphql/utils/create-view-group-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/create-view-group-operation-factory.util.ts deleted file mode 100644 index e2eed615376..00000000000 --- a/packages/twenty-server/test/integration/graphql/utils/create-view-group-operation-factory.util.ts +++ /dev/null @@ -1,25 +0,0 @@ -import gql from 'graphql-tag'; -import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; - -import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; - -type CreateViewGroupOperationFactoryParams = { - gqlFields?: string; - data?: Partial; -}; - -export const createViewGroupOperationFactory = ({ - gqlFields = VIEW_GROUP_GQL_FIELDS, - data = {}, -}: CreateViewGroupOperationFactoryParams = {}) => ({ - query: gql` - mutation CreateCoreViewGroup($input: CreateViewGroupInput!) { - createCoreViewGroup(input: $input) { - ${gqlFields} - } - } - `, - variables: { - input: data, - }, -}); diff --git a/packages/twenty-server/test/integration/graphql/utils/delete-view-group-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/delete-view-group-operation-factory.util.ts deleted file mode 100644 index b09f0b9cfd9..00000000000 --- a/packages/twenty-server/test/integration/graphql/utils/delete-view-group-operation-factory.util.ts +++ /dev/null @@ -1,16 +0,0 @@ -import gql from 'graphql-tag'; - -export const deleteViewGroupOperationFactory = ({ - viewGroupId, -}: { - viewGroupId: string; -}) => ({ - query: gql` - mutation DeleteCoreViewGroup($id: String!) { - deleteCoreViewGroup(id: $id) - } - `, - variables: { - id: viewGroupId, - }, -}); diff --git a/packages/twenty-server/test/integration/graphql/utils/destroy-view-group-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/destroy-view-group-operation-factory.util.ts deleted file mode 100644 index e0b2eb9c513..00000000000 --- a/packages/twenty-server/test/integration/graphql/utils/destroy-view-group-operation-factory.util.ts +++ /dev/null @@ -1,16 +0,0 @@ -import gql from 'graphql-tag'; - -export const destroyViewGroupOperationFactory = ({ - viewGroupId, -}: { - viewGroupId: string; -}) => ({ - query: gql` - mutation DestroyCoreViewGroup($id: String!) { - destroyCoreViewGroup(id: $id) - } - `, - variables: { - id: viewGroupId, - }, -}); diff --git a/packages/twenty-server/test/integration/graphql/utils/update-view-group-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/update-view-group-operation-factory.util.ts deleted file mode 100644 index ba03c94c1e1..00000000000 --- a/packages/twenty-server/test/integration/graphql/utils/update-view-group-operation-factory.util.ts +++ /dev/null @@ -1,24 +0,0 @@ -import gql from 'graphql-tag'; -import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; - -export const updateViewGroupOperationFactory = ({ - gqlFields = VIEW_GROUP_GQL_FIELDS, - viewGroupId, - data = {}, -}: { - gqlFields?: string; - viewGroupId: string; - data?: object; -}) => ({ - query: gql` - mutation UpdateCoreViewGroup($id: String!, $input: UpdateViewGroupInput!) { - updateCoreViewGroup(id: $id, input: $input) { - ${gqlFields} - } - } - `, - variables: { - id: viewGroupId, - input: data, - }, -}); diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap index 02f8d57d3ef..60e9a81311c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap @@ -33,6 +33,7 @@ exports[`createOne FieldMetadataService name/label sync should return an error w "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -46,6 +47,7 @@ exports[`createOne FieldMetadataService name/label sync should return an error w "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap index 2ee263edd31..ca4d100c04f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap @@ -33,6 +33,7 @@ exports[`updateOne failing update should not update a field name if it is not sy "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -46,6 +47,7 @@ exports[`updateOne failing update should not update a field name if it is not sy "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -95,6 +97,7 @@ exports[`updateOne failing update should throw if the field name is not availabl "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -108,6 +111,7 @@ exports[`updateOne failing update should throw if the field name is not availabl "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap index 2d74fc2b225..dd6269f94a9 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap @@ -34,6 +34,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -47,6 +48,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -91,6 +93,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -104,6 +107,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -147,6 +151,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -160,6 +165,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -218,6 +224,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -231,6 +238,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -289,6 +297,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -302,6 +311,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -360,6 +370,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -373,6 +384,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -431,6 +443,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -444,6 +457,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -487,6 +501,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -500,6 +515,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -544,6 +560,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -557,6 +574,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -605,6 +623,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -618,6 +637,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -661,6 +681,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -674,6 +695,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -718,6 +740,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -731,6 +754,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -774,6 +798,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -787,6 +812,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -845,6 +871,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -858,6 +885,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -901,6 +929,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -914,6 +943,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -957,6 +987,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -970,6 +1001,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1014,6 +1046,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1027,6 +1060,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1071,6 +1105,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1084,6 +1119,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1127,6 +1163,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1140,6 +1177,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1184,6 +1222,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1197,6 +1236,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1240,6 +1280,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1253,6 +1294,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1301,6 +1343,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1314,6 +1357,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1357,6 +1401,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1370,6 +1415,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1414,6 +1460,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1427,6 +1474,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1470,6 +1518,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1483,6 +1532,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1531,6 +1581,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1544,6 +1595,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1587,6 +1639,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1600,6 +1653,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1644,6 +1698,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1657,6 +1712,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1700,6 +1756,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1713,6 +1770,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1761,6 +1819,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1774,6 +1833,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1817,6 +1877,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1830,6 +1891,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1873,6 +1935,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1886,6 +1949,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1934,6 +1998,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1947,6 +2012,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1990,6 +2056,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2003,6 +2070,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2046,6 +2114,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2059,6 +2128,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2103,6 +2173,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2116,6 +2187,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2159,6 +2231,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2172,6 +2245,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2220,6 +2294,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2233,6 +2308,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2276,6 +2352,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2289,6 +2366,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2332,6 +2410,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2345,6 +2424,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2403,6 +2483,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2416,6 +2497,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2474,6 +2556,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2487,6 +2570,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2545,6 +2629,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2558,6 +2643,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2616,6 +2702,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2629,6 +2716,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2673,6 +2761,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2686,6 +2775,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2734,6 +2824,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2747,6 +2838,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2790,6 +2882,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2803,6 +2896,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2847,6 +2941,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2860,6 +2955,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2903,6 +2999,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2916,6 +3013,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2959,6 +3057,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2972,6 +3071,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3015,6 +3115,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3028,6 +3129,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3072,6 +3174,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3085,6 +3188,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3128,6 +3232,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3141,6 +3246,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3185,6 +3291,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3198,6 +3305,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3241,6 +3349,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3254,6 +3363,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3302,6 +3412,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3315,6 +3426,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3358,6 +3470,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3371,6 +3484,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3415,6 +3529,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3428,6 +3543,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3471,6 +3587,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3484,6 +3601,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3532,6 +3650,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3545,6 +3664,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3588,6 +3708,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3601,6 +3722,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3645,6 +3767,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3658,6 +3781,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3701,6 +3825,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3714,6 +3839,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3762,6 +3888,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3775,6 +3902,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3818,6 +3946,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3831,6 +3960,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3874,6 +4004,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3887,6 +4018,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3935,6 +4067,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3948,6 +4081,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3991,6 +4125,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4004,6 +4139,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -4047,6 +4183,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4060,6 +4197,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -4104,6 +4242,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4117,6 +4256,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap index e73bb229dd1..f51467921a5 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap @@ -34,6 +34,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -47,6 +48,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -91,6 +93,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -104,6 +107,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -147,6 +151,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -160,6 +165,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -218,6 +224,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -231,6 +238,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -289,6 +297,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -302,6 +311,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -360,6 +370,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -373,6 +384,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -431,6 +443,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -444,6 +457,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -487,6 +501,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -500,6 +515,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -544,6 +560,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -557,6 +574,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -605,6 +623,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -618,6 +637,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -661,6 +681,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -674,6 +695,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -718,6 +740,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -731,6 +754,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -774,6 +798,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -787,6 +812,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -845,6 +871,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -858,6 +885,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -901,6 +929,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -914,6 +943,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -957,6 +987,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -970,6 +1001,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1014,6 +1046,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1027,6 +1060,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1071,6 +1105,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1084,6 +1119,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1127,6 +1163,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1140,6 +1177,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1184,6 +1222,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1197,6 +1236,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1240,6 +1280,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1253,6 +1294,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1301,6 +1343,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1314,6 +1357,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1357,6 +1401,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1370,6 +1415,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1413,6 +1459,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1426,6 +1473,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1474,6 +1522,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1487,6 +1536,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1530,6 +1580,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1543,6 +1594,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1587,6 +1639,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1600,6 +1653,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1643,6 +1697,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1656,6 +1711,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1704,6 +1760,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1717,6 +1774,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1760,6 +1818,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1773,6 +1832,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1816,6 +1876,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1829,6 +1890,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1877,6 +1939,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1890,6 +1953,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1933,6 +1997,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1946,6 +2011,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1989,6 +2055,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2002,6 +2069,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2045,6 +2113,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2058,6 +2127,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2101,6 +2171,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2114,6 +2185,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2162,6 +2234,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2175,6 +2248,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2218,6 +2292,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2231,6 +2306,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2274,6 +2350,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2287,6 +2364,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2345,6 +2423,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2358,6 +2437,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2416,6 +2496,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2429,6 +2510,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2487,6 +2569,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2500,6 +2583,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2558,6 +2642,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2571,6 +2656,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2615,6 +2701,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2628,6 +2715,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2676,6 +2764,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2689,6 +2778,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2732,6 +2822,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2745,6 +2836,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2789,6 +2881,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2802,6 +2895,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2845,6 +2939,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2858,6 +2953,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2901,6 +2997,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2914,6 +3011,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2957,6 +3055,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2970,6 +3069,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3014,6 +3114,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3027,6 +3128,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3070,6 +3172,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3083,6 +3186,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3127,6 +3231,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3140,6 +3245,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3183,6 +3289,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3196,6 +3303,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3244,6 +3352,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3257,6 +3366,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3300,6 +3410,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3313,6 +3424,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3356,6 +3468,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3369,6 +3482,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3417,6 +3531,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3430,6 +3545,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3473,6 +3589,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3486,6 +3603,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3530,6 +3648,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3543,6 +3662,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3586,6 +3706,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3599,6 +3720,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3647,6 +3769,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3660,6 +3783,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3703,6 +3827,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3716,6 +3841,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3759,6 +3885,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3772,6 +3899,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3820,6 +3948,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3833,6 +3962,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3876,6 +4006,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3889,6 +4020,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3932,6 +4064,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3945,6 +4078,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3988,6 +4122,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4001,6 +4136,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap index d579b718c61..fb79527be4f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap @@ -81,6 +81,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -94,6 +95,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -136,6 +138,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -149,6 +152,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -185,6 +189,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -198,6 +203,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -234,6 +240,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -247,6 +254,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -311,6 +319,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -324,6 +333,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -382,6 +392,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -395,6 +406,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -453,6 +465,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -466,6 +479,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -530,6 +544,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -543,6 +558,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -587,6 +603,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -600,6 +617,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -644,6 +662,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -657,6 +676,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -700,6 +720,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -713,6 +734,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -749,6 +771,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -762,6 +785,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -798,6 +822,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -811,6 +836,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -847,6 +873,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -860,6 +887,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -899,6 +927,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -912,6 +941,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -949,6 +979,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -962,6 +993,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -998,6 +1030,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1011,6 +1044,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap index 0e0b3a2fcc7..38c8c0dff1f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap @@ -34,6 +34,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -47,6 +48,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -91,6 +93,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -104,6 +107,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -154,6 +158,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -167,6 +172,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -211,6 +217,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -224,6 +231,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -274,6 +282,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -287,6 +296,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -331,6 +341,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -344,6 +355,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -388,6 +400,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -401,6 +414,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -444,6 +458,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -457,6 +472,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -533,6 +549,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -546,6 +563,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -590,6 +608,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -603,6 +622,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -663,6 +683,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -676,6 +697,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -736,6 +758,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -749,6 +772,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -815,6 +839,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -828,6 +853,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -888,6 +914,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -901,6 +928,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -967,6 +995,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -980,6 +1009,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1024,6 +1054,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1037,6 +1068,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1081,6 +1113,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1094,6 +1127,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1137,6 +1171,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1150,6 +1185,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1226,6 +1262,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1239,6 +1276,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1283,6 +1321,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1296,6 +1335,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap index 0a4a420e70f..dcbcc7b29b8 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap @@ -49,6 +49,7 @@ exports[`Field metadata relation update should fail relation when name is change "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -62,6 +63,7 @@ exports[`Field metadata relation update should fail relation when name is change "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -145,6 +147,7 @@ exports[`Field metadata relation update should fail relation when name is not in "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -158,6 +161,7 @@ exports[`Field metadata relation update should fail relation when name is not in "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap index ed4b661d8b8..60751bfffd3 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap @@ -589,6 +589,7 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -602,6 +603,7 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1200,6 +1202,7 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1213,6 +1216,7 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -1811,6 +1815,7 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] = }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -1824,6 +1829,7 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] = "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -2422,6 +2428,7 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -2435,6 +2442,7 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3033,6 +3041,7 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3046,6 +3055,7 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -3644,6 +3654,7 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`] }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -3657,6 +3668,7 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`] "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -4256,6 +4268,7 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4269,6 +4282,7 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -4868,6 +4882,7 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -4881,6 +4896,7 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -5509,6 +5525,7 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -5522,6 +5539,7 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -6120,6 +6138,7 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -6133,6 +6152,7 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -6731,6 +6751,7 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -6744,6 +6765,7 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -7347,6 +7369,7 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -7360,6 +7383,7 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -7963,6 +7987,7 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -7976,6 +8001,7 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -8639,6 +8665,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -8652,6 +8679,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -9315,6 +9343,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -9328,6 +9357,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -9956,6 +9986,7 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -9969,6 +10000,7 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -10597,6 +10629,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -10610,6 +10643,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -11273,6 +11307,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -11286,6 +11321,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -11949,6 +11985,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -11962,6 +11999,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -12561,6 +12599,7 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -12574,6 +12613,7 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -13173,6 +13213,7 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -13186,6 +13227,7 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap index 797c3e14605..178f1f8eeee 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap @@ -50,6 +50,7 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -63,6 +64,7 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -128,6 +130,7 @@ exports[`Object metadata update should fail when labelIdentifier is not a known }, ], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -141,6 +144,7 @@ exports[`Object metadata update should fail when labelIdentifier is not a known "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", @@ -200,6 +204,7 @@ exports[`Object metadata update should fail when labelIdentifier is null 1`] = ` "view": [], "viewField": [], "viewFilter": [], + "viewGroup": [], }, "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { @@ -213,6 +218,7 @@ exports[`Object metadata update should fail when labelIdentifier is null 1`] = ` "invalidView": 0, "invalidViewField": 0, "invalidViewFilter": 0, + "invalidViewGroup": 0, "totalErrors": 0, }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-core-view-group-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-core-view-group-query-factory.util.ts new file mode 100644 index 00000000000..9ec9a170635 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-core-view-group-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; + +import { type CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; + +export const createCoreViewGroupQueryFactory = ({ + gqlFields = VIEW_GROUP_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation CreateCoreViewGroup($input: CreateViewGroupInput!) { + createCoreViewGroup(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-one-core-view-group.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-one-core-view-group.util.ts new file mode 100644 index 00000000000..cd3cbbc029e --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/create-one-core-view-group.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { createCoreViewGroupQueryFactory } from 'test/integration/metadata/suites/view-group/utils/create-core-view-group-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type CreateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/create-view-group.input'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const createOneCoreViewGroup = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + createCoreViewGroup: ViewGroupEntity; +}> => { + const graphqlOperation = createCoreViewGroupQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Group creation should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Group creation has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-core-view-group-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-core-view-group-query-factory.util.ts new file mode 100644 index 00000000000..111e6cc1b2e --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-core-view-group-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; + +import { type DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; + +export const deleteCoreViewGroupQueryFactory = ({ + gqlFields = VIEW_GROUP_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation DeleteCoreViewGroup($input: DeleteViewGroupInput!) { + deleteCoreViewGroup(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-one-core-view-group.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-one-core-view-group.util.ts new file mode 100644 index 00000000000..f334bfe6e1a --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/delete-one-core-view-group.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { deleteCoreViewGroupQueryFactory } from 'test/integration/metadata/suites/view-group/utils/delete-core-view-group-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const deleteOneCoreViewGroup = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + deleteCoreViewGroup: ViewGroupEntity; +}> => { + const graphqlOperation = deleteCoreViewGroupQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Group deletion should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Group deletion has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-core-view-group-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-core-view-group-query-factory.util.ts new file mode 100644 index 00000000000..89478a567a2 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-core-view-group-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; + +import { type DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; + +export const destroyCoreViewGroupQueryFactory = ({ + gqlFields = VIEW_GROUP_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation DestroyCoreViewGroup($input: DestroyViewGroupInput!) { + destroyCoreViewGroup(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-one-core-view-group.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-one-core-view-group.util.ts new file mode 100644 index 00000000000..57e00bc2651 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/destroy-one-core-view-group.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { destroyCoreViewGroupQueryFactory } from 'test/integration/metadata/suites/view-group/utils/destroy-core-view-group-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const destroyOneCoreViewGroup = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + destroyCoreViewGroup: ViewGroupEntity; +}> => { + const graphqlOperation = destroyCoreViewGroupQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Group destruction should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Group destruction has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/graphql/utils/find-view-groups-operation-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups-query-factory.util.ts similarity index 89% rename from packages/twenty-server/test/integration/graphql/utils/find-view-groups-operation-factory.util.ts rename to packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups-query-factory.util.ts index dbd86f4c6fa..a06d2871bb7 100644 --- a/packages/twenty-server/test/integration/graphql/utils/find-view-groups-operation-factory.util.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups-query-factory.util.ts @@ -1,7 +1,7 @@ import gql from 'graphql-tag'; import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; -export const findViewGroupsOperationFactory = ({ +export const findCoreViewGroupsQueryFactory = ({ gqlFields = VIEW_GROUP_GQL_FIELDS, viewId, }: { diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups.util.ts new file mode 100644 index 00000000000..b9014a1aac6 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/find-core-view-groups.util.ts @@ -0,0 +1,42 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { findCoreViewGroupsQueryFactory } from 'test/integration/metadata/suites/view-group/utils/find-core-view-groups-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const findCoreViewGroups = async ({ + viewId, + gqlFields, + expectToFail, +}: { + viewId: string; + gqlFields?: string; + expectToFail?: boolean; +}): CommonResponseBody<{ + getCoreViewGroups: ViewGroupEntity[]; +}> => { + const graphqlOperation = findCoreViewGroupsQueryFactory({ + viewId, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Group search should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Group search has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-core-view-group-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-core-view-group-query-factory.util.ts new file mode 100644 index 00000000000..f6dc1c30c99 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-core-view-group-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { VIEW_GROUP_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; + +import { type UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input'; + +export const updateCoreViewGroupQueryFactory = ({ + gqlFields = VIEW_GROUP_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation UpdateCoreViewGroup($input: UpdateViewGroupInput!) { + updateCoreViewGroup(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-one-core-view-group.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-one-core-view-group.util.ts new file mode 100644 index 00000000000..fe9e2735790 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-group/utils/update-one-core-view-group.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { updateCoreViewGroupQueryFactory } from 'test/integration/metadata/suites/view-group/utils/update-core-view-group-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input'; +import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; + +export const updateOneCoreViewGroup = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + updateCoreViewGroup: ViewGroupEntity; +}> => { + const graphqlOperation = updateCoreViewGroupQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Group update should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Group update has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/rest/suites/view-group.integration-spec.ts b/packages/twenty-server/test/integration/rest/suites/view-group.integration-spec.ts index b04f4e24b74..131b6bc73f3 100644 --- a/packages/twenty-server/test/integration/rest/suites/view-group.integration-spec.ts +++ b/packages/twenty-server/test/integration/rest/suites/view-group.integration-spec.ts @@ -65,6 +65,7 @@ describe('View Group REST API', () => { createOneField: { id: fieldMetadataId }, }, } = await createOneFieldMetadata({ + expectToFail: false, input: createFieldInput, gqlFields: ` id @@ -88,6 +89,7 @@ describe('View Group REST API', () => { }, }); await deleteOneObjectMetadata({ + expectToFail: false, input: { idToDelete: testObjectMetadataId }, }); });