Fix RLS creation logic (#17815)
Fix after resolveEntityRelationUniversalIdentifiers introduction
```
FlatEntityMapsException [Error]: Could not find rowLevelPermissionPredicateGroup for given rowLevelPermissionPredicateGroupId
at resolveEntityRelationUniversalIdentifiers
```
- Creating util for RLS flat entity creation to be aligned with other
entities
- Progressively update the flat entity maps as each new group is built,
following the same optimistic pattern used by
computeUniversalFlatEntityMapsFromTo in the validate build and run. The
updated maps are now passed to computePredicateOperations so predicates
can also resolve references to the newly created groups.
- Adding more coverage
Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
This commit is contained in:
+71
@@ -0,0 +1,71 @@
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
|
||||
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util';
|
||||
import { type RowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/upsert-row-level-permission-predicates.input';
|
||||
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
|
||||
|
||||
export const fromCreateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroup =
|
||||
({
|
||||
input,
|
||||
roleId,
|
||||
workspaceId,
|
||||
roleUniversalIdentifier,
|
||||
flatApplication,
|
||||
flatObjectMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
}: {
|
||||
input: RowLevelPermissionPredicateGroupInput;
|
||||
roleId: string;
|
||||
workspaceId: string;
|
||||
roleUniversalIdentifier: string;
|
||||
flatApplication: FlatApplication;
|
||||
} & Pick<AllFlatEntityMaps, 'flatObjectMetadataMaps'> & {
|
||||
flatRowLevelPermissionPredicateGroupMaps: FlatEntityMaps<FlatRowLevelPermissionPredicateGroup>;
|
||||
}): FlatRowLevelPermissionPredicateGroup => {
|
||||
const groupId = input.id ?? v4();
|
||||
const createdAt = new Date().toISOString();
|
||||
|
||||
const {
|
||||
objectMetadataUniversalIdentifier,
|
||||
parentRowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
} = resolveEntityRelationUniversalIdentifiers({
|
||||
metadataName: 'rowLevelPermissionPredicateGroup',
|
||||
foreignKeyValues: {
|
||||
objectMetadataId: input.objectMetadataId,
|
||||
parentRowLevelPermissionPredicateGroupId:
|
||||
input.parentRowLevelPermissionPredicateGroupId,
|
||||
},
|
||||
flatEntityMaps: {
|
||||
flatObjectMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
id: groupId,
|
||||
workspaceId,
|
||||
roleId,
|
||||
roleUniversalIdentifier,
|
||||
objectMetadataId: input.objectMetadataId,
|
||||
objectMetadataUniversalIdentifier,
|
||||
logicalOperator: input.logicalOperator,
|
||||
parentRowLevelPermissionPredicateGroupId:
|
||||
input.parentRowLevelPermissionPredicateGroupId ?? null,
|
||||
parentRowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
positionInRowLevelPermissionPredicateGroup:
|
||||
input.positionInRowLevelPermissionPredicateGroup ?? null,
|
||||
childRowLevelPermissionPredicateGroupIds: [],
|
||||
childRowLevelPermissionPredicateGroupUniversalIdentifiers: [],
|
||||
rowLevelPermissionPredicateIds: [],
|
||||
rowLevelPermissionPredicateUniversalIdentifiers: [],
|
||||
createdAt,
|
||||
updatedAt: createdAt,
|
||||
deletedAt: null,
|
||||
universalIdentifier: groupId,
|
||||
applicationId: flatApplication.id,
|
||||
applicationUniversalIdentifier: flatApplication.universalIdentifier,
|
||||
};
|
||||
};
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
|
||||
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util';
|
||||
import { type RowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/upsert-row-level-permission-predicates.input';
|
||||
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
|
||||
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
|
||||
|
||||
export const fromCreateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicate =
|
||||
({
|
||||
input,
|
||||
roleId,
|
||||
objectMetadataId,
|
||||
workspaceId,
|
||||
roleUniversalIdentifier,
|
||||
objectMetadataUniversalIdentifier,
|
||||
flatApplication,
|
||||
flatFieldMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
}: {
|
||||
input: RowLevelPermissionPredicateInput;
|
||||
roleId: string;
|
||||
objectMetadataId: string;
|
||||
workspaceId: string;
|
||||
roleUniversalIdentifier: string;
|
||||
objectMetadataUniversalIdentifier: string;
|
||||
flatApplication: FlatApplication;
|
||||
} & Pick<AllFlatEntityMaps, 'flatFieldMetadataMaps'> & {
|
||||
flatRowLevelPermissionPredicateGroupMaps: FlatEntityMaps<FlatRowLevelPermissionPredicateGroup>;
|
||||
}): FlatRowLevelPermissionPredicate => {
|
||||
const predicateId = input.id ?? v4();
|
||||
const createdAt = new Date().toISOString();
|
||||
|
||||
const {
|
||||
fieldMetadataUniversalIdentifier,
|
||||
rowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
workspaceMemberFieldMetadataUniversalIdentifier,
|
||||
} = resolveEntityRelationUniversalIdentifiers({
|
||||
metadataName: 'rowLevelPermissionPredicate',
|
||||
foreignKeyValues: {
|
||||
fieldMetadataId: input.fieldMetadataId,
|
||||
rowLevelPermissionPredicateGroupId:
|
||||
input.rowLevelPermissionPredicateGroupId,
|
||||
workspaceMemberFieldMetadataId: input.workspaceMemberFieldMetadataId,
|
||||
},
|
||||
flatEntityMaps: {
|
||||
flatFieldMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
id: predicateId,
|
||||
workspaceId,
|
||||
roleId,
|
||||
roleUniversalIdentifier,
|
||||
objectMetadataId,
|
||||
objectMetadataUniversalIdentifier,
|
||||
fieldMetadataId: input.fieldMetadataId,
|
||||
fieldMetadataUniversalIdentifier,
|
||||
operand: input.operand,
|
||||
value: input.value ?? null,
|
||||
subFieldName: input.subFieldName ?? null,
|
||||
workspaceMemberFieldMetadataId:
|
||||
input.workspaceMemberFieldMetadataId ?? null,
|
||||
workspaceMemberFieldMetadataUniversalIdentifier,
|
||||
workspaceMemberSubFieldName: input.workspaceMemberSubFieldName ?? null,
|
||||
rowLevelPermissionPredicateGroupId:
|
||||
input.rowLevelPermissionPredicateGroupId ?? null,
|
||||
rowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
positionInRowLevelPermissionPredicateGroup:
|
||||
input.positionInRowLevelPermissionPredicateGroup ?? null,
|
||||
createdAt,
|
||||
updatedAt: createdAt,
|
||||
deletedAt: null,
|
||||
universalIdentifier: predicateId,
|
||||
applicationId: flatApplication.id,
|
||||
applicationUniversalIdentifier: flatApplication.universalIdentifier,
|
||||
};
|
||||
};
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util';
|
||||
import { type RowLevelPermissionPredicateGroupInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/upsert-row-level-permission-predicates.input';
|
||||
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
|
||||
|
||||
export const fromUpdateRowLevelPermissionPredicateGroupInputToFlatRowLevelPermissionPredicateGroup =
|
||||
({
|
||||
input,
|
||||
existingGroup,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
}: {
|
||||
input: RowLevelPermissionPredicateGroupInput;
|
||||
existingGroup: FlatRowLevelPermissionPredicateGroup;
|
||||
flatRowLevelPermissionPredicateGroupMaps: FlatEntityMaps<FlatRowLevelPermissionPredicateGroup>;
|
||||
}): FlatRowLevelPermissionPredicateGroup => {
|
||||
const { parentRowLevelPermissionPredicateGroupUniversalIdentifier } =
|
||||
resolveEntityRelationUniversalIdentifiers({
|
||||
metadataName: 'rowLevelPermissionPredicateGroup',
|
||||
foreignKeyValues: {
|
||||
parentRowLevelPermissionPredicateGroupId:
|
||||
input.parentRowLevelPermissionPredicateGroupId,
|
||||
},
|
||||
flatEntityMaps: {
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
...existingGroup,
|
||||
logicalOperator: input.logicalOperator,
|
||||
parentRowLevelPermissionPredicateGroupId:
|
||||
input.parentRowLevelPermissionPredicateGroupId ?? null,
|
||||
parentRowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
positionInRowLevelPermissionPredicateGroup:
|
||||
input.positionInRowLevelPermissionPredicateGroup ?? null,
|
||||
updatedAt: new Date().toISOString(),
|
||||
};
|
||||
};
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { resolveEntityRelationUniversalIdentifiers } from 'src/engine/metadata-modules/flat-entity/utils/resolve-entity-relation-universal-identifiers.util';
|
||||
import { type RowLevelPermissionPredicateInput } from 'src/engine/metadata-modules/row-level-permission-predicate/dtos/inputs/upsert-row-level-permission-predicates.input';
|
||||
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
|
||||
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
|
||||
|
||||
export const fromUpdateRowLevelPermissionPredicateInputToFlatRowLevelPermissionPredicate =
|
||||
({
|
||||
input,
|
||||
existingPredicate,
|
||||
flatFieldMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
}: {
|
||||
input: RowLevelPermissionPredicateInput;
|
||||
existingPredicate: FlatRowLevelPermissionPredicate;
|
||||
} & Pick<AllFlatEntityMaps, 'flatFieldMetadataMaps'> & {
|
||||
flatRowLevelPermissionPredicateGroupMaps: FlatEntityMaps<FlatRowLevelPermissionPredicateGroup>;
|
||||
}): FlatRowLevelPermissionPredicate => {
|
||||
const {
|
||||
fieldMetadataUniversalIdentifier,
|
||||
rowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
workspaceMemberFieldMetadataUniversalIdentifier,
|
||||
} = resolveEntityRelationUniversalIdentifiers({
|
||||
metadataName: 'rowLevelPermissionPredicate',
|
||||
foreignKeyValues: {
|
||||
fieldMetadataId: input.fieldMetadataId,
|
||||
rowLevelPermissionPredicateGroupId:
|
||||
input.rowLevelPermissionPredicateGroupId,
|
||||
workspaceMemberFieldMetadataId: input.workspaceMemberFieldMetadataId,
|
||||
},
|
||||
flatEntityMaps: {
|
||||
flatFieldMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
...existingPredicate,
|
||||
fieldMetadataId: input.fieldMetadataId,
|
||||
fieldMetadataUniversalIdentifier,
|
||||
operand: input.operand,
|
||||
value: input.value ?? null,
|
||||
subFieldName: input.subFieldName ?? null,
|
||||
workspaceMemberFieldMetadataId:
|
||||
input.workspaceMemberFieldMetadataId ?? null,
|
||||
workspaceMemberFieldMetadataUniversalIdentifier,
|
||||
workspaceMemberSubFieldName: input.workspaceMemberSubFieldName ?? null,
|
||||
rowLevelPermissionPredicateGroupId:
|
||||
input.rowLevelPermissionPredicateGroupId ?? null,
|
||||
rowLevelPermissionPredicateGroupUniversalIdentifier,
|
||||
positionInRowLevelPermissionPredicateGroup:
|
||||
input.positionInRowLevelPermissionPredicateGroup ?? null,
|
||||
updatedAt: new Date().toISOString(),
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user