Fix seeding perf + batch role targets creation (#16337)

This commit is contained in:
Weiko
2025-12-04 20:29:48 +01:00
committed by GitHub
parent e653385485
commit 1991ee850e
11 changed files with 156 additions and 110 deletions
@@ -37,6 +37,25 @@ export class RoleTargetService {
createRoleTargetInput: CreateRoleTargetInput;
workspaceId: string;
}): Promise<FlatRoleTarget> {
const [flatRoleTarget] = await this.createMany({
createRoleTargetInputs: [createRoleTargetInput],
workspaceId,
});
return flatRoleTarget;
}
async createMany({
createRoleTargetInputs,
workspaceId,
}: {
createRoleTargetInputs: CreateRoleTargetInput[];
workspaceId: string;
}): Promise<FlatRoleTarget[]> {
if (createRoleTargetInputs.length === 0) {
return [];
}
const { flatRoleTargetMaps, flatRoleMaps } =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
@@ -44,6 +63,7 @@ export class RoleTargetService {
flatMapsKeys: ['flatRoleTargetMaps', 'flatRoleMaps'],
},
);
const { workspaceCustomFlatApplication } =
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
{
@@ -51,17 +71,25 @@ export class RoleTargetService {
},
);
const { flatRoleTargetToCreate, flatRoleTargetsToDelete } =
fromCreateRoleTargetInputToFlatRoleTargetToCreate({
createRoleTargetInput: {
...createRoleTargetInput,
applicationId:
createRoleTargetInput.applicationId ??
workspaceCustomFlatApplication.id,
},
flatRoleTargetMaps,
workspaceId,
});
const allFlatRoleTargetsToCreate: FlatRoleTarget[] = [];
const allFlatRoleTargetsToDelete: FlatRoleTarget[] = [];
for (const createRoleTargetInput of createRoleTargetInputs) {
const { flatRoleTargetToCreate, flatRoleTargetsToDelete } =
fromCreateRoleTargetInputToFlatRoleTargetToCreate({
createRoleTargetInput: {
...createRoleTargetInput,
applicationId:
createRoleTargetInput.applicationId ??
workspaceCustomFlatApplication.id,
},
flatRoleTargetMaps,
workspaceId,
});
allFlatRoleTargetsToCreate.push(flatRoleTargetToCreate);
allFlatRoleTargetsToDelete.push(...flatRoleTargetsToDelete);
}
const validateAndBuildResult =
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
@@ -69,8 +97,8 @@ export class RoleTargetService {
fromToAllFlatEntityMaps: {
flatRoleTargetMaps: computeFlatEntityMapsFromTo({
flatEntityMaps: flatRoleTargetMaps,
flatEntityToCreate: [flatRoleTargetToCreate],
flatEntityToDelete: flatRoleTargetsToDelete,
flatEntityToCreate: allFlatRoleTargetsToCreate,
flatEntityToDelete: allFlatRoleTargetsToDelete,
flatEntityToUpdate: [],
}),
},
@@ -90,7 +118,7 @@ export class RoleTargetService {
if (isDefined(validateAndBuildResult)) {
throw new WorkspaceMigrationBuilderExceptionV2(
validateAndBuildResult,
'Multiple validation errors occurred while creating role target',
'Multiple validation errors occurred while creating role targets',
);
}
@@ -102,10 +130,12 @@ export class RoleTargetService {
},
);
return findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatRoleTargetToCreate.id,
flatEntityMaps: recomputedFlatRoleTargetMaps,
});
return allFlatRoleTargetsToCreate.map((flatRoleTargetToCreate) =>
findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatRoleTargetToCreate.id,
flatEntityMaps: recomputedFlatRoleTargetMaps,
}),
);
}
async delete({ id, workspaceId }: DeleteRoleTargetInput): Promise<void> {