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:
Weiko
2026-01-22 16:44:18 +01:00
committed by GitHub
parent 669da1a87d
commit 296a3099db
35 changed files with 1085 additions and 1453 deletions
@@ -0,0 +1,9 @@
/* @license Enterprise */
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
export const FLAT_ROW_LEVEL_PERMISSION_PREDICATE_GROUP_EDITABLE_PROPERTIES = [
'logicalOperator',
'positionInRowLevelPermissionPredicateGroup',
'parentRowLevelPermissionPredicateGroupId',
] as const satisfies (keyof FlatRowLevelPermissionPredicateGroup)[];
@@ -1,74 +0,0 @@
/* @license Enterprise */
import { trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties } from 'twenty-shared/utils';
import { v4 } from 'uuid';
import { type CreateRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/create-row-level-permission-predicate.input';
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
export const fromCreateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToCreate =
({
createRowLevelPermissionPredicateInput:
rawCreateRowLevelPermissionPredicateInput,
workspaceId,
workspaceCustomApplicationId,
}: {
createRowLevelPermissionPredicateInput: CreateRowLevelPermissionPredicateInput;
workspaceId: string;
workspaceCustomApplicationId: string;
}): FlatRowLevelPermissionPredicate => {
const sanitizedInput = (
trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties as unknown as (
input: CreateRowLevelPermissionPredicateInput,
keys: string[],
) => CreateRowLevelPermissionPredicateInput
)(rawCreateRowLevelPermissionPredicateInput, [
'fieldMetadataId',
'objectMetadataId',
'roleId',
'rowLevelPermissionPredicateGroupId',
'workspaceMemberFieldMetadataId',
'subFieldName',
'workspaceMemberSubFieldName',
'operand',
]);
const {
fieldMetadataId,
objectMetadataId,
roleId,
value,
...createRowLevelPermissionPredicateInput
} = sanitizedInput;
const createdAt = new Date().toISOString();
const predicateId = v4();
return {
id: predicateId,
fieldMetadataId,
objectMetadataId,
roleId,
workspaceId,
createdAt,
updatedAt: createdAt,
deletedAt: null,
universalIdentifier: predicateId,
operand: createRowLevelPermissionPredicateInput.operand,
value: value,
rowLevelPermissionPredicateGroupId:
createRowLevelPermissionPredicateInput.rowLevelPermissionPredicateGroupId ??
null,
positionInRowLevelPermissionPredicateGroup:
createRowLevelPermissionPredicateInput.positionInRowLevelPermissionPredicateGroup ??
null,
subFieldName: createRowLevelPermissionPredicateInput.subFieldName ?? null,
workspaceMemberFieldMetadataId:
createRowLevelPermissionPredicateInput.workspaceMemberFieldMetadataId ??
null,
workspaceMemberSubFieldName:
createRowLevelPermissionPredicateInput.workspaceMemberSubFieldName ??
null,
applicationId: workspaceCustomApplicationId,
};
};
@@ -1,45 +0,0 @@
/* @license Enterprise */
import { t } from '@lingui/core/macro';
import {
extractAndSanitizeObjectStringFields,
isDefined,
} from 'twenty-shared/utils';
import { type DeleteRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/delete-row-level-permission-predicate.input';
import {
RowLevelPermissionPredicateException,
RowLevelPermissionPredicateExceptionCode,
} from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate.exception';
import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type';
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
export const fromDeleteRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow =
({
deleteRowLevelPermissionPredicateInput:
rawDeleteRowLevelPermissionPredicateInput,
flatRowLevelPermissionPredicateMaps,
}: {
deleteRowLevelPermissionPredicateInput: DeleteRowLevelPermissionPredicateInput;
flatRowLevelPermissionPredicateMaps: FlatRowLevelPermissionPredicateMaps;
}): FlatRowLevelPermissionPredicate => {
const { id: predicateId } = extractAndSanitizeObjectStringFields(
rawDeleteRowLevelPermissionPredicateInput,
['id'],
);
const existingFlatPredicate =
flatRowLevelPermissionPredicateMaps.byId[predicateId];
if (!isDefined(existingFlatPredicate)) {
throw new RowLevelPermissionPredicateException(
t`Row level permission predicate to delete not found`,
RowLevelPermissionPredicateExceptionCode.ROW_LEVEL_PERMISSION_PREDICATE_NOT_FOUND,
);
}
return {
...existingFlatPredicate,
deletedAt: new Date().toISOString(),
};
};
@@ -1,42 +0,0 @@
/* @license Enterprise */
import { t } from '@lingui/core/macro';
import {
extractAndSanitizeObjectStringFields,
isDefined,
} from 'twenty-shared/utils';
import { type DestroyRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/destroy-row-level-permission-predicate.input';
import {
RowLevelPermissionPredicateException,
RowLevelPermissionPredicateExceptionCode,
} from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate.exception';
import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type';
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
export const fromDestroyRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateOrThrow =
({
destroyRowLevelPermissionPredicateInput:
rawDestroyRowLevelPermissionPredicateInput,
flatRowLevelPermissionPredicateMaps,
}: {
destroyRowLevelPermissionPredicateInput: DestroyRowLevelPermissionPredicateInput;
flatRowLevelPermissionPredicateMaps: FlatRowLevelPermissionPredicateMaps;
}): FlatRowLevelPermissionPredicate => {
const { id: predicateId } = extractAndSanitizeObjectStringFields(
rawDestroyRowLevelPermissionPredicateInput,
['id'],
);
const existingFlatPredicate =
flatRowLevelPermissionPredicateMaps.byId[predicateId];
if (!isDefined(existingFlatPredicate)) {
throw new RowLevelPermissionPredicateException(
t`Row level permission predicate to destroy not found`,
RowLevelPermissionPredicateExceptionCode.ROW_LEVEL_PERMISSION_PREDICATE_NOT_FOUND,
);
}
return existingFlatPredicate;
};
@@ -0,0 +1,10 @@
/* @license Enterprise */
import { type RowLevelPermissionPredicateGroupDTO } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/row-level-permission-predicate-group.dto';
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
export const fromFlatRowLevelPermissionPredicateGroupToDto = (
flatGroup: FlatRowLevelPermissionPredicateGroup,
): RowLevelPermissionPredicateGroupDTO => ({
...flatGroup,
});
@@ -1,55 +0,0 @@
/* @license Enterprise */
import { t } from '@lingui/core/macro';
import {
extractAndSanitizeObjectStringFields,
isDefined,
trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties,
} from 'twenty-shared/utils';
import { FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/constants/flat-row-level-permission-predicate-editable-properties.constant';
import { type UpdateRowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/update-row-level-permission-predicate.input';
import {
RowLevelPermissionPredicateException,
RowLevelPermissionPredicateExceptionCode,
} from 'src/engine/metadata-modules/row-level-permission-predicate/exceptions/row-level-permission-predicate.exception';
import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type';
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util';
export const fromUpdateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicateToUpdateOrThrow =
({
updateRowLevelPermissionPredicateInput:
rawUpdateRowLevelPermissionPredicateInput,
flatRowLevelPermissionPredicateMaps,
}: {
updateRowLevelPermissionPredicateInput: UpdateRowLevelPermissionPredicateInput;
flatRowLevelPermissionPredicateMaps: FlatRowLevelPermissionPredicateMaps;
}): FlatRowLevelPermissionPredicate => {
const { id: predicateId } =
trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties(
rawUpdateRowLevelPermissionPredicateInput,
['id'],
);
const existingFlatPredicate =
flatRowLevelPermissionPredicateMaps.byId[predicateId];
if (!isDefined(existingFlatPredicate)) {
throw new RowLevelPermissionPredicateException(
t`Row level permission predicate to update not found`,
RowLevelPermissionPredicateExceptionCode.ROW_LEVEL_PERMISSION_PREDICATE_NOT_FOUND,
);
}
const sanitizedUpdate = extractAndSanitizeObjectStringFields(
rawUpdateRowLevelPermissionPredicateInput,
FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES,
);
return mergeUpdateInExistingRecord({
existing: existingFlatPredicate,
properties: FLAT_ROW_LEVEL_PERMISSION_PREDICATE_EDITABLE_PROPERTIES,
update: sanitizedUpdate,
});
};