Cache WorkspaceMember (#17247)

## Context
Due to RLS feature, workspaceMember entity and its properties is
becoming necessary in different places of the backend. To avoid querying
many times, this PR adds a map of workspace members per workspaceId,
leveraging WorkspaceCache pattern for WorkspaceEntity (in opposition
with CoreEntity)

Due to its content (mostly PII), I prefer to cache it locally only (node
process VS Redis) using localDataOnly.

TODO: invalidation logic when the workspaceMember object is updated
(more precisely, when its field map is updated). There is no easy way
today to update that list so it can be done in another PR imho
This commit is contained in:
Weiko
2026-01-19 18:13:10 +01:00
committed by GitHub
parent b15c042e77
commit 1f1ccb281e
10 changed files with 220 additions and 93 deletions
@@ -3,6 +3,7 @@ import { type EntityMetadata } from 'typeorm';
import { type FlatApplicationCacheMaps } from 'src/engine/core-modules/application/types/flat-application-cache-maps.type';
import { type FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
import { type FlatWorkspaceMemberMaps } from 'src/engine/core-modules/user/types/flat-workspace-member-maps.type';
import { type FlatRoleTargetByAgentIdMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-role-target-by-agent-id-maps.type';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { type UserWorkspaceRoleMap } from 'src/engine/metadata-modules/role-target/services/workspace-user-workspace-role-map-cache.service';
@@ -42,6 +43,7 @@ export const WORKSPACE_CACHE_KEYS_V2 = {
flatRowLevelPermissionPredicateGroupMaps:
'flat-maps:row-level-permission-predicate-group',
flatFrontComponentMaps: 'flat-maps:front-component',
flatWorkspaceMemberMaps: 'flat-maps:workspace-member',
} as const satisfies Record<WorkspaceCacheKeyName, string>;
export type AdditionalCacheDataMaps = {
@@ -54,6 +56,7 @@ export type AdditionalCacheDataMaps = {
flatRoleTargetByAgentIdMaps: FlatRoleTargetByAgentIdMaps;
flatRowLevelPermissionPredicateMaps: FlatRowLevelPermissionPredicateMaps;
flatRowLevelPermissionPredicateGroupMaps: FlatRowLevelPermissionPredicateGroupMaps;
flatWorkspaceMemberMaps: FlatWorkspaceMemberMaps;
};
export type WorkspaceCacheDataMap = AllFlatEntityMaps & AdditionalCacheDataMaps;