import { CanActivate, ExecutionContext, Injectable, mixin, Type, } from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; import { isDefined } from 'twenty-shared/utils'; import { SettingPermissionType } from 'src/engine/metadata-modules/permissions/constants/setting-permission-type.constants'; import { PermissionsException, PermissionsExceptionCode, PermissionsExceptionMessage, } from 'src/engine/metadata-modules/permissions/permissions.exception'; import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service'; export const SettingsPermissionsGuard = ( requiredPermission: SettingPermissionType, ): Type => { @Injectable() class SettingsPermissionsMixin implements CanActivate { constructor(private readonly permissionsService: PermissionsService) {} async canActivate(context: ExecutionContext): Promise { const ctx = GqlExecutionContext.create(context); const workspaceId = ctx.getContext().req.workspace.id; const userWorkspaceId = ctx.getContext().req.userWorkspaceId; const hasPermission = await this.permissionsService.userHasWorkspaceSettingPermission({ userWorkspaceId, _setting: requiredPermission, workspaceId, isExecutedByApiKey: isDefined(ctx.getContext().req.apiKey), }); if (hasPermission === true) { return true; } throw new PermissionsException( PermissionsExceptionMessage.PERMISSION_DENIED, PermissionsExceptionCode.PERMISSION_DENIED, ); } } return mixin(SettingsPermissionsMixin); };