Improve workspace auth context surface (#18164)

This commit is contained in:
Weiko
2026-03-05 16:13:59 +01:00
committed by GitHub
parent 5853891b02
commit cfeea43eaf
118 changed files with 453 additions and 677 deletions
@@ -1,21 +1,13 @@
import { UseFilters, UseGuards, UsePipes } from '@nestjs/common';
import { Args, Query } from '@nestjs/graphql';
import {
AuthContext,
type AuthContextUser,
} from 'src/engine/core-modules/auth/types/auth-context.type';
import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthWorkspaceMemberId } from 'src/engine/decorators/auth/auth-workspace-member-id.decorator';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { BarChartDataInput } from 'src/modules/dashboard/chart-data/dtos/inputs/bar-chart-data.input';
import { BarChartDataDTO } from 'src/modules/dashboard/chart-data/dtos/bar-chart-data.dto';
import { BarChartDataInput } from 'src/modules/dashboard/chart-data/dtos/inputs/bar-chart-data.input';
import { ChartDataGraphqlApiExceptionFilter } from 'src/modules/dashboard/chart-data/filters/chart-data-graphql-api-exception.filter';
import { BarChartDataService } from 'src/modules/dashboard/chart-data/services/bar-chart-data.service';
@@ -30,22 +22,13 @@ export class BarChartDataResolver {
@UseGuards(NoPermissionGuard)
async barChartData(
@Args('input') input: BarChartDataInput,
@AuthWorkspace() workspace: WorkspaceEntity,
@AuthUser() user: AuthContextUser,
@AuthWorkspaceMemberId() workspaceMemberId: string,
@AuthUserWorkspaceId() userWorkspaceId: string,
): Promise<BarChartDataDTO> {
const authContext: AuthContext = {
user,
workspace,
workspaceMemberId,
userWorkspaceId,
};
const authContext = getWorkspaceAuthContext();
return this.barChartDataService.getBarChartData({
objectMetadataId: input.objectMetadataId,
configuration: input.configuration,
workspaceId: workspace.id,
workspaceId: authContext.workspace.id,
authContext,
});
}
@@ -1,17 +1,9 @@
import { UseFilters, UseGuards, UsePipes } from '@nestjs/common';
import { Args, Query } from '@nestjs/graphql';
import {
AuthContext,
type AuthContextUser,
} from 'src/engine/core-modules/auth/types/auth-context.type';
import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthWorkspaceMemberId } from 'src/engine/decorators/auth/auth-workspace-member-id.decorator';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { LineChartDataInput } from 'src/modules/dashboard/chart-data/dtos/inputs/line-chart-data.input';
@@ -30,22 +22,13 @@ export class LineChartDataResolver {
@UseGuards(NoPermissionGuard)
async lineChartData(
@Args('input') input: LineChartDataInput,
@AuthWorkspace() workspace: WorkspaceEntity,
@AuthUser() user: AuthContextUser,
@AuthWorkspaceMemberId() workspaceMemberId: string,
@AuthUserWorkspaceId() userWorkspaceId: string,
): Promise<LineChartDataDTO> {
const authContext: AuthContext = {
user,
workspace,
workspaceMemberId,
userWorkspaceId,
};
const authContext = getWorkspaceAuthContext();
return this.lineChartDataService.getLineChartData({
objectMetadataId: input.objectMetadataId,
configuration: input.configuration,
workspaceId: workspace.id,
workspaceId: authContext.workspace.id,
authContext,
});
}
@@ -1,17 +1,9 @@
import { UseFilters, UseGuards, UsePipes } from '@nestjs/common';
import { Args, Query } from '@nestjs/graphql';
import {
AuthContext,
type AuthContextUser,
} from 'src/engine/core-modules/auth/types/auth-context.type';
import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthWorkspaceMemberId } from 'src/engine/decorators/auth/auth-workspace-member-id.decorator';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { PieChartDataInput } from 'src/modules/dashboard/chart-data/dtos/inputs/pie-chart-data.input';
@@ -30,22 +22,13 @@ export class PieChartDataResolver {
@UseGuards(NoPermissionGuard)
async pieChartData(
@Args('input') input: PieChartDataInput,
@AuthWorkspace() workspace: WorkspaceEntity,
@AuthUser() user: AuthContextUser,
@AuthWorkspaceMemberId() workspaceMemberId: string,
@AuthUserWorkspaceId() userWorkspaceId: string,
): Promise<PieChartDataDTO> {
const authContext: AuthContext = {
user,
workspace,
workspaceMemberId,
userWorkspaceId,
};
const authContext = getWorkspaceAuthContext();
return this.pieChartDataService.getPieChartData({
objectMetadataId: input.objectMetadataId,
configuration: input.configuration,
workspaceId: workspace.id,
workspaceId: authContext.workspace.id,
authContext,
});
}
@@ -2,7 +2,7 @@ import { Test, type TestingModule } from '@nestjs/testing';
import { AggregateOperations, FieldMetadataType } from 'twenty-shared/types';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { BarChartGroupMode } from 'src/engine/metadata-modules/page-layout-widget/enums/bar-chart-group-mode.enum';
import { BarChartLayout } from 'src/engine/metadata-modules/page-layout-widget/enums/bar-chart-layout.enum';
@@ -17,9 +17,10 @@ describe('BarChartDataService', () => {
let mockGetOrRecomputeManyOrAllFlatEntityMaps: jest.Mock;
const workspaceId = 'test-workspace-id';
const mockAuthContext: AuthContext = {
workspace: { id: workspaceId } as any,
};
const mockAuthContext = {
type: 'system',
workspace: { id: workspaceId },
} as unknown as WorkspaceAuthContext;
const objectMetadataId = 'test-object-id';
const mockGroupByField = {
@@ -2,7 +2,7 @@ import { Test, type TestingModule } from '@nestjs/testing';
import { AggregateOperations, FieldMetadataType } from 'twenty-shared/types';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type';
import { LINE_CHART_MAXIMUM_NUMBER_OF_DATA_POINTS } from 'src/modules/dashboard/chart-data/constants/line-chart-maximum-number-of-data-points.constant';
@@ -14,9 +14,10 @@ describe('LineChartDataService', () => {
let mockExecuteGroupByQuery: jest.Mock;
const workspaceId = 'test-workspace-id';
const mockAuthContext: AuthContext = {
workspace: { id: workspaceId } as any,
};
const mockAuthContext = {
type: 'system',
workspace: { id: workspaceId },
} as unknown as WorkspaceAuthContext;
const objectMetadataId = 'test-object-id';
const mockGroupByFieldX = {
@@ -2,7 +2,7 @@ import { Test, type TestingModule } from '@nestjs/testing';
import { AggregateOperations, FieldMetadataType } from 'twenty-shared/types';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { WidgetConfigurationType } from 'src/engine/metadata-modules/page-layout-widget/enums/widget-configuration-type.type';
import { PIE_CHART_MAXIMUM_NUMBER_OF_SLICES } from 'src/modules/dashboard/chart-data/constants/pie-chart-maximum-number-of-slices.constant';
@@ -15,9 +15,10 @@ describe('PieChartDataService', () => {
let mockGetOrRecomputeManyOrAllFlatEntityMaps: jest.Mock;
const workspaceId = 'test-workspace-id';
const mockAuthContext: AuthContext = {
const mockAuthContext = {
type: 'system',
workspace: { id: workspaceId } as any,
};
} as unknown as WorkspaceAuthContext;
const objectMetadataId = 'test-object-id';
const mockGroupByField = {
@@ -8,7 +8,7 @@ import {
isDefined,
} from 'twenty-shared/utils';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
@@ -44,7 +44,7 @@ type GetBarChartDataParams = {
workspaceId: string;
objectMetadataId: string;
configuration: BarChartConfigurationDTO;
authContext: AuthContext;
authContext: WorkspaceAuthContext;
};
@Injectable()
@@ -16,7 +16,7 @@ import {
import { ObjectRecordGroupBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
import { CommonGroupByQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-group-by-query-runner.service';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -45,7 +45,7 @@ type ExecuteGroupByQueryParams = {
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
objectIdByNameSingular: Record<string, string>;
authContext: AuthContext;
authContext: WorkspaceAuthContext;
groupByFieldMetadataId: string;
groupBySubFieldName?: string | null;
aggregateFieldMetadataId: string;
@@ -7,7 +7,7 @@ import {
isDefined,
} from 'twenty-shared/utils';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
@@ -43,7 +43,7 @@ type GetLineChartDataParams = {
workspaceId: string;
objectMetadataId: string;
configuration: LineChartConfigurationDTO;
authContext: AuthContext;
authContext: WorkspaceAuthContext;
};
@Injectable()
@@ -7,7 +7,7 @@ import {
isDefined,
} from 'twenty-shared/utils';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
@@ -31,7 +31,7 @@ type GetPieChartDataParams = {
workspaceId: string;
objectMetadataId: string;
configuration: PieChartConfigurationDTO;
authContext: AuthContext;
authContext: WorkspaceAuthContext;
};
@Injectable()
@@ -1,14 +1,6 @@
import { Controller, Param, Post, UseFilters, UseGuards } from '@nestjs/common';
import {
AuthContext,
type AuthContextUser,
} from 'src/engine/core-modules/auth/types/auth-context.type';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthWorkspaceMemberId } from 'src/engine/decorators/auth/auth-workspace-member-id.decorator';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
import { JwtAuthGuard } from 'src/engine/guards/jwt-auth.guard';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
@@ -25,19 +17,8 @@ export class DashboardController {
) {}
@Post(':id/duplicate')
async duplicate(
@Param('id') id: string,
@AuthWorkspace() workspace: WorkspaceEntity,
@AuthUser() user: AuthContextUser,
@AuthWorkspaceMemberId() workspaceMemberId: string,
@AuthUserWorkspaceId() userWorkspaceId: string,
): Promise<DuplicatedDashboardDTO> {
const authContext: AuthContext = {
user,
workspace,
workspaceMemberId,
userWorkspaceId,
};
async duplicate(@Param('id') id: string): Promise<DuplicatedDashboardDTO> {
const authContext = getWorkspaceAuthContext();
return this.dashboardDuplicationService.duplicateDashboard(id, authContext);
}
@@ -6,7 +6,7 @@ import { type WorkspacePreQueryHookInstance } from 'src/engine/api/graphql/works
import { type CreateManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { DashboardToPageLayoutSyncService } from 'src/modules/dashboard/services/dashboard-to-page-layout-sync.service';
import { type DashboardWorkspaceEntity } from 'src/modules/dashboard/standard-objects/dashboard.workspace-entity';
@@ -21,7 +21,7 @@ export class DashboardCreateManyPreQueryHook
) {}
async execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
_objectName: string,
payload: CreateManyResolverArgs<DashboardWorkspaceEntity>,
): Promise<CreateManyResolverArgs<DashboardWorkspaceEntity>> {
@@ -6,7 +6,7 @@ import { type WorkspacePreQueryHookInstance } from 'src/engine/api/graphql/works
import { type CreateOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { DashboardToPageLayoutSyncService } from 'src/modules/dashboard/services/dashboard-to-page-layout-sync.service';
import { type DashboardWorkspaceEntity } from 'src/modules/dashboard/standard-objects/dashboard.workspace-entity';
@@ -21,7 +21,7 @@ export class DashboardCreateOnePreQueryHook
) {}
async execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
_objectName: string,
payload: CreateOneResolverArgs<DashboardWorkspaceEntity>,
): Promise<CreateOneResolverArgs<DashboardWorkspaceEntity>> {
@@ -6,7 +6,7 @@ import { type WorkspacePreQueryHookInstance } from 'src/engine/api/graphql/works
import { type DestroyManyResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { DashboardToPageLayoutSyncService } from 'src/modules/dashboard/services/dashboard-to-page-layout-sync.service';
@@ -20,7 +20,7 @@ export class DashboardDestroyManyPreQueryHook
) {}
async execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
_objectName: string,
payload: DestroyManyResolverArgs<{ id: { in: string[] } }>,
): Promise<DestroyManyResolverArgs<{ id: { in: string[] } }>> {
@@ -6,7 +6,7 @@ import { type WorkspacePreQueryHookInstance } from 'src/engine/api/graphql/works
import { type DestroyOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { DashboardToPageLayoutSyncService } from 'src/modules/dashboard/services/dashboard-to-page-layout-sync.service';
@@ -20,7 +20,7 @@ export class DashboardDestroyOnePreQueryHook
) {}
async execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
_objectName: string,
payload: DestroyOneResolverArgs,
): Promise<DestroyOneResolverArgs> {
@@ -1,18 +1,10 @@
import { UseFilters, UseGuards, UsePipes } from '@nestjs/common';
import { Args, Mutation } from '@nestjs/graphql';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator';
import {
AuthContext,
type AuthContextUser,
} from 'src/engine/core-modules/auth/types/auth-context.type';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthWorkspaceMemberId } from 'src/engine/decorators/auth/auth-workspace-member-id.decorator';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { PageLayoutGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception.filter';
@@ -36,17 +28,8 @@ export class DashboardResolver {
@UseGuards(NoPermissionGuard)
async duplicateDashboard(
@Args('id', { type: () => UUIDScalarType }) id: string,
@AuthWorkspace() workspace: WorkspaceEntity,
@AuthUser() user: AuthContextUser,
@AuthWorkspaceMemberId() workspaceMemberId: string,
@AuthUserWorkspaceId() userWorkspaceId: string,
): Promise<DuplicatedDashboardDTO> {
const authContext: AuthContext = {
user,
workspace,
workspaceMemberId,
userWorkspaceId,
};
const authContext = getWorkspaceAuthContext();
return this.dashboardDuplicationService.duplicateDashboard(id, authContext);
}
@@ -1,15 +1,9 @@
import { Injectable, Logger } from '@nestjs/common';
import {
appendCopySuffix,
assertIsDefinedOrThrow,
isDefined,
} from 'twenty-shared/utils';
import { appendCopySuffix, isDefined } from 'twenty-shared/utils';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { ActorFromAuthContextService } from 'src/engine/core-modules/actor/services/actor-from-auth-context.service';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { PageLayoutDuplicationService } from 'src/engine/metadata-modules/page-layout/services/page-layout-duplication.service';
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
@@ -34,12 +28,9 @@ export class DashboardDuplicationService {
async duplicateDashboard(
dashboardId: string,
authContext: AuthContext,
authContext: WorkspaceAuthContext,
): Promise<DuplicatedDashboardDTO> {
const { workspace } = authContext;
assertIsDefinedOrThrow(workspace, WorkspaceNotFoundDefaultError);
const workspace = authContext.workspace;
const workspaceId = workspace.id;
return this.globalWorkspaceOrmManager.executeInWorkspaceContext(
@@ -106,7 +97,7 @@ export class DashboardDuplicationService {
throw error;
}
},
authContext as WorkspaceAuthContext,
authContext,
);
}
@@ -114,7 +105,7 @@ export class DashboardDuplicationService {
originalDashboard: DashboardWorkspaceEntity,
newPageLayoutId: string,
dashboardRepository: WorkspaceRepository<DashboardWorkspaceEntity>,
authContext: AuthContext,
authContext: WorkspaceAuthContext,
): Promise<DashboardWorkspaceEntity> {
const newTitle = appendCopySuffix(originalDashboard.title ?? '');