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:
@@ -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;
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+3
-3
@@ -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,
|
||||
);
|
||||
|
||||
+2
-2
@@ -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>;
|
||||
|
||||
+6
-3
@@ -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[]>>;
|
||||
};
|
||||
|
||||
+13
-7
@@ -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],
|
||||
});
|
||||
|
||||
+13
-7
@@ -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: [],
|
||||
});
|
||||
|
||||
+11
-7
@@ -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,
|
||||
|
||||
+2
-2
@@ -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,
|
||||
),
|
||||
|
||||
+14
-11
@@ -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,
|
||||
|
||||
+1
-7
@@ -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;
|
||||
|
||||
+11
-1
@@ -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(
|
||||
|
||||
+2
-18
@@ -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];
|
||||
};
|
||||
|
||||
+5
-3
@@ -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,
|
||||
);
|
||||
};
|
||||
|
||||
+28
@@ -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);
|
||||
};
|
||||
+1
-1
@@ -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,
|
||||
}: {
|
||||
+2
-2
@@ -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,
|
||||
});
|
||||
|
||||
+5
-1
@@ -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) => {
|
||||
|
||||
+7
-1
@@ -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',
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-2
@@ -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 {
|
||||
|
||||
+3
-3
@@ -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) => {
|
||||
|
||||
+5
-1
@@ -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 =
|
||||
|
||||
+5
-1
@@ -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({
|
||||
|
||||
+6
-1
@@ -115,7 +115,12 @@ export const validateMorphOrRelationFlatFieldMetadata = ({
|
||||
});
|
||||
|
||||
const targetFlatFieldMetadata =
|
||||
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
|
||||
(remainingFlatEntityMapsToValidate
|
||||
? findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: relationTargetFieldMetadataId,
|
||||
flatEntityMaps: remainingFlatEntityMapsToValidate,
|
||||
})
|
||||
: undefined) ??
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: relationTargetFieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
|
||||
+6
-1
@@ -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,
|
||||
|
||||
+5
-4
@@ -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 {
|
||||
|
||||
+4
-4
@@ -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 };
|
||||
|
||||
+3
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ export const doesOtherObjectWithSameNameExists = ({
|
||||
objectMetadataNameSingular,
|
||||
existingObjectMetadataId,
|
||||
}: ValidateNoOtherObjectWithSameNameExistsOrThrowsParams) =>
|
||||
Object.values(objectMetadataMaps.byId)
|
||||
Object.values(objectMetadataMaps.byUniversalIdentifier)
|
||||
.filter(isDefined)
|
||||
.some(
|
||||
(objectMetadata) =>
|
||||
|
||||
+7
-2
@@ -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
-2
@@ -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(
|
||||
|
||||
+3
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-2
@@ -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(
|
||||
|
||||
+4
-2
@@ -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) =>
|
||||
|
||||
+3
-3
@@ -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
-1
@@ -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
-1
@@ -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(
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+5
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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(
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-2
@@ -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
-1
@@ -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
-1
@@ -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(
|
||||
|
||||
+5
-2
@@ -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
-1
@@ -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
-1
@@ -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(
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ export class LogicFunctionResolver {
|
||||
},
|
||||
);
|
||||
|
||||
return Object.values(flatLogicFunctionMaps.byId)
|
||||
return Object.values(flatLogicFunctionMaps.byUniversalIdentifier)
|
||||
.filter(
|
||||
(flatLogicFunction): flatLogicFunction is FlatLogicFunction =>
|
||||
isDefined(flatLogicFunction) &&
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+5
-2
@@ -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;
|
||||
|
||||
+1
-1
@@ -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) &&
|
||||
|
||||
+14
-7
@@ -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({
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+10
-6
@@ -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,
|
||||
|
||||
+29
-18
@@ -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,
|
||||
|
||||
+9
-4
@@ -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
-1
@@ -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(
|
||||
|
||||
+6
-2
@@ -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(
|
||||
|
||||
+10
-3
@@ -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(
|
||||
|
||||
+9
-3
@@ -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) &&
|
||||
|
||||
+19
-5
@@ -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;
|
||||
|
||||
+11
-3
@@ -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);
|
||||
|
||||
+5
-1
@@ -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;
|
||||
}
|
||||
|
||||
+6
-2
@@ -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(
|
||||
|
||||
+20
-10
@@ -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,
|
||||
|
||||
+5
-3
@@ -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(
|
||||
|
||||
+5
-2
@@ -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');
|
||||
|
||||
+14
-7
@@ -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 () => {
|
||||
|
||||
+13
-3
@@ -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;
|
||||
|
||||
|
||||
+6
-3
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user