[REQUIRES_FULL_CACHE_FLUSH_WHEN_RELEASED] Refactor FlatEntity to be UniversalFlatEntity superset (#17452)

# Introduction
In this PR we're refactoring the `FlatEntity` type to become a superset
of the `UniversalFlatEntity`.
Right now we're storing all the extra properties in `__universal`
property, at some point it might just be sibling to other entity and we
might rely on the `propertiesToCompare` constants and TypeScript
allowing passing a superset type into a smaller subset type

## FromTo utils
The entity to flat entity method now computes the universal information,
standardized a typing and pattern to do

## Example
Also strictly type
```ts
    "bbb019ea-6205-498c-aea5-67bc53bce8a9": {
      "workspaceId": "20202020-1c25-4d02-bf25-6aeccf7ea419",
      "universalIdentifier": "20202020-d111-4d11-8d11-da5ab0a11002",
      "applicationId": "d01b010d-b984-465b-b40b-370e954e5188",
      "id": "bbb019ea-6205-498c-aea5-67bc53bce8a9",
      "pageLayoutTabId": "791a512f-169f-4209-b731-aa86716668c6",
      "title": "Deals by Company",
      "type": "GRAPH",
      "objectMetadataId": "9e14efea-df5b-4c0e-aba9-cfe455f32397",
      "gridPosition": { "row": 0, "column": 6, "rowSpan": 6, "columnSpan": 6 },
      "configuration": {
        "color": "orange",
        "orderBy": "FIELD_ASC",
        "timezone": "UTC",
        "displayLegend": true,
        "displayDataLabel": false,
        "showCenterMetric": true,
        "configurationType": "PIE_CHART",
        "firstDayOfTheWeek": 0,
        "aggregateOperation": "COUNT",
        "groupBySubFieldName": "name",
        "groupByFieldMetadataId": "6673ff18-63d2-47a1-8f85-2b9b09ca27a5",
        "aggregateFieldMetadataId": "8d64ee41-5dd4-4de6-945a-7c0c18399715"
      },
      "createdAt": "2026-01-28T14:08:52.140Z",
      "updatedAt": "2026-01-28T14:08:52.140Z",
      "deletedAt": null,
      "__universal": {
        "universalIdentifier": "20202020-d111-4d11-8d11-da5ab0a11002",
        "applicationUniversalIdentifier": "20202020-64aa-4b6f-b003-9c74b97cee20",
        "pageLayoutTabUniversalIdentifier": "20202020-d011-4d11-8d11-da5ab0a01001",
        "objectMetadataUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
        "gridPosition": {
          "row": 0,
          "column": 6,
          "rowSpan": 6,
          "columnSpan": 6
        },
        "configuration": {
          "color": "orange",
          "orderBy": "FIELD_ASC",
          "timezone": "UTC",
          "displayLegend": true,
          "displayDataLabel": false,
          "showCenterMetric": true,
          "configurationType": "PIE_CHART",
          "firstDayOfTheWeek": 0,
          "aggregateOperation": "COUNT",
          "groupBySubFieldName": "name",
          "aggregateFieldMetadataUniversalIdentifier": "20202020-d01a-4131-8a31-f123456789ab",
          "groupByFieldMetadataUniversalIdentifier": "20202020-cbac-457e-b565-adece5fc815f"
        }
      }
    },
```
This commit is contained in:
Paul Rastoin
2026-01-28 17:46:34 +01:00
committed by GitHub
parent 81eaee81a8
commit fe9d6f34ff
90 changed files with 3058 additions and 538 deletions
@@ -7,11 +7,17 @@ import { Repository } from 'typeorm';
import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service';
import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { fromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-row-level-permission-predicate-group-entity-to-flat-row-level-permission-predicate-group.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity';
import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity';
import { type FlatRowLevelPermissionPredicateGroupMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group-maps.type';
import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator';
import { createIdToUniversalIdentifierMap } from 'src/engine/workspace-cache/utils/create-id-to-universal-identifier-map.util';
import { regroupEntitiesByRelatedEntityId } from 'src/engine/workspace-cache/utils/regroup-entities-by-related-entity-id';
import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util';
@Injectable()
@@ -20,6 +26,14 @@ export class WorkspaceFlatRowLevelPermissionPredicateGroupMapCacheService extend
constructor(
@InjectRepository(RowLevelPermissionPredicateGroupEntity)
private readonly rowLevelPermissionPredicateGroupRepository: Repository<RowLevelPermissionPredicateGroupEntity>,
@InjectRepository(ApplicationEntity)
private readonly applicationRepository: Repository<ApplicationEntity>,
@InjectRepository(ObjectMetadataEntity)
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
@InjectRepository(RoleEntity)
private readonly roleRepository: Repository<RoleEntity>,
@InjectRepository(RowLevelPermissionPredicateEntity)
private readonly rowLevelPermissionPredicateRepository: Repository<RowLevelPermissionPredicateEntity>,
) {
super();
}
@@ -27,13 +41,67 @@ export class WorkspaceFlatRowLevelPermissionPredicateGroupMapCacheService extend
async computeForCache(
workspaceId: string,
): Promise<FlatRowLevelPermissionPredicateGroupMaps> {
const rowLevelPermissionPredicateGroups =
await this.rowLevelPermissionPredicateGroupRepository.find({
where: {
workspaceId,
},
const [
rowLevelPermissionPredicateGroups,
applications,
objectMetadatas,
roles,
rowLevelPermissionPredicates,
] = await Promise.all([
this.rowLevelPermissionPredicateGroupRepository.find({
where: { workspaceId },
withDeleted: true,
});
}),
this.applicationRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.objectMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.roleRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.rowLevelPermissionPredicateRepository.find({
where: { workspaceId },
select: [
'id',
'universalIdentifier',
'rowLevelPermissionPredicateGroupId',
],
withDeleted: true,
}),
]);
const [
childRowLevelPermissionPredicateGroupsByParentId,
rowLevelPermissionPredicatesByGroupId,
] = (
[
{
entities: rowLevelPermissionPredicateGroups,
foreignKey: 'parentRowLevelPermissionPredicateGroupId',
},
{
entities: rowLevelPermissionPredicates,
foreignKey: 'rowLevelPermissionPredicateGroupId',
},
] as const
).map(regroupEntitiesByRelatedEntityId);
const applicationIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(applications);
const objectMetadataIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(objectMetadatas);
const roleIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(roles);
const rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(rowLevelPermissionPredicateGroups);
const flatRowLevelPermissionPredicateGroupMaps =
createEmptyFlatEntityMaps();
@@ -41,7 +109,23 @@ export class WorkspaceFlatRowLevelPermissionPredicateGroupMapCacheService extend
for (const rowLevelPermissionPredicateGroupEntity of rowLevelPermissionPredicateGroups) {
const flatRowLevelPermissionPredicateGroup =
fromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionPredicateGroup(
rowLevelPermissionPredicateGroupEntity,
{
entity: {
...rowLevelPermissionPredicateGroupEntity,
childRowLevelPermissionPredicateGroups:
childRowLevelPermissionPredicateGroupsByParentId.get(
rowLevelPermissionPredicateGroupEntity.id,
) || [],
rowLevelPermissionPredicates:
rowLevelPermissionPredicatesByGroupId.get(
rowLevelPermissionPredicateGroupEntity.id,
) || [],
},
applicationIdToUniversalIdentifierMap,
objectMetadataIdToUniversalIdentifierMap,
roleIdToUniversalIdentifierMap,
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap,
},
);
addFlatEntityToFlatEntityMapsThroughMutationOrThrow({
@@ -7,11 +7,17 @@ import { Repository } from 'typeorm';
import { WorkspaceCacheProvider } from 'src/engine/workspace-cache/interfaces/workspace-cache-provider.service';
import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { fromRowLevelPermissionPredicateEntityToFlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/utils/from-row-level-permission-predicate-entity-to-flat-row-level-permission-predicate.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity';
import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity';
import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type';
import { WorkspaceCache } from 'src/engine/workspace-cache/decorators/workspace-cache.decorator';
import { createIdToUniversalIdentifierMap } from 'src/engine/workspace-cache/utils/create-id-to-universal-identifier-map.util';
import { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util';
@Injectable()
@@ -20,6 +26,16 @@ export class WorkspaceFlatRowLevelPermissionPredicateMapCacheService extends Wor
constructor(
@InjectRepository(RowLevelPermissionPredicateEntity)
private readonly rowLevelPermissionPredicateRepository: Repository<RowLevelPermissionPredicateEntity>,
@InjectRepository(ApplicationEntity)
private readonly applicationRepository: Repository<ApplicationEntity>,
@InjectRepository(FieldMetadataEntity)
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
@InjectRepository(ObjectMetadataEntity)
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
@InjectRepository(RoleEntity)
private readonly roleRepository: Repository<RoleEntity>,
@InjectRepository(RowLevelPermissionPredicateGroupEntity)
private readonly rowLevelPermissionPredicateGroupRepository: Repository<RowLevelPermissionPredicateGroupEntity>,
) {
super();
}
@@ -27,21 +43,68 @@ export class WorkspaceFlatRowLevelPermissionPredicateMapCacheService extends Wor
async computeForCache(
workspaceId: string,
): Promise<FlatRowLevelPermissionPredicateMaps> {
const rowLevelPermissionPredicates =
await this.rowLevelPermissionPredicateRepository.find({
where: {
workspaceId,
},
const [
rowLevelPermissionPredicates,
applications,
fieldMetadatas,
objectMetadatas,
roles,
rowLevelPermissionPredicateGroups,
] = await Promise.all([
this.rowLevelPermissionPredicateRepository.find({
where: { workspaceId },
withDeleted: true,
});
}),
this.applicationRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.fieldMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.objectMetadataRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.roleRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
this.rowLevelPermissionPredicateGroupRepository.find({
where: { workspaceId },
select: ['id', 'universalIdentifier'],
withDeleted: true,
}),
]);
const applicationIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(applications);
const fieldMetadataIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(fieldMetadatas);
const objectMetadataIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(objectMetadatas);
const roleIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(roles);
const rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap =
createIdToUniversalIdentifierMap(rowLevelPermissionPredicateGroups);
const flatRowLevelPermissionPredicateMaps = createEmptyFlatEntityMaps();
for (const rowLevelPermissionPredicateEntity of rowLevelPermissionPredicates) {
const flatRowLevelPermissionPredicate =
fromRowLevelPermissionPredicateEntityToFlatRowLevelPermissionPredicate(
rowLevelPermissionPredicateEntity,
);
fromRowLevelPermissionPredicateEntityToFlatRowLevelPermissionPredicate({
entity: rowLevelPermissionPredicateEntity,
applicationIdToUniversalIdentifierMap,
fieldMetadataIdToUniversalIdentifierMap,
objectMetadataIdToUniversalIdentifierMap,
roleIdToUniversalIdentifierMap,
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap,
});
addFlatEntityToFlatEntityMapsThroughMutationOrThrow({
flatEntity: flatRowLevelPermissionPredicate,
@@ -1,20 +1,117 @@
/* @license Enterprise */
import { removePropertiesFromRecord } from 'twenty-shared/utils';
import { isDefined, removePropertiesFromRecord } from 'twenty-shared/utils';
import {
FlatEntityMapsException,
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { ROW_LEVEL_PERMISSION_PREDICATE_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/constants/row-level-permission-predicate-entity-relation-properties.constant';
import { type RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity';
import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type';
import { type FromEntityToFlatEntityArgs } from 'src/engine/workspace-cache/types/from-entity-to-flat-entity-args.type';
export const fromRowLevelPermissionPredicateEntityToFlatRowLevelPermissionPredicate =
(
rowLevelPermissionPredicateEntity: RowLevelPermissionPredicateEntity,
): FlatRowLevelPermissionPredicate => {
({
entity: rowLevelPermissionPredicateEntity,
applicationIdToUniversalIdentifierMap,
fieldMetadataIdToUniversalIdentifierMap,
objectMetadataIdToUniversalIdentifierMap,
roleIdToUniversalIdentifierMap,
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap,
}: FromEntityToFlatEntityArgs<'rowLevelPermissionPredicate'>): FlatRowLevelPermissionPredicate => {
const rowLevelPermissionPredicateEntityWithoutRelations =
removePropertiesFromRecord(rowLevelPermissionPredicateEntity, [
...ROW_LEVEL_PERMISSION_PREDICATE_ENTITY_RELATION_PROPERTIES,
] as (typeof ROW_LEVEL_PERMISSION_PREDICATE_ENTITY_RELATION_PROPERTIES)[number][]);
const applicationUniversalIdentifier =
applicationIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.applicationId,
);
if (!isDefined(applicationUniversalIdentifier)) {
throw new FlatEntityMapsException(
`Application with id ${rowLevelPermissionPredicateEntity.applicationId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const fieldMetadataUniversalIdentifier =
fieldMetadataIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.fieldMetadataId,
);
if (!isDefined(fieldMetadataUniversalIdentifier)) {
throw new FlatEntityMapsException(
`FieldMetadata with id ${rowLevelPermissionPredicateEntity.fieldMetadataId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const objectMetadataUniversalIdentifier =
objectMetadataIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.objectMetadataId,
);
if (!isDefined(objectMetadataUniversalIdentifier)) {
throw new FlatEntityMapsException(
`ObjectMetadata with id ${rowLevelPermissionPredicateEntity.objectMetadataId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const roleUniversalIdentifier = roleIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.roleId,
);
if (!isDefined(roleUniversalIdentifier)) {
throw new FlatEntityMapsException(
`Role with id ${rowLevelPermissionPredicateEntity.roleId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
let workspaceMemberFieldMetadataUniversalIdentifier: string | null = null;
if (
isDefined(
rowLevelPermissionPredicateEntity.workspaceMemberFieldMetadataId,
)
) {
workspaceMemberFieldMetadataUniversalIdentifier =
fieldMetadataIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.workspaceMemberFieldMetadataId,
) ?? null;
if (!isDefined(workspaceMemberFieldMetadataUniversalIdentifier)) {
throw new FlatEntityMapsException(
`FieldMetadata with id ${rowLevelPermissionPredicateEntity.workspaceMemberFieldMetadataId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
}
let rowLevelPermissionPredicateGroupUniversalIdentifier: string | null =
null;
if (
isDefined(
rowLevelPermissionPredicateEntity.rowLevelPermissionPredicateGroupId,
)
) {
rowLevelPermissionPredicateGroupUniversalIdentifier =
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateEntity.rowLevelPermissionPredicateGroupId,
) ?? null;
if (!isDefined(rowLevelPermissionPredicateGroupUniversalIdentifier)) {
throw new FlatEntityMapsException(
`RowLevelPermissionPredicateGroup with id ${rowLevelPermissionPredicateEntity.rowLevelPermissionPredicateGroupId} not found for rowLevelPermissionPredicate ${rowLevelPermissionPredicateEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
}
return {
...rowLevelPermissionPredicateEntityWithoutRelations,
createdAt: rowLevelPermissionPredicateEntity.createdAt.toISOString(),
@@ -23,5 +120,16 @@ export const fromRowLevelPermissionPredicateEntityToFlatRowLevelPermissionPredic
rowLevelPermissionPredicateEntity.deletedAt?.toISOString() ?? null,
universalIdentifier:
rowLevelPermissionPredicateEntityWithoutRelations.universalIdentifier,
__universal: {
universalIdentifier:
rowLevelPermissionPredicateEntity.universalIdentifier,
applicationUniversalIdentifier,
fieldMetadataUniversalIdentifier,
objectMetadataUniversalIdentifier,
roleUniversalIdentifier,
workspaceMemberFieldMetadataUniversalIdentifier,
rowLevelPermissionPredicateGroupUniversalIdentifier,
value: rowLevelPermissionPredicateEntityWithoutRelations.value,
},
};
};
@@ -1,20 +1,95 @@
/* @license Enterprise */
import { removePropertiesFromRecord } from 'twenty-shared/utils';
import { isDefined, removePropertiesFromRecord } from 'twenty-shared/utils';
import {
FlatEntityMapsException,
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { ROW_LEVEL_PERMISSION_PREDICATE_GROUP_ENTITY_RELATION_PROPERTIES } from 'src/engine/metadata-modules/flat-row-level-permission-predicate/constants/row-level-permission-predicate-group-entity-relation-properties.constant';
import { type RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity';
import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type';
import { type FromEntityToFlatEntityArgs } from 'src/engine/workspace-cache/types/from-entity-to-flat-entity-args.type';
type FromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionPredicateGroupArgs =
FromEntityToFlatEntityArgs<'rowLevelPermissionPredicateGroup'> & {
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap: Map<
string,
string
>;
};
export const fromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionPredicateGroup =
(
rowLevelPermissionPredicateGroupEntity: RowLevelPermissionPredicateGroupEntity,
): FlatRowLevelPermissionPredicateGroup => {
({
entity: rowLevelPermissionPredicateGroupEntity,
applicationIdToUniversalIdentifierMap,
objectMetadataIdToUniversalIdentifierMap,
roleIdToUniversalIdentifierMap,
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap,
}: FromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionPredicateGroupArgs): FlatRowLevelPermissionPredicateGroup => {
const rowLevelPermissionPredicateGroupEntityWithoutRelations =
removePropertiesFromRecord(rowLevelPermissionPredicateGroupEntity, [
...ROW_LEVEL_PERMISSION_PREDICATE_GROUP_ENTITY_RELATION_PROPERTIES,
] as (typeof ROW_LEVEL_PERMISSION_PREDICATE_GROUP_ENTITY_RELATION_PROPERTIES)[number][]);
const applicationUniversalIdentifier =
applicationIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateGroupEntity.applicationId,
);
if (!isDefined(applicationUniversalIdentifier)) {
throw new FlatEntityMapsException(
`Application with id ${rowLevelPermissionPredicateGroupEntity.applicationId} not found for rowLevelPermissionPredicateGroup ${rowLevelPermissionPredicateGroupEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const objectMetadataUniversalIdentifier =
objectMetadataIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateGroupEntity.objectMetadataId,
);
if (!isDefined(objectMetadataUniversalIdentifier)) {
throw new FlatEntityMapsException(
`ObjectMetadata with id ${rowLevelPermissionPredicateGroupEntity.objectMetadataId} not found for rowLevelPermissionPredicateGroup ${rowLevelPermissionPredicateGroupEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const roleUniversalIdentifier = roleIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateGroupEntity.roleId,
);
if (!isDefined(roleUniversalIdentifier)) {
throw new FlatEntityMapsException(
`Role with id ${rowLevelPermissionPredicateGroupEntity.roleId} not found for rowLevelPermissionPredicateGroup ${rowLevelPermissionPredicateGroupEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
let parentRowLevelPermissionPredicateGroupUniversalIdentifier:
| string
| null = null;
if (
isDefined(
rowLevelPermissionPredicateGroupEntity.parentRowLevelPermissionPredicateGroupId,
)
) {
parentRowLevelPermissionPredicateGroupUniversalIdentifier =
rowLevelPermissionPredicateGroupIdToUniversalIdentifierMap.get(
rowLevelPermissionPredicateGroupEntity.parentRowLevelPermissionPredicateGroupId,
) ?? null;
if (
!isDefined(parentRowLevelPermissionPredicateGroupUniversalIdentifier)
) {
throw new FlatEntityMapsException(
`RowLevelPermissionPredicateGroup with id ${rowLevelPermissionPredicateGroupEntity.parentRowLevelPermissionPredicateGroupId} not found for rowLevelPermissionPredicateGroup ${rowLevelPermissionPredicateGroupEntity.id}`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
}
return {
...rowLevelPermissionPredicateGroupEntityWithoutRelations,
createdAt: rowLevelPermissionPredicateGroupEntity.createdAt.toISOString(),
@@ -31,5 +106,21 @@ export const fromRowLevelPermissionPredicateGroupEntityToFlatRowLevelPermissionP
rowLevelPermissionPredicateGroupEntity.rowLevelPermissionPredicates ??
[]
).map(({ id }) => id),
__universal: {
universalIdentifier:
rowLevelPermissionPredicateGroupEntity.universalIdentifier,
applicationUniversalIdentifier,
objectMetadataUniversalIdentifier,
roleUniversalIdentifier,
parentRowLevelPermissionPredicateGroupUniversalIdentifier,
childRowLevelPermissionPredicateGroupUniversalIdentifiers: (
rowLevelPermissionPredicateGroupEntity.childRowLevelPermissionPredicateGroups ??
[]
).map(({ universalIdentifier }) => universalIdentifier),
rowLevelPermissionPredicateUniversalIdentifiers: (
rowLevelPermissionPredicateGroupEntity.rowLevelPermissionPredicates ??
[]
).map(({ universalIdentifier }) => universalIdentifier),
},
};
};