Refactor flat entity maps to be universal oriented (#17665)

# Introduction
In preparation of the workspace agnostic builder, we're migrating
`FlatEntityMaps` to be universal identifier oriented and based
As in the builder context there're won't be any ids at all
Please also note that the FlatEntity is a UniversalFlatEntity superset

From
```ts
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';

export type FlatEntityMaps<T extends SyncableFlatEntity> = {
  byId: Partial<Record<string, T>>;
  idByUniversalIdentifier: Partial<Record<string, string>>;
  universalIdentifiersByApplicationId: Partial<Record<string, string[]>>;
};
```

To
```ts
export type FlatEntityMaps<
  T extends SyncableFlatEntity | UniversalSyncableFlatEntity,
> = {
  byUniversalIdentifier: Partial<Record<string, T>>;
  universalIdentifierById: Partial<Record<string, string>>;
  universalIdentifiersByApplicationId: Partial<Record<string, string[]>>; // this might make more sense to be migrated to universalIdentifiersByApplicationUniversalIdentifier but it's the main topic of this PR
};
```

## Low level maps tools
Had to refactor find | create | delete | replace | find-many | get-sub
tools ( through mutations and or throw equivalent )
This commit is contained in:
Paul Rastoin
2026-02-03 17:16:02 +01:00
committed by GitHub
parent 43042d55b2
commit 476bdf764c
202 changed files with 1853 additions and 909 deletions
@@ -37,7 +37,7 @@ export class AgentService {
'flatRoleTargetByAgentIdMaps',
]);
return Object.values(flatAgentMaps.byId)
return Object.values(flatAgentMaps.byUniversalIdentifier)
.filter(isDefined)
.map((flatAgent) => {
const roleId = flatRoleTargetByAgentIdMaps[flatAgent.id]?.roleId;
@@ -13,6 +13,7 @@ import {
import { type UpdateAgentInput } from 'src/engine/metadata-modules/ai/ai-agent/dtos/update-agent.input';
import { FLAT_AGENT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant';
import { type FlatAgentMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-agent-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type';
import { type FlatRoleTargetByAgentIdMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-role-target-by-agent-id-maps.type';
import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type';
@@ -95,7 +96,10 @@ export const fromUpdateAgentInputToFlatAgentToUpdate = ({
['id'],
);
const existingFlatAgent = flatAgentMaps.byId[agentIdToUpdate];
const existingFlatAgent = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: agentIdToUpdate,
flatEntityMaps: flatAgentMaps,
});
if (!isDefined(existingFlatAgent)) {
throw new AgentException(
@@ -38,7 +38,7 @@ export class CommandMenuItemService {
},
);
return Object.values(flatCommandMenuItemMaps.byId)
return Object.values(flatCommandMenuItemMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.label.localeCompare(b.label))
.map(fromFlatCommandMenuItemToCommandMenuItemDto);
@@ -263,7 +263,7 @@ export class CommandMenuItemService {
},
);
return Object.values(flatCommandMenuItemMaps.byId)
return Object.values(flatCommandMenuItemMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.label.localeCompare(b.label));
}
@@ -281,7 +281,7 @@ export class CommandMenuItemService {
);
const flatCommandMenuItem = Object.values(
flatCommandMenuItemMaps.byId,
flatCommandMenuItemMaps.byUniversalIdentifier,
).find(
(item) => isDefined(item) && item.workflowVersionId === workflowVersionId,
);
@@ -3,7 +3,7 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/typ
export const createEmptyFlatEntityMaps = () =>
({
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
}) as const satisfies FlatEntityMaps<SyncableFlatEntity>;
@@ -1,7 +1,10 @@
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type';
export type FlatEntityMaps<T extends SyncableFlatEntity> = {
byId: Partial<Record<string, T>>;
idByUniversalIdentifier: Partial<Record<string, string>>;
export type FlatEntityMaps<
T extends SyncableFlatEntity | UniversalSyncableFlatEntity,
> = {
byUniversalIdentifier: Partial<Record<string, T>>;
universalIdentifierById: Partial<Record<string, string>>;
universalIdentifiersByApplicationId: Partial<Record<string, string[]>>;
};
@@ -4,6 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-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 { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
@@ -72,21 +73,26 @@ describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow',
});
expect(
flatEntityAndRelatedMapsToMutate.flatViewMaps.byId[mockView.id],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockView.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps,
}),
).toMatchObject(mockView);
expect(
flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps.byId[
objectMetadataId
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectMetadataId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps,
}),
).toMatchObject<Partial<FlatObjectMetadata>>({
viewIds: [mockView.id],
});
expect(
flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps.byId[
mockFieldMetadata.id
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockFieldMetadata.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps,
}),
).toMatchObject<Partial<FlatFieldMetadata>>({
calendarViewIds: [mockView.id],
});
@@ -4,6 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
@@ -82,21 +83,26 @@ describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThr
});
expect(
flatEntityAndRelatedMapsToMutate.flatViewMaps.byId[viewId],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps,
}),
).toBeUndefined();
expect(
flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps.byId[
objectMetadataId
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectMetadataId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps,
}),
).toMatchObject<Partial<FlatObjectMetadata>>({
viewIds: ['something-else'],
});
expect(
flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps.byId[
mockFieldMetadata.id
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockFieldMetadata.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps,
}),
).toMatchObject<Partial<FlatFieldMetadata>>({
calendarViewIds: [],
});
@@ -18,7 +18,11 @@ export const addFlatEntityToFlatEntityMapsOrThrow = <
flatEntity,
flatEntityMaps,
}: AddFlatEntityToFlatEntityMapsOrThrowArgs<T>): FlatEntityMaps<T> => {
if (isDefined(flatEntityMaps.byId[flatEntity.id])) {
if (
isDefined(
flatEntityMaps.byUniversalIdentifier[flatEntity.universalIdentifier],
)
) {
throw new FlatEntityMapsException(
'addFlatEntityToFlatEntityMapsOrThrow: flat entity to add already exists',
FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS,
@@ -26,13 +30,13 @@ export const addFlatEntityToFlatEntityMapsOrThrow = <
}
return {
byId: {
...flatEntityMaps.byId,
[flatEntity.id]: flatEntity,
byUniversalIdentifier: {
...flatEntityMaps.byUniversalIdentifier,
[flatEntity.universalIdentifier]: flatEntity,
},
idByUniversalIdentifier: {
...flatEntityMaps.idByUniversalIdentifier,
[flatEntity.universalIdentifier]: flatEntity.id,
universalIdentifierById: {
...flatEntityMaps.universalIdentifierById,
[flatEntity.id]: flatEntity.universalIdentifier,
},
universalIdentifiersByApplicationId: {
...flatEntityMaps.universalIdentifiersByApplicationId,
@@ -4,7 +4,7 @@ import { type FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
export type ComputeFlatEntityMapsFromToArgs<T extends AllMetadataName> = {
@@ -21,7 +21,7 @@ export const computeFlatEntityMapsFromTo = <T extends AllMetadataName>({
} => {
const fromFlatEntityMaps =
flatEntityToDelete.length > 0
? getSubFlatEntityMapsOrThrow({
? getSubFlatEntityByIdsMapsOrThrow({
flatEntityIds: [...flatEntityToDelete, ...flatEntityToUpdate].map(
({ id }) => id,
),
@@ -21,16 +21,19 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
flatEntityMaps,
entityToDeleteId,
}: DeleteFlatEntityFromFlatEntityMapsOrThrowArgs<T>): FlatEntityMaps<T> => {
if (!isDefined(flatEntityMaps.byId[entityToDeleteId])) {
const universalIdentifierToDelete =
flatEntityMaps.universalIdentifierById[entityToDeleteId];
if (!isDefined(universalIdentifierToDelete)) {
throw new FlatEntityMapsException(
'deleteFlatEntityFromFlatEntityMapsOrThrow: entity to delete not found',
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const updatedIdByUniversalIdentifierEntries = Object.entries(
flatEntityMaps.idByUniversalIdentifier,
).filter(([_universalIdentifier, id]) => id !== entityToDeleteId);
const updatedUniversalIdentifierByIdEntries = Object.entries(
flatEntityMaps.universalIdentifierById,
).filter(([id]) => id !== entityToDeleteId);
const updatedUniversalIdentifiersByApplicationIdEntries = Object.entries(
flatEntityMaps.universalIdentifiersByApplicationId,
@@ -38,10 +41,7 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
.map(([applicationId, universalIdentifiers]) => {
const stillPresentUniversalIdentifiers = universalIdentifiers?.filter(
(universalIdentifier) =>
updatedIdByUniversalIdentifierEntries.some(
([existingUniversalIdentifier]) =>
existingUniversalIdentifier === universalIdentifier,
),
universalIdentifier !== universalIdentifierToDelete,
);
if (
@@ -56,9 +56,12 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
.filter(isDefined);
return {
byId: removePropertiesFromRecord(flatEntityMaps.byId, [entityToDeleteId]),
idByUniversalIdentifier: Object.fromEntries(
updatedIdByUniversalIdentifierEntries,
byUniversalIdentifier: removePropertiesFromRecord(
flatEntityMaps.byUniversalIdentifier,
[universalIdentifierToDelete],
),
universalIdentifierById: Object.fromEntries(
updatedUniversalIdentifierByIdEntries,
),
universalIdentifiersByApplicationId: Object.fromEntries(
updatedUniversalIdentifiersByApplicationIdEntries,
@@ -19,13 +19,7 @@ export const findFlatEntitiesByApplicationId = <T extends SyncableFlatEntity>({
return universalIdentifiers
.map((universalId) => {
const id = flatEntityMaps.idByUniversalIdentifier[universalId];
if (!isDefined(id)) {
return undefined;
}
const entity = flatEntityMaps.byId[id];
const entity = flatEntityMaps.byUniversalIdentifier[universalId];
if (!isDefined(entity)) {
return undefined;
@@ -20,7 +20,17 @@ export const findFlatEntityByIdInFlatEntityMapsOrThrow = <
flatEntityMaps,
flatEntityId,
}: FindFlatEntityByIdInFlatEntityMapsOrThrowArgs<T>): T => {
const flatEntity = flatEntityMaps.byId[flatEntityId];
const universalIdentifier =
flatEntityMaps.universalIdentifierById[flatEntityId];
if (!isDefined(universalIdentifier)) {
throw new FlatEntityMapsException(
t`Could not find flat entity in maps`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const flatEntity = flatEntityMaps.byUniversalIdentifier[universalIdentifier];
if (!isDefined(flatEntity)) {
throw new FlatEntityMapsException(
@@ -1,5 +1,3 @@
import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
@@ -11,20 +9,6 @@ export const findFlatEntityByUniversalIdentifier = <
}: {
flatEntityMaps: FlatEntityMaps<T>;
universalIdentifier: string;
}): (T & { id: string }) | undefined => {
const flatEntityId =
flatEntityMaps.idByUniversalIdentifier[universalIdentifier];
if (!isDefined(flatEntityId)) {
return;
}
const result = flatEntityMaps.byId[flatEntityId];
return isDefined(result)
? {
...result,
id: flatEntityId,
}
: undefined;
}): T | undefined => {
return flatEntityMaps.byUniversalIdentifier[universalIdentifier];
};
@@ -2,7 +2,7 @@ import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
export type FindManyFlatEntityByIdInFlatEntityMapsOrThrowArgs<
T extends SyncableFlatEntity,
@@ -16,10 +16,12 @@ export const findManyFlatEntityByIdInFlatEntityMapsOrThrow = <
flatEntityMaps,
flatEntityIds,
}: FindManyFlatEntityByIdInFlatEntityMapsOrThrowArgs<T>): T[] => {
const subFlatEntityMaps = getSubFlatEntityMapsOrThrow<T>({
const subFlatEntityMaps = getSubFlatEntityByIdsMapsOrThrow<T>({
flatEntityIds,
flatEntityMaps,
});
return Object.values(subFlatEntityMaps.byId).filter(isDefined);
return Object.values(subFlatEntityMaps.byUniversalIdentifier).filter(
isDefined,
);
};
@@ -0,0 +1,28 @@
import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
export type FindManyFlatEntityByIdInFlatEntityMapsArgs<
T extends SyncableFlatEntity,
> = {
flatEntityMaps: FlatEntityMaps<T>;
flatEntityIds: string[];
};
export const findManyFlatEntityByIdInFlatEntityMaps = <
T extends SyncableFlatEntity,
>({
flatEntityMaps,
flatEntityIds,
}: FindManyFlatEntityByIdInFlatEntityMapsArgs<T>): T[] => {
return flatEntityIds
.map((flatEntityId) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId,
flatEntityMaps,
}),
)
.filter(isDefined);
};
@@ -4,7 +4,7 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/typ
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
export const getSubFlatEntityMapsOrThrow = <T extends SyncableFlatEntity>({
export const getSubFlatEntityByIdsMapsOrThrow = <T extends SyncableFlatEntity>({
flatEntityIds,
flatEntityMaps,
}: {
@@ -1,7 +1,7 @@
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
export const getSubFlatEntityMapsByApplicationIdOrThrow = <
T extends SyncableFlatEntity,
@@ -17,7 +17,7 @@ export const getSubFlatEntityMapsByApplicationIdOrThrow = <
flatEntityMaps,
});
return getSubFlatEntityMapsOrThrow({
return getSubFlatEntityByIdsMapsOrThrow({
flatEntityIds: allApplicationFlatEntity.map((flatEntity) => flatEntity.id),
flatEntityMaps,
});
@@ -7,6 +7,7 @@ import { computeMorphRelationFieldName, isDefined } from 'twenty-shared/utils';
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -74,7 +75,10 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({
fieldMetadataToUpdate.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? flatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
morphRelationsUpdatePayload.forEach((morphRelationUpdatePayload) => {
@@ -6,6 +6,7 @@ import {
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -22,7 +23,12 @@ export const findAllOthersMorphRelationFlatFieldMetadatasOrThrow = ({
flatFieldMetadata: morphRelationFlatFieldMetadata,
}: FindAllMorphRelationFlatFieldMetadatasOrThrowArgs): FlatFieldMetadata<FieldMetadataType.MORPH_RELATION>[] => {
if (
!isDefined(flatFieldMetadataMaps.byId[morphRelationFlatFieldMetadata.id])
!isDefined(
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: morphRelationFlatFieldMetadata.id,
flatEntityMaps: flatFieldMetadataMaps,
}),
)
) {
throw new FlatEntityMapsException(
'Morph relation field not found in flat field metadata maps',
@@ -6,6 +6,7 @@ import {
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
@@ -20,8 +21,10 @@ export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata<MorphOrRelationFieldMetadataType> => {
const { relationTargetFieldMetadataId } = flatFieldMetadata;
const relatedFlatFieldMetadata =
flatFieldMetadataMaps.byId[relationTargetFieldMetadataId];
const relatedFlatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(relatedFlatFieldMetadata)) {
throw new FieldMetadataException(
@@ -15,6 +15,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { generateRatingOptions } from 'src/engine/metadata-modules/field-metadata/utils/generate-rating-optionts.util';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { fromMorphRelationCreateFieldInputToFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util';
@@ -58,8 +59,10 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({
rawCreateFieldInput,
['description', 'icon', 'label', 'name', 'objectMetadataId', 'type'],
);
const parentFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[createFieldInput.objectMetadataId];
const parentFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: createFieldInput.objectMetadataId,
flatEntityMaps: existingFlatObjectMetadataMaps,
});
if (!isDefined(parentFlatObjectMetadata)) {
return {
@@ -77,9 +77,9 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({
];
const flatIndexMap = new Map<string, FlatIndexMetadata>();
const allFlatIndexes = Object.values(existingFlatIndexMaps.byId).filter(
isDefined,
);
const allFlatIndexes = Object.values(
existingFlatIndexMaps.byUniversalIdentifier,
).filter(isDefined);
for (const flatFieldMetadata of flatFieldMetadatasToDelete) {
allFlatIndexes.forEach((flatIndex) => {
@@ -8,6 +8,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -74,7 +75,10 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({
createFieldInput.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? existingFlatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: existingFlatFieldMetadataMaps,
})
: undefined;
const morphRelationCreationPayload =
@@ -7,6 +7,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -68,7 +69,10 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({
createFieldInput.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? existingFlatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: existingFlatFieldMetadataMaps,
})
: undefined;
const generateResult = generateMorphOrRelationFlatFieldMetadataPair({
@@ -115,7 +115,12 @@ export const validateMorphOrRelationFlatFieldMetadata = ({
});
const targetFlatFieldMetadata =
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
(remainingFlatEntityMapsToValidate
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: remainingFlatEntityMapsToValidate,
})
: undefined) ??
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
@@ -24,7 +24,12 @@ export const validateMorphRelationFlatFieldMetadata = (
errors.push(...validateMorphOrRelationFlatFieldMetadata(args));
const targetFlatFieldMetadata =
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
(remainingFlatEntityMapsToValidate
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: remainingFlatEntityMapsToValidate,
})
: undefined) ??
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
@@ -11,6 +11,7 @@ import {
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { validateRelationCreationPayloadOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/validate-relation-creation-payload-or-throw.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -53,10 +54,10 @@ export const validateRelationCreationPayload = async ({
}
}
const targetFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[
relationCreationPayload.targetObjectMetadataId
];
const targetFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationCreationPayload.targetObjectMetadataId,
flatEntityMaps: existingFlatObjectMetadataMaps,
});
if (!isDefined(targetFlatObjectMetadata)) {
return {
@@ -12,15 +12,15 @@ export const buildObjectIdByNameMaps = (
const idByNameSingular: Record<string, string> = {};
const idByNamePlural: Record<string, string> = {};
for (const [objectId, objectMetadata] of Object.entries(
flatObjectMetadataMaps.byId,
for (const objectMetadata of Object.values(
flatObjectMetadataMaps.byUniversalIdentifier,
)) {
if (!isDefined(objectMetadata)) {
continue;
}
idByNameSingular[objectMetadata.nameSingular] = objectId;
idByNamePlural[objectMetadata.namePlural] = objectId;
idByNameSingular[objectMetadata.nameSingular] = objectMetadata.id;
idByNamePlural[objectMetadata.namePlural] = objectMetadata.id;
}
return { idByNameSingular, idByNamePlural };
@@ -78,7 +78,9 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({
);
// TODO We should maintain a idsByObjectMetadataId in the flatIndexMaps
const flatIndexMetadataToDelete = Object.values(flatIndexMaps.byId).filter(
const flatIndexMetadataToDelete = Object.values(
flatIndexMaps.byUniversalIdentifier,
).filter(
(flatIndex): flatIndex is FlatIndexMetadata =>
isDefined(flatIndex) &&
flatIndex.objectMetadataId === flatObjectMetadataToDelete.id,
@@ -23,7 +23,7 @@ export const doesOtherObjectWithSameNameExists = ({
objectMetadataNameSingular,
existingObjectMetadataId,
}: ValidateNoOtherObjectWithSameNameExistsOrThrowsParams) =>
Object.values(objectMetadataMaps.byId)
Object.values(objectMetadataMaps.byUniversalIdentifier)
.filter(isDefined)
.some(
(objectMetadata) =>
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
import {
PageLayoutTabException,
@@ -27,8 +28,12 @@ export const fromDestroyPageLayoutTabInputToFlatPageLayoutTabOrThrow = ({
['id'],
);
const existingFlatPageLayoutTabToDestroy =
flatPageLayoutTabMaps.byId[pageLayoutTabId];
const existingFlatPageLayoutTabToDestroy = findFlatEntityByIdInFlatEntityMaps(
{
flatEntityId: pageLayoutTabId,
flatEntityMaps: flatPageLayoutTabMaps,
},
);
if (!isDefined(existingFlatPageLayoutTabToDestroy)) {
throw new PageLayoutTabException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
import { type UpdatePageLayoutTabInput } from 'src/engine/metadata-modules/page-layout-tab/dtos/inputs/update-page-layout-tab.input';
@@ -31,8 +32,10 @@ export const fromUpdatePageLayoutTabInputToFlatPageLayoutTabToUpdateOrThrow = ({
['id'],
);
const existingFlatPageLayoutTabToUpdate =
flatPageLayoutTabMaps.byId[pageLayoutTabToUpdateId];
const existingFlatPageLayoutTabToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutTabToUpdateId,
flatEntityMaps: flatPageLayoutTabMaps,
});
if (!isDefined(existingFlatPageLayoutTabToUpdate)) {
throw new PageLayoutTabException(
@@ -15,7 +15,9 @@ export const reconstructFlatPageLayoutTabWithWidgets = ({
tab: FlatPageLayoutTab;
flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps;
}): FlatPageLayoutTabWithWidgets => {
const widgets = Object.values(flatPageLayoutWidgetMaps.byId).filter(
const widgets = Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
).filter(
(widget): widget is FlatPageLayoutWidget =>
isDefined(widget) &&
widget.pageLayoutTabId === tab.id &&
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
import { type DestroyPageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/destroy-page-layout-widget.input';
import {
@@ -25,7 +26,10 @@ export const fromDestroyPageLayoutWidgetInputToFlatPageLayoutWidgetOrThrow = ({
);
const existingFlatPageLayoutWidgetToDestroy =
flatPageLayoutWidgetMaps.byId[pageLayoutWidgetId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutWidgetId,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingFlatPageLayoutWidgetToDestroy)) {
throw new PageLayoutWidgetException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
import { type UpdatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/update-page-layout-widget.input';
@@ -34,7 +35,10 @@ export const fromUpdatePageLayoutWidgetInputToFlatPageLayoutWidgetToUpdateOrThro
]);
const existingFlatPageLayoutWidgetToUpdate =
flatPageLayoutWidgetMaps.byId[pageLayoutWidgetToUpdateId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutWidgetToUpdateId,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingFlatPageLayoutWidgetToUpdate)) {
throw new PageLayoutWidgetException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutMaps } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type';
import {
PageLayoutException,
@@ -27,7 +28,10 @@ export const fromDestroyPageLayoutInputToFlatPageLayoutOrThrow = ({
['id'],
);
const existingFlatPageLayoutToDestroy = flatPageLayoutMaps.byId[pageLayoutId];
const existingFlatPageLayoutToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutId,
flatEntityMaps: flatPageLayoutMaps,
});
if (!isDefined(existingFlatPageLayoutToDestroy)) {
throw new PageLayoutException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutMaps } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout-maps.type';
import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type';
import { type UpdatePageLayoutInput } from 'src/engine/metadata-modules/page-layout/dtos/inputs/update-page-layout.input';
@@ -31,8 +32,10 @@ export const fromUpdatePageLayoutInputToFlatPageLayoutToUpdateOrThrow = ({
['id'],
);
const existingFlatPageLayoutToUpdate =
flatPageLayoutMaps.byId[pageLayoutToUpdateId];
const existingFlatPageLayoutToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutToUpdateId,
flatEntityMaps: flatPageLayoutMaps,
});
if (!isDefined(existingFlatPageLayoutToUpdate)) {
throw new PageLayoutException(
@@ -23,7 +23,7 @@ export const reconstructFlatPageLayoutWithTabsAndWidgets = ({
flatPageLayoutTabMaps: FlatPageLayoutTabMaps;
flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps;
}): FlatPageLayoutWithTabsAndWidgets => {
const tabs = Object.values(flatPageLayoutTabMaps.byId)
const tabs = Object.values(flatPageLayoutTabMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(tab) => tab.pageLayoutId === layout.id && !isDefined(tab.deletedAt),
@@ -31,7 +31,9 @@ export const reconstructFlatPageLayoutWithTabsAndWidgets = ({
.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
const tabsWithWidgets: FlatPageLayoutTabWithWidgets[] = tabs.map((tab) => {
const widgets = Object.values(flatPageLayoutWidgetMaps.byId)
const widgets = Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
(widget) =>
@@ -13,9 +13,9 @@ export const findFlatRoleTargetFromForeignKey = ({
targetMetadataForeignKey,
targetId,
}: FindAllFlatRoleTargetOfArgs): FlatRoleTarget | undefined => {
const allRoleTargets = Object.values(flatRoleTargetMaps.byId).filter(
isDefined,
);
const allRoleTargets = Object.values(
flatRoleTargetMaps.byUniversalIdentifier,
).filter(isDefined);
return allRoleTargets.find(
(roleTarget) => roleTarget[targetMetadataForeignKey] === targetId,
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type DeleteViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/delete-view-field.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewFieldInputToFlatViewFieldOrThrow = ({
['id'],
);
const existingFlatViewFieldToDelete = flatViewFieldMaps.byId[viewFieldId];
const existingFlatViewFieldToDelete = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToDelete)) {
throw new ViewFieldException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type DestroyViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/destroy-view-field.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewFieldInputToFlatViewFieldOrThrow = ({
['id'],
);
const existingFlatViewFieldToDestroy = flatViewFieldMaps.byId[viewFieldId];
const existingFlatViewFieldToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToDestroy)) {
throw new ViewFieldException(
@@ -6,6 +6,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_VIEW_FIELD_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type UpdateViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/update-view-field.input';
@@ -28,8 +29,10 @@ export const fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow = ({
['id'],
);
const existingFlatViewFieldToUpdate =
flatViewFieldMaps.byId[viewFieldToUpdateId];
const existingFlatViewFieldToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldToUpdateId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToUpdate)) {
throw new ViewFieldException(
@@ -4,6 +4,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type DeleteViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/delete-view-filter-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({
);
const existingFlatViewFilterGroupToDelete =
flatViewFilterGroupMaps.byId[viewFilterGroupId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToDelete)) {
throw new ViewFilterGroupException(
@@ -4,6 +4,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type DestroyViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/destroy-view-filter-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({
);
const existingFlatViewFilterGroupToDestroy =
flatViewFilterGroupMaps.byId[viewFilterGroupId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToDestroy)) {
throw new ViewFilterGroupException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type UpdateViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/update-view-filter-group.input';
@@ -29,7 +30,10 @@ export const fromUpdateViewFilterGroupInputToFlatViewFilterGroupToUpdateOrThrow
);
const existingFlatViewFilterGroupToUpdate =
flatViewFilterGroupMaps.byId[viewFilterGroupToUpdateId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupToUpdateId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToUpdate)) {
throw new ViewFilterGroupException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { type DeleteViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/delete-view-filter.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewFilterInputToFlatViewFilterOrThrow = ({
['id'],
);
const existingFlatViewFilterToDelete = flatViewFilterMaps.byId[viewFilterId];
const existingFlatViewFilterToDelete = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterId,
flatEntityMaps: flatViewFilterMaps,
});
if (!isDefined(existingFlatViewFilterToDelete)) {
throw new ViewFilterException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { type DestroyViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/destroy-view-filter.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewFilterInputToFlatViewFilterOrThrow = ({
['id'],
);
const existingFlatViewFilterToDestroy = flatViewFilterMaps.byId[viewFilterId];
const existingFlatViewFilterToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterId,
flatEntityMaps: flatViewFilterMaps,
});
if (!isDefined(existingFlatViewFilterToDestroy)) {
throw new ViewFilterException(
@@ -6,6 +6,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_VIEW_FILTER_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter/constants/flat-view-filter-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type';
import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type';
import { type UpdateViewFilterInput } from 'src/engine/metadata-modules/view-filter/dtos/inputs/update-view-filter.input';
@@ -28,8 +29,10 @@ export const fromUpdateViewFilterInputToFlatViewFilterToUpdateOrThrow = ({
['id'],
);
const existingFlatViewFilterToUpdate =
flatViewFilterMaps.byId[viewFilterToUpdateId];
const existingFlatViewFilterToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterToUpdateId,
flatEntityMaps: flatViewFilterMaps,
});
if (!isDefined(existingFlatViewFilterToUpdate)) {
throw new ViewFilterException(
@@ -7,6 +7,7 @@ import {
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type';
type ComputeFlatViewGroupsOnViewCreateArgs = {
@@ -19,8 +20,10 @@ export const computeFlatViewGroupsOnViewCreate = ({
mainGroupByFieldMetadataId,
flatFieldMetadataMaps,
}: ComputeFlatViewGroupsOnViewCreateArgs): FlatViewGroup[] => {
const mainGroupByFieldMetadata =
flatFieldMetadataMaps.byId[mainGroupByFieldMetadataId];
const mainGroupByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mainGroupByFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(mainGroupByFieldMetadata)) {
throw new FlatEntityMapsException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type';
import { type DeleteViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/delete-view-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewGroupInputToFlatViewGroupOrThrow = ({
['id'],
);
const existingFlatViewGroupToDelete = flatViewGroupMaps.byId[viewGroupId];
const existingFlatViewGroupToDelete = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewGroupId,
flatEntityMaps: flatViewGroupMaps,
});
if (!isDefined(existingFlatViewGroupToDelete)) {
throw new ViewGroupException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type';
import { type DestroyViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/destroy-view-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewGroupInputToFlatViewGroupOrThrow = ({
['id'],
);
const existingFlatViewGroupToDestroy = flatViewGroupMaps.byId[viewGroupId];
const existingFlatViewGroupToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewGroupId,
flatEntityMaps: flatViewGroupMaps,
});
if (!isDefined(existingFlatViewGroupToDestroy)) {
throw new ViewGroupException(
@@ -7,6 +7,7 @@ import {
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { FLAT_VIEW_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type';
import { type UpdateViewGroupInput } from 'src/engine/metadata-modules/view-group/dtos/inputs/update-view-group.input';
import {
@@ -28,8 +29,10 @@ export const fromUpdateViewGroupInputToFlatViewGroupToUpdateOrThrow = ({
['id'],
);
const existingFlatViewGroupToUpdate =
flatViewGroupMaps.byId[viewGroupToUpdateId];
const existingFlatViewGroupToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewGroupToUpdateId,
flatEntityMaps: flatViewGroupMaps,
});
if (!isDefined(existingFlatViewGroupToUpdate)) {
throw new ViewGroupException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
import { type DeleteViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/delete-view.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewInputToFlatViewOrThrow = ({
['id'],
);
const existingFlatViewToDelete = flatViewMaps.byId[viewId];
const existingFlatViewToDelete = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewId,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(existingFlatViewToDelete)) {
throw new ViewException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
import { type DestroyViewInput } from 'src/engine/metadata-modules/view/dtos/inputs/destroy-view.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewInputToFlatViewOrThrow = ({
['id'],
);
const existingFlatViewToDestroy = flatViewMaps.byId[viewId];
const existingFlatViewToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewId,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(existingFlatViewToDestroy)) {
throw new ViewException(
@@ -6,6 +6,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type';
import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type';
@@ -43,7 +44,10 @@ export const fromUpdateViewInputToFlatViewToUpdateOrThrow = ({
['id'],
);
const existingFlatViewToUpdate = flatViewMaps.byId[viewToUpdateId];
const existingFlatViewToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewToUpdateId,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(existingFlatViewToUpdate)) {
throw new ViewException(
@@ -37,7 +37,7 @@ export class FrontComponentService {
},
);
return Object.values(flatFrontComponentMaps.byId)
return Object.values(flatFrontComponentMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.name.localeCompare(b.name))
.map(fromFlatFrontComponentToFrontComponentDto);
@@ -87,7 +87,7 @@ export class LogicFunctionResolver {
},
);
return Object.values(flatLogicFunctionMaps.byId)
return Object.values(flatLogicFunctionMaps.byUniversalIdentifier)
.filter(
(flatLogicFunction): flatLogicFunction is FlatLogicFunction =>
isDefined(flatLogicFunction) &&
@@ -9,6 +9,7 @@ import { FileStorageService } from 'src/engine/core-modules/file-storage/file-st
import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util';
import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import type { CreateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/create-logic-function.input';
import type { UpdateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/update-logic-function.input';
@@ -223,7 +224,10 @@ export class LogicFunctionService {
},
);
const existingFlatLogicFunction = existingFlatLogicFunctionMaps.byId[id];
const existingFlatLogicFunction = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: existingFlatLogicFunctionMaps,
});
if (!isDefined(existingFlatLogicFunction)) {
throw new LogicFunctionException(
@@ -64,7 +64,7 @@ export class NavigationMenuItemService {
},
);
return Object.values(flatNavigationMenuItemMaps.byId)
return Object.values(flatNavigationMenuItemMaps.byUniversalIdentifier)
.filter(
(item): item is NonNullable<typeof item> =>
isDefined(item) &&
@@ -424,7 +424,10 @@ export class NavigationMenuItemService {
},
);
const objectMetadata = flatObjectMetadataMaps.byId[targetObjectMetadataId];
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: targetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(objectMetadata)) {
return null;
@@ -36,7 +36,7 @@ export class NavigationMenuItemDeletionService {
const deletedRecordIdsSet = new Set(deletedRecordIds);
const navigationMenuItemsToDelete = Object.values(
flatNavigationMenuItemMaps.byId,
flatNavigationMenuItemMaps.byUniversalIdentifier,
).filter(
(item): item is NonNullable<typeof item> =>
isDefined(item) &&
@@ -12,6 +12,7 @@ import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadat
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-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 { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
@@ -156,8 +157,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
},
);
const updatedFlatObjectMetadata =
recomputedFlatObjectMetadataMaps.byId[flatObjectMetadataToUpdate.id];
const updatedFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatObjectMetadataToUpdate.id,
flatEntityMaps: recomputedFlatObjectMetadataMaps,
});
if (!isDefined(updatedFlatObjectMetadata)) {
throw new ObjectMetadataException(
@@ -461,8 +464,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
},
);
const createdFlatObjectMetadata =
recomputedFlatObjectMetadataMaps.byId[flatObjectMetadataToCreate.id];
const createdFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatObjectMetadataToCreate.id,
flatEntityMaps: recomputedFlatObjectMetadataMaps,
});
if (!isDefined(createdFlatObjectMetadata)) {
throw new ObjectMetadataException(
@@ -584,10 +589,12 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
},
);
const deleteObjectInputs = Object.values(flatObjectMetadataMaps.byId)
const deleteObjectInputs = Object.keys(
flatObjectMetadataMaps.universalIdentifierById,
)
.filter(isDefined)
.map<DeleteOneObjectInput>((flatObjectMetadata) => ({
id: flatObjectMetadata.id,
.map<DeleteOneObjectInput>((id) => ({
id,
}));
await this.deleteManyObjectMetadatas({
@@ -71,7 +71,7 @@ export const buildDefaultRelationFlatFieldMetadatasForCustomObject = ({
flatApplication,
}: BuildDefaultRelationFieldsForCustomObjectArgs): SourceAndTargetFlatFieldMetadatasRecord => {
const objectIdByNameSingular = Object.values(
existingFlatObjectMetadataMaps.byId,
existingFlatObjectMetadataMaps.byUniversalIdentifier,
).reduce<Record<string, string>>((acc, flatObject) => {
if (!isDefined(flatObject)) {
return acc;
@@ -110,7 +110,7 @@ describe('ObjectPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {
byUniversalIdentifier: {
[systemObjectMetadataId]: {
id: systemObjectMetadataId,
isSystem: true,
@@ -122,7 +122,9 @@ describe('ObjectPermissionService', () => {
applicationId: null,
} as any,
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[systemObjectMetadataId]: systemObjectMetadataId,
},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -167,7 +169,7 @@ describe('ObjectPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {
byUniversalIdentifier: {
[customObjectMetadataId]: {
id: customObjectMetadataId,
isSystem: false,
@@ -179,7 +181,9 @@ describe('ObjectPermissionService', () => {
applicationId: null,
} as any,
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[customObjectMetadataId]: customObjectMetadataId,
},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -254,8 +258,8 @@ describe('ObjectPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -150,7 +150,7 @@ describe('FieldPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {
byUniversalIdentifier: {
[testObjectMetadataId]: {
...objectMetadataItemMock,
id: testObjectMetadataId,
@@ -170,15 +170,22 @@ describe('FieldPermissionService', () => {
applicationId: null,
} as any,
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[testObjectMetadataId]: testObjectMetadataId,
[fieldRelationMock.objectMetadataId]:
fieldRelationMock.objectMetadataId,
},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {
[testFieldMetadataId]: testFieldMetadata as any,
[fieldRelationMock.id]: fieldRelationMock as any,
byUniversalIdentifier: {
[testFieldMetadata.universalIdentifier]: testFieldMetadata as any,
[fieldRelationMock.universalIdentifier]: fieldRelationMock as any,
},
universalIdentifierById: {
[testFieldMetadataId]: testFieldMetadata.universalIdentifier,
[fieldRelationMock.id]: fieldRelationMock.universalIdentifier,
},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -398,13 +405,13 @@ describe('FieldPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -440,7 +447,7 @@ describe('FieldPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {
byUniversalIdentifier: {
[testObjectMetadataId]: {
...systemObjectMetadata,
id: testObjectMetadataId,
@@ -451,12 +458,14 @@ describe('FieldPermissionService', () => {
applicationId: null,
} as any,
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[testObjectMetadataId]: testObjectMetadataId,
},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -486,7 +495,7 @@ describe('FieldPermissionService', () => {
workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps.mockResolvedValue(
{
flatObjectMetadataMaps: {
byId: {
byUniversalIdentifier: {
[testObjectMetadataId]: {
...objectMetadataItemMock,
id: testObjectMetadataId,
@@ -497,12 +506,14 @@ describe('FieldPermissionService', () => {
applicationId: null,
} as any,
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[testObjectMetadataId]: testObjectMetadataId,
},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
} as any,
@@ -15,6 +15,7 @@ import {
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { isFieldMetadataTypeRelation } from 'src/engine/metadata-modules/field-metadata/utils/is-field-metadata-type-relation.util';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -220,8 +221,10 @@ export class FieldPermissionService {
);
}
const flatObjectMetadata =
flatObjectMetadataMaps.byId[fieldPermission.objectMetadataId];
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldPermission.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
throw new PermissionsException(
@@ -243,8 +246,10 @@ export class FieldPermissionService {
);
}
const flatFieldMetadata =
flatFieldMetadataMaps.byId[fieldPermission.fieldMetadataId];
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldPermission.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(flatFieldMetadata)) {
throw new PermissionsException(
@@ -5,6 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { In, Repository } from 'typeorm';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import {
type ObjectPermissionInput,
@@ -63,7 +64,10 @@ export class ObjectPermissionService {
input.objectPermissions.forEach((objectPermission) => {
const objectMetadataForObjectPermission =
flatObjectMetadataMaps.byId[objectPermission.objectMetadataId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectPermission.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(objectMetadataForObjectPermission)) {
throw new PermissionsException(
@@ -4,6 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { fromCreatePageLayoutTabInputToFlatPageLayoutTabToCreate } from 'src/engine/metadata-modules/flat-page-layout-tab/utils/from-create-page-layout-tab-input-to-flat-page-layout-tab-to-create.util';
@@ -48,7 +49,7 @@ export class PageLayoutTabService {
const { flatPageLayoutTabMaps, flatPageLayoutWidgetMaps } =
await this.getPageLayoutTabFlatEntityMaps(workspaceId);
return Object.values(flatPageLayoutTabMaps.byId)
return Object.values(flatPageLayoutTabMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(tab) => tab.pageLayoutId === pageLayoutId && !isDefined(tab.deletedAt),
@@ -74,7 +75,10 @@ export class PageLayoutTabService {
const { flatPageLayoutTabMaps, flatPageLayoutWidgetMaps } =
await this.getPageLayoutTabFlatEntityMaps(workspaceId);
const flatTab = flatPageLayoutTabMaps.byId[id];
const flatTab = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatPageLayoutTabMaps,
});
if (!isDefined(flatTab) || isDefined(flatTab.deletedAt)) {
throw new PageLayoutTabException(
@@ -4,6 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
import { FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
@@ -101,7 +102,7 @@ export class PageLayoutWidgetService {
const flatPageLayoutWidgetMaps =
await this.getFlatPageLayoutWidgetMaps(workspaceId);
return Object.values(flatPageLayoutWidgetMaps.byId)
return Object.values(flatPageLayoutWidgetMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(widget) =>
@@ -126,7 +127,10 @@ export class PageLayoutWidgetService {
const flatPageLayoutWidgetMaps =
await this.getFlatPageLayoutWidgetMaps(workspaceId);
const flatWidget = flatPageLayoutWidgetMaps.byId[id];
const flatWidget = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(flatWidget) || isDefined(flatWidget.deletedAt)) {
throw new PageLayoutWidgetException(
@@ -245,7 +249,10 @@ export class PageLayoutWidgetService {
id: string,
flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps,
): FlatPageLayoutWidget {
const existingWidget = flatPageLayoutWidgetMaps.byId[id];
const existingWidget = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingWidget) || isDefined(existingWidget.deletedAt)) {
throw new PageLayoutWidgetException(
@@ -5,6 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.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 { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
import { fromCreatePageLayoutTabInputToFlatPageLayoutTabToCreate } from 'src/engine/metadata-modules/flat-page-layout-tab/utils/from-create-page-layout-tab-input-to-flat-page-layout-tab-to-create.util';
@@ -166,7 +167,10 @@ export class PageLayoutDuplicationService {
pageLayoutId: string,
flatPageLayoutMaps: FlatPageLayoutMaps,
): FlatPageLayout {
const flatLayout = flatPageLayoutMaps.byId[pageLayoutId];
const flatLayout = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutId,
flatEntityMaps: flatPageLayoutMaps,
});
if (!isDefined(flatLayout) || isDefined(flatLayout.deletedAt)) {
throw new PageLayoutException(
@@ -188,7 +192,9 @@ export class PageLayoutDuplicationService {
): { tab: FlatPageLayoutTab; widgets: FlatPageLayoutWidget[] }[] {
const widgetsByTabId = new Map<string, FlatPageLayoutWidget[]>();
for (const widget of Object.values(flatPageLayoutWidgetMaps.byId)) {
for (const widget of Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
)) {
if (!isDefined(widget) || isDefined(widget.deletedAt)) {
continue;
}
@@ -199,7 +205,7 @@ export class PageLayoutDuplicationService {
widgetsByTabId.set(widget.pageLayoutTabId, existingWidgets);
}
const tabs = Object.values(flatPageLayoutTabMaps.byId)
const tabs = Object.values(flatPageLayoutTabMaps.byUniversalIdentifier)
.filter(
(tab): tab is FlatPageLayoutTab =>
isDefined(tab) &&
@@ -7,6 +7,7 @@ import { v4 } from 'uuid';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.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 { FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
@@ -66,7 +67,10 @@ export class PageLayoutUpdateService {
},
);
const existingPageLayout = flatPageLayoutMaps.byId[id];
const existingPageLayout = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatPageLayoutMaps,
});
// TODO move in validator
if (
@@ -203,7 +207,9 @@ export class PageLayoutUpdateService {
tabsToUpdate: FlatPageLayoutTab[];
tabsToDelete: FlatPageLayoutTab[];
} {
const existingTabs = Object.values(flatPageLayoutTabMaps.byId)
const existingTabs = Object.values(
flatPageLayoutTabMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((tab) => tab.pageLayoutId === existingPageLayout.id);
@@ -279,7 +285,10 @@ export class PageLayoutUpdateService {
const tabsToDelete: FlatPageLayoutTab[] = idsToDelete
.map((tabId) => {
const existingTab = flatPageLayoutTabMaps.byId[tabId];
const existingTab = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: tabId,
flatEntityMaps: flatPageLayoutTabMaps,
});
if (!isDefined(existingTab)) {
return null;
@@ -359,7 +368,9 @@ export class PageLayoutUpdateService {
widgetsToCreate: FlatPageLayoutWidget[];
widgetsToUpdate: FlatPageLayoutWidget[];
} {
const existingWidgets = Object.values(flatPageLayoutWidgetMaps.byId)
const existingWidgets = Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((widget) => widget.pageLayoutTabId === tabId);
@@ -447,7 +458,10 @@ export class PageLayoutUpdateService {
const widgetsToDelete: FlatPageLayoutWidget[] = idsToDelete
.map((widgetId) => {
const existingWidget = flatPageLayoutWidgetMaps.byId[widgetId];
const existingWidget = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: widgetId,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingWidget)) {
return null;
@@ -5,6 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
@@ -51,7 +52,9 @@ export class PageLayoutService {
flatPageLayoutWidgetMaps,
} = await this.getPageLayoutFlatEntityMaps(workspaceId);
const activeLayouts = Object.values(flatPageLayoutMaps.byId)
const activeLayouts = Object.values(
flatPageLayoutMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((layout) => !isDefined(layout.deletedAt));
@@ -79,7 +82,9 @@ export class PageLayoutService {
flatPageLayoutWidgetMaps,
} = await this.getPageLayoutFlatEntityMaps(workspaceId);
const activeLayouts = Object.values(flatPageLayoutMaps.byId)
const activeLayouts = Object.values(
flatPageLayoutMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
(layout) =>
@@ -111,7 +116,10 @@ export class PageLayoutService {
flatPageLayoutWidgetMaps,
} = await this.getPageLayoutFlatEntityMaps(workspaceId);
const flatLayout = flatPageLayoutMaps.byId[id];
const flatLayout = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatPageLayoutMaps,
});
const isLayoutNotFound =
!isDefined(flatLayout) || isDefined(flatLayout.deletedAt);
@@ -4,6 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type';
import { CreateRoleTargetInput } from 'src/engine/metadata-modules/role-target/types/create-role-target.input';
@@ -191,7 +192,10 @@ export class RoleTargetService {
},
);
const roleTarget = flatRoleTargetMaps.byId[id];
const roleTarget = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatRoleTargetMaps,
});
return roleTarget ?? null;
}
@@ -45,7 +45,9 @@ export class RowLevelPermissionPredicateGroupService {
},
);
return Object.values(flatRowLevelPermissionPredicateGroupMaps.byId)
return Object.values(
flatRowLevelPermissionPredicateGroupMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((group) => group.deletedAt === null)
.sort(
@@ -75,7 +77,9 @@ export class RowLevelPermissionPredicateGroupService {
},
);
return Object.values(flatRowLevelPermissionPredicateGroupMaps.byId)
return Object.values(
flatRowLevelPermissionPredicateGroupMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((group) => group.deletedAt === null && group.roleId === roleId)
.sort(
@@ -60,7 +60,9 @@ export class RowLevelPermissionPredicateService {
},
);
return Object.values(flatRowLevelPermissionPredicateMaps.byId)
return Object.values(
flatRowLevelPermissionPredicateMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((predicate) => predicate.deletedAt === null)
.sort(
@@ -91,7 +93,9 @@ export class RowLevelPermissionPredicateService {
},
);
return Object.values(flatRowLevelPermissionPredicateMaps.byId)
return Object.values(
flatRowLevelPermissionPredicateMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
(predicate) =>
@@ -173,7 +177,7 @@ export class RowLevelPermissionPredicateService {
);
const existingPredicates = Object.values(
flatRowLevelPermissionPredicateMaps.byId,
flatRowLevelPermissionPredicateMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
@@ -184,7 +188,7 @@ export class RowLevelPermissionPredicateService {
);
const existingGroups = Object.values(
flatRowLevelPermissionPredicateGroupMaps.byId,
flatRowLevelPermissionPredicateGroupMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
@@ -239,7 +243,9 @@ export class RowLevelPermissionPredicateService {
},
);
const resultPredicates = Object.values(updatedPredicateMaps.byId)
const resultPredicates = Object.values(
updatedPredicateMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
(predicate) =>
@@ -249,7 +255,7 @@ export class RowLevelPermissionPredicateService {
)
.map(fromFlatRowLevelPermissionPredicateToDto);
const resultGroups = Object.values(updatedGroupMaps.byId)
const resultGroups = Object.values(updatedGroupMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(group) =>
@@ -295,8 +301,10 @@ export class RowLevelPermissionPredicateService {
inputGroupIds.add(groupId);
const existingGroup =
flatRowLevelPermissionPredicateGroupMaps.byId[groupId];
const existingGroup = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: groupId,
flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps,
});
if (isDefined(existingGroup) && existingGroup.deletedAt === null) {
groupsToUpdate.push({
@@ -377,8 +385,10 @@ export class RowLevelPermissionPredicateService {
inputPredicateIds.add(predicateId);
const existingPredicate =
flatRowLevelPermissionPredicateMaps.byId[predicateId];
const existingPredicate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: predicateId,
flatEntityMaps: flatRowLevelPermissionPredicateMaps,
});
if (
isDefined(existingPredicate) &&
@@ -38,7 +38,7 @@ export class SkillService {
},
);
return Object.values(flatSkillMaps.byId)
return Object.values(flatSkillMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.label.localeCompare(b.label))
.map(fromFlatSkillToSkillDto);
@@ -237,7 +237,7 @@ export class SkillService {
},
);
return Object.values(flatSkillMaps.byId)
return Object.values(flatSkillMaps.byUniversalIdentifier)
.filter(isDefined)
.filter((flatSkill) => flatSkill.isActive)
.sort((a, b) => a.label.localeCompare(b.label));
@@ -259,7 +259,7 @@ export class SkillService {
},
);
return Object.values(flatSkillMaps.byId)
return Object.values(flatSkillMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(flatSkill) => names.includes(flatSkill.name) && flatSkill.isActive,
@@ -7,6 +7,7 @@ import { IsNull, Repository } from 'typeorm';
import { ApplicationService } from 'src/engine/core-modules/application/services/application.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 { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { fromCreateViewGroupInputToFlatViewGroupToCreate } from 'src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util';
import { fromDeleteViewGroupInputToFlatViewGroupOrThrow } from 'src/engine/metadata-modules/flat-view-group/utils/from-delete-view-group-input-to-flat-view-group-or-throw.util';
@@ -86,9 +87,10 @@ export class ViewGroupService {
const flatViewGroupsToCreate = createViewGroupInputs.map(
(createViewGroupInput) => {
const mainGroupByFieldMetadataId =
flatViewMaps.byId[createViewGroupInput.viewId]
?.mainGroupByFieldMetadataId;
const mainGroupByFieldMetadataId = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: createViewGroupInput.viewId,
flatEntityMaps: flatViewMaps,
})?.mainGroupByFieldMetadataId;
if (!isDefined(mainGroupByFieldMetadataId)) {
throw new ViewGroupException(
@@ -23,6 +23,7 @@ import { CustomPermissionGuard } from 'src/engine/guards/custom-permission.guard
import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { resolveObjectMetadataStandardOverride } from 'src/engine/metadata-modules/object-metadata/utils/resolve-object-metadata-standard-override.util';
import { CreateViewPermissionGuard } from 'src/engine/metadata-modules/view-permissions/guards/create-view-permission.guard';
import { DeleteViewPermissionGuard } from 'src/engine/metadata-modules/view-permissions/guards/delete-view-permission.guard';
@@ -189,8 +190,10 @@ export class ViewController {
let processedName = view.name;
if (view.name.includes('{objectLabelPlural}')) {
const objectMetadata =
flatObjectMetadataMaps.byId[view.objectMetadataId];
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: view.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (objectMetadata) {
const i18n = this.i18nService.getI18nInstance(locale ?? 'en');
@@ -21,30 +21,37 @@ describe('ViewQueryParamsService', () => {
const mockFieldMetadataId = 'field-metadata-id';
const mockFlatObjectMetadataMaps = {
byId: {
[mockObjectMetadataId]: {
byUniversalIdentifier: {
'object-universal-id': {
id: mockObjectMetadataId,
nameSingular: 'company',
namePlural: 'companies',
labelSingular: 'Company',
labelPlural: 'Companies',
universalIdentifier: 'object-universal-id',
},
},
byNameSingular: {},
byNamePlural: {},
universalIdentifierById: {
[mockObjectMetadataId]: 'object-universal-id',
},
universalIdentifiersByApplicationId: {},
};
const mockFlatFieldMetadataMaps = {
byId: {
[mockFieldMetadataId]: {
byUniversalIdentifier: {
'field-universal-id': {
id: mockFieldMetadataId,
name: 'name',
type: FieldMetadataType.TEXT,
label: 'Name',
options: null,
universalIdentifier: 'field-universal-id',
},
},
byNameAndObjectId: {},
universalIdentifierById: {
[mockFieldMetadataId]: 'field-universal-id',
},
universalIdentifiersByApplicationId: {},
};
beforeEach(async () => {
@@ -16,6 +16,7 @@ import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query
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 { ViewFilterGroupLogicalOperator } from 'src/engine/metadata-modules/view-filter-group/enums/view-filter-group-logical-operator';
import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction';
import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum';
@@ -62,7 +63,10 @@ export class ViewQueryParamsService {
const recordFilters: RecordFilter[] = (view.viewFilters ?? [])
.map((viewFilter) => {
const field = flatFieldMetadataMaps.byId[viewFilter.fieldMetadataId];
const field = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilter.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!field) return null;
@@ -91,7 +95,10 @@ export class ViewQueryParamsService {
const fields = recordFilters
.map((filter) => {
const field = flatFieldMetadataMaps.byId[filter.fieldMetadataId];
const field = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: filter.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!field) return null;
@@ -120,7 +127,10 @@ export class ViewQueryParamsService {
const orderBy: ObjectRecordOrderBy = (view.viewSorts ?? [])
.map((sort) => {
const field = flatFieldMetadataMaps.byId[sort.fieldMetadataId];
const field = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: sort.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!field) return null;
@@ -33,16 +33,19 @@ describe('ViewToolsFactory', () => {
};
const mockFlatObjectMetadataMaps = {
byId: {
[mockObjectMetadataId]: {
byUniversalIdentifier: {
'object-universal-id': {
id: mockObjectMetadataId,
nameSingular: mockObjectNameSingular,
namePlural: 'companies',
labelSingular: 'Company',
labelPlural: 'Companies',
universalIdentifier: 'object-universal-id',
},
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[mockObjectMetadataId]: 'object-universal-id',
},
universalIdentifiersByApplicationId: {},
};
@@ -88,9 +88,9 @@ export class ViewToolsFactory {
},
);
const objectMetadata = Object.values(flatObjectMetadataMaps.byId).find(
(obj) => obj?.nameSingular === objectNameSingular,
);
const objectMetadata = Object.values(
flatObjectMetadataMaps.byUniversalIdentifier,
).find((obj) => obj?.nameSingular === objectNameSingular);
if (!objectMetadata) {
throw new Error(