Refactor rls backend simplify add tests (#17357)
## Context Removing full CRUD to RLS since we are actually using an upsert only over the role resolver, this removes a lot of unused code (could be re-added later but unlikely). Simplified the folder arch at the same time Add simple integration tests to RLS
This commit is contained in:
+1
-241
@@ -7,215 +7,26 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { Repository } from 'typeorm';
|
||||
|
||||
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
|
||||
import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/billing-entitlement-key.enum';
|
||||
import { BillingService } from 'src/engine/core-modules/billing/services/billing.service';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
|
||||
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 { fromCreateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupToCreate } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-create-row-level-permission-predicate-group-input-to-flat-row-level-permission-predicate-group-to-create.util';
|
||||
import { fromDeleteRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-delete-row-level-permission-predicate-group-input-to-flat-row-level-permission-predicate-group-or-throw.util';
|
||||
import { fromDestroyRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-destroy-row-level-permission-predicate-group-input-to-flat-row-level-permission-predicate-group-or-throw.util';
|
||||
import { fromFlatRowLevelPermissionPredicateGroupToDto } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-flat-row-level-permission-predicate-group-to-dto.util';
|
||||
import { fromUpdateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupToUpdateOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-update-row-level-permission-predicate-group-input-to-flat-row-level-permission-predicate-group-to-update-or-throw.util';
|
||||
import { type CreateRowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/create-row-level-permission-predicate-group.input';
|
||||
import { type DeleteRowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/delete-row-level-permission-predicate-group.input';
|
||||
import { type DestroyRowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/destroy-row-level-permission-predicate-group.input';
|
||||
import { type UpdateRowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/update-row-level-permission-predicate-group.input';
|
||||
import { fromFlatRowLevelPermissionPredicateGroupToDto } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-flat-row-level-permission-predicate-group-to-dto.util';
|
||||
import { RowLevelPermissionPredicateGroupDTO } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/row-level-permission-predicate-group.dto';
|
||||
import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity';
|
||||
import {
|
||||
RowLevelPermissionPredicateGroupException,
|
||||
RowLevelPermissionPredicateGroupExceptionCode,
|
||||
} from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate-group.exception';
|
||||
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
|
||||
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
|
||||
import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception';
|
||||
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service';
|
||||
|
||||
@Injectable()
|
||||
export class RowLevelPermissionPredicateGroupService {
|
||||
constructor(
|
||||
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
|
||||
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
|
||||
private readonly workspaceCacheService: WorkspaceCacheService,
|
||||
private readonly billingService: BillingService,
|
||||
@InjectRepository(RowLevelPermissionPredicateGroupEntity)
|
||||
private readonly rowLevelPermissionPredicateGroupRepository: Repository<RowLevelPermissionPredicateGroupEntity>,
|
||||
private readonly configService: ConfigService,
|
||||
private readonly applicationService: ApplicationService,
|
||||
) {}
|
||||
|
||||
async createOne({
|
||||
createRowLevelPermissionPredicateGroupInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
createRowLevelPermissionPredicateGroupInput: CreateRowLevelPermissionPredicateGroupInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateGroupDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
const { workspaceCustomFlatApplication } =
|
||||
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
|
||||
{
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
const flatGroupToCreate =
|
||||
fromCreateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupToCreate(
|
||||
{
|
||||
createRowLevelPermissionPredicateGroupInput,
|
||||
workspaceId,
|
||||
workspaceCustomApplicationId: workspaceCustomFlatApplication.id,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToCreate: [flatGroupToCreate],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateGroupToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatGroupToCreate.id,
|
||||
flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async updateOne({
|
||||
updateRowLevelPermissionPredicateGroupInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
updateRowLevelPermissionPredicateGroupInput: UpdateRowLevelPermissionPredicateGroupInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateGroupDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatGroupToUpdate =
|
||||
fromUpdateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupToUpdateOrThrow(
|
||||
{
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
updateRowLevelPermissionPredicateGroupInput,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToUpdate: [flatGroupToUpdate],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps: recomputedFlatMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateGroupToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatGroupToUpdate.id,
|
||||
flatEntityMaps: recomputedFlatMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async deleteOne({
|
||||
deleteRowLevelPermissionPredicateGroupInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
deleteRowLevelPermissionPredicateGroupInput: DeleteRowLevelPermissionPredicateGroupInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateGroupDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatGroupWithDeletedAt =
|
||||
fromDeleteRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupOrThrow(
|
||||
{
|
||||
deleteRowLevelPermissionPredicateGroupInput,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToUpdate: [flatGroupWithDeletedAt],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps: recomputedFlatMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateGroupToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatGroupWithDeletedAt.id,
|
||||
flatEntityMaps: recomputedFlatMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async destroyOne({
|
||||
destroyRowLevelPermissionPredicateGroupInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
destroyRowLevelPermissionPredicateGroupInput: DestroyRowLevelPermissionPredicateGroupInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateGroupDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateGroupMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateGroupMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatGroupToDelete =
|
||||
fromDestroyRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroupOrThrow(
|
||||
{
|
||||
destroyRowLevelPermissionPredicateGroupInput,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToDelete: [flatGroupToDelete],
|
||||
});
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateGroupToDto(flatGroupToDelete);
|
||||
}
|
||||
|
||||
async findByWorkspaceId(
|
||||
workspaceId: string,
|
||||
): Promise<RowLevelPermissionPredicateGroupDTO[]> {
|
||||
@@ -318,45 +129,6 @@ export class RowLevelPermissionPredicateGroupService {
|
||||
]);
|
||||
}
|
||||
|
||||
private async runMigration({
|
||||
workspaceId,
|
||||
flatEntityToCreate = [],
|
||||
flatEntityToUpdate = [],
|
||||
flatEntityToDelete = [],
|
||||
}: {
|
||||
workspaceId: string;
|
||||
flatEntityToCreate?: FlatRowLevelPermissionPredicateGroup[];
|
||||
flatEntityToUpdate?: FlatRowLevelPermissionPredicateGroup[];
|
||||
flatEntityToDelete?: FlatRowLevelPermissionPredicateGroup[];
|
||||
}): Promise<void> {
|
||||
const validateAndBuildResult =
|
||||
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
|
||||
{
|
||||
allFlatEntityOperationByMetadataName: {
|
||||
rowLevelPermissionPredicateGroup: {
|
||||
flatEntityToCreate,
|
||||
flatEntityToDelete,
|
||||
flatEntityToUpdate,
|
||||
},
|
||||
},
|
||||
workspaceId,
|
||||
isSystemBuild: false,
|
||||
},
|
||||
);
|
||||
|
||||
if (isDefined(validateAndBuildResult)) {
|
||||
throw new WorkspaceMigrationBuilderException(
|
||||
validateAndBuildResult,
|
||||
'Validation errors occurred while applying row level permission predicate group mutation',
|
||||
);
|
||||
}
|
||||
|
||||
await this.workspaceCacheService.invalidateAndRecompute(workspaceId, [
|
||||
'rolesPermissions',
|
||||
'flatRowLevelPermissionPredicateMaps',
|
||||
]);
|
||||
}
|
||||
|
||||
private async hasRowLevelPermissionFeature(
|
||||
workspaceId: string,
|
||||
): Promise<boolean> {
|
||||
@@ -372,16 +144,4 @@ export class RowLevelPermissionPredicateGroupService {
|
||||
|
||||
return hasValidEnterpriseKey && isRowLevelPermissionEnabled;
|
||||
}
|
||||
|
||||
private async hasRowLevelPermissionFeatureOrThrow(workspaceId: string) {
|
||||
const hasRowLevelPermissionFeature =
|
||||
await this.hasRowLevelPermissionFeature(workspaceId);
|
||||
|
||||
if (!hasRowLevelPermissionFeature) {
|
||||
throw new RowLevelPermissionPredicateGroupException(
|
||||
'Row level permission predicate feature is disabled',
|
||||
RowLevelPermissionPredicateGroupExceptionCode.ROW_LEVEL_PERMISSION_FEATURE_DISABLED,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-223
@@ -11,18 +11,9 @@ import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/bil
|
||||
import { BillingService } from 'src/engine/core-modules/billing/services/billing.service';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/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 { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { fromFlatRowLevelPermissionPredicateGroupToDto } from 'src/engine/metadata-modules/flat-row-level-permission-predicate-group/utils/from-flat-row-level-permission-predicate-group-to-dto.util';
|
||||
import { fromCreateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToCreate } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-create-row-level-permission-predicate-input-to-flat-row-level-permission-predicate-to-create.util';
|
||||
import { fromDeleteRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-delete-row-level-permission-predicate-input-to-flat-row-level-permission-predicate-or-throw.util';
|
||||
import { fromDestroyRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-destroy-row-level-permission-predicate-input-to-flat-row-level-permission-predicate-or-throw.util';
|
||||
import { fromFlatRowLevelPermissionPredicateGroupToDto } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-flat-row-level-permission-predicate-group-to-dto.util';
|
||||
import { fromFlatRowLevelPermissionPredicateToDto } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-flat-row-level-permission-predicate-to-dto.util';
|
||||
import { fromUpdateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToUpdateOrThrow } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-update-row-level-permission-predicate-input-to-flat-row-level-permission-predicate-to-update-or-throw.util';
|
||||
import { type CreateRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/create-row-level-permission-predicate.input';
|
||||
import { type DeleteRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/delete-row-level-permission-predicate.input';
|
||||
import { type DestroyRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/destroy-row-level-permission-predicate.input';
|
||||
import { type UpdateRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/update-row-level-permission-predicate.input';
|
||||
import {
|
||||
type RowLevelPermissionPredicateGroupInput,
|
||||
type RowLevelPermissionPredicateInput,
|
||||
@@ -51,176 +42,6 @@ export class RowLevelPermissionPredicateService {
|
||||
private readonly applicationService: ApplicationService,
|
||||
) {}
|
||||
|
||||
async createOne({
|
||||
createRowLevelPermissionPredicateInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
createRowLevelPermissionPredicateInput: CreateRowLevelPermissionPredicateInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { workspaceCustomFlatApplication } =
|
||||
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
|
||||
{
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
const flatPredicateToCreate =
|
||||
fromCreateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToCreate(
|
||||
{
|
||||
createRowLevelPermissionPredicateInput,
|
||||
workspaceId,
|
||||
workspaceCustomApplicationId: workspaceCustomFlatApplication.id,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToCreate: [flatPredicateToCreate],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatPredicateToCreate.id,
|
||||
flatEntityMaps: flatRowLevelPermissionPredicateMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async updateOne({
|
||||
updateRowLevelPermissionPredicateInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
updateRowLevelPermissionPredicateInput: UpdateRowLevelPermissionPredicateInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatPredicateToUpdate =
|
||||
fromUpdateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToUpdateOrThrow(
|
||||
{
|
||||
flatRowLevelPermissionPredicateMaps,
|
||||
updateRowLevelPermissionPredicateInput,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToUpdate: [flatPredicateToUpdate],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps: recomputedFlatMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatPredicateToUpdate.id,
|
||||
flatEntityMaps: recomputedFlatMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async deleteOne({
|
||||
deleteRowLevelPermissionPredicateInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
deleteRowLevelPermissionPredicateInput: DeleteRowLevelPermissionPredicateInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatPredicateWithDeletedAt =
|
||||
fromDeleteRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow(
|
||||
{
|
||||
deleteRowLevelPermissionPredicateInput,
|
||||
flatRowLevelPermissionPredicateMaps,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToUpdate: [flatPredicateWithDeletedAt],
|
||||
});
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps: recomputedFlatMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateToDto(
|
||||
findFlatEntityByIdInFlatEntityMapsOrThrow({
|
||||
flatEntityId: flatPredicateWithDeletedAt.id,
|
||||
flatEntityMaps: recomputedFlatMaps,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async destroyOne({
|
||||
destroyRowLevelPermissionPredicateInput,
|
||||
workspaceId,
|
||||
}: {
|
||||
destroyRowLevelPermissionPredicateInput: DestroyRowLevelPermissionPredicateInput;
|
||||
workspaceId: string;
|
||||
}): Promise<RowLevelPermissionPredicateDTO> {
|
||||
await this.hasRowLevelPermissionFeatureOrThrow(workspaceId);
|
||||
|
||||
const { flatRowLevelPermissionPredicateMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatRowLevelPermissionPredicateMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
const flatPredicateToDelete =
|
||||
fromDestroyRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow(
|
||||
{
|
||||
destroyRowLevelPermissionPredicateInput,
|
||||
flatRowLevelPermissionPredicateMaps,
|
||||
},
|
||||
);
|
||||
|
||||
await this.runMigration({
|
||||
workspaceId,
|
||||
flatEntityToDelete: [flatPredicateToDelete],
|
||||
});
|
||||
|
||||
return fromFlatRowLevelPermissionPredicateToDto(flatPredicateToDelete);
|
||||
}
|
||||
|
||||
async findByWorkspaceId(
|
||||
workspaceId: string,
|
||||
): Promise<RowLevelPermissionPredicateDTO[]> {
|
||||
@@ -378,7 +199,6 @@ export class RowLevelPermissionPredicateService {
|
||||
existingGroups,
|
||||
inputGroups: predicateGroups,
|
||||
roleId,
|
||||
objectMetadataId,
|
||||
workspaceId,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
workspaceCustomApplicationId: workspaceCustomFlatApplication.id,
|
||||
@@ -449,7 +269,6 @@ export class RowLevelPermissionPredicateService {
|
||||
existingGroups,
|
||||
inputGroups,
|
||||
roleId,
|
||||
objectMetadataId,
|
||||
workspaceId,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
workspaceCustomApplicationId,
|
||||
@@ -457,7 +276,6 @@ export class RowLevelPermissionPredicateService {
|
||||
existingGroups: FlatRowLevelPermissionPredicateGroup[];
|
||||
inputGroups: RowLevelPermissionPredicateGroupInput[];
|
||||
roleId: string;
|
||||
objectMetadataId: string;
|
||||
workspaceId: string;
|
||||
flatRowLevelPermissionPredicateGroupMaps: FlatEntityMaps<FlatRowLevelPermissionPredicateGroup>;
|
||||
workspaceCustomApplicationId: string;
|
||||
@@ -495,7 +313,7 @@ export class RowLevelPermissionPredicateService {
|
||||
id: groupId,
|
||||
workspaceId,
|
||||
roleId,
|
||||
objectMetadataId,
|
||||
objectMetadataId: inputGroup.objectMetadataId,
|
||||
logicalOperator: inputGroup.logicalOperator,
|
||||
parentRowLevelPermissionPredicateGroupId:
|
||||
inputGroup.parentRowLevelPermissionPredicateGroupId ?? null,
|
||||
@@ -676,45 +494,6 @@ export class RowLevelPermissionPredicateService {
|
||||
]);
|
||||
}
|
||||
|
||||
private async runMigration({
|
||||
workspaceId,
|
||||
flatEntityToCreate = [],
|
||||
flatEntityToUpdate = [],
|
||||
flatEntityToDelete = [],
|
||||
}: {
|
||||
workspaceId: string;
|
||||
flatEntityToCreate?: FlatRowLevelPermissionPredicate[];
|
||||
flatEntityToUpdate?: FlatRowLevelPermissionPredicate[];
|
||||
flatEntityToDelete?: FlatRowLevelPermissionPredicate[];
|
||||
}): Promise<void> {
|
||||
const validateAndBuildResult =
|
||||
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
|
||||
{
|
||||
allFlatEntityOperationByMetadataName: {
|
||||
rowLevelPermissionPredicate: {
|
||||
flatEntityToCreate,
|
||||
flatEntityToDelete,
|
||||
flatEntityToUpdate,
|
||||
},
|
||||
},
|
||||
workspaceId,
|
||||
isSystemBuild: false,
|
||||
},
|
||||
);
|
||||
|
||||
if (isDefined(validateAndBuildResult)) {
|
||||
throw new WorkspaceMigrationBuilderException(
|
||||
validateAndBuildResult,
|
||||
'Validation errors occurred while applying row level permission predicate mutation',
|
||||
);
|
||||
}
|
||||
|
||||
await this.workspaceCacheService.invalidateAndRecompute(workspaceId, [
|
||||
'rolesPermissions',
|
||||
'flatRowLevelPermissionPredicateGroupMaps',
|
||||
]);
|
||||
}
|
||||
|
||||
private async hasRowLevelPermissionFeature(
|
||||
workspaceId: string,
|
||||
): Promise<boolean> {
|
||||
|
||||
Reference in New Issue
Block a user