Skip to content

Commit

Permalink
Performance optimization and fix status toggling
Browse files Browse the repository at this point in the history
  • Loading branch information
Splinter0 committed Oct 27, 2024
1 parent 8e11dd6 commit b2645a2
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 57 deletions.
114 changes: 60 additions & 54 deletions packages/backend/src/services/analysis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,62 +65,68 @@ export const runAnalysis = async (sdk: SDK<never, BackendEvents>) => {
);

for (const template of templates) {
for (const user of users) {
if (analysisStore.resultExists(template.id, user.id)) {
continue;
}
const analysisRequest = await sendRequest(sdk, template, user);
if (analysisRequest) {
analysisStore.addRequest(analysisRequest);
sdk.api.send("results:created", analysisRequest);
// Run each template async
(async () => {
for (const user of users) {
if (analysisStore.resultExists(template.id, user.id)) {
continue;
}
const analysisRequest = await sendRequest(sdk, template, user);
if (analysisRequest) {
analysisStore.addRequest(analysisRequest);
sdk.api.send("results:created", analysisRequest);
}
}
}
}

const roles = roleStore.getRoles();
for (const template of templates) {
const newRules: TemplateDTO["rules"] = [];

// Generate role rule statuses in parallel
const rolePromises = roles.map(async (role) => {
const currentRule = template.rules.find(
(rule) => rule.type === "RoleRule" && rule.roleId === role.id,
) ?? {
type: "RoleRule",
roleId: role.id,
hasAccess: false,
status: "Untested",
};

const status = await generateRoleRuleStatus(sdk, template, role.id);
return { ...currentRule, status };
});

// Generate user rule statuses in parallel
const userPromises = users.map(async (user) => {
const currentRule = template.rules.find(
(rule) => rule.type === "UserRule" && rule.userId === user.id,
) ?? {
type: "UserRule",
userId: user.id,
hasAccess: false,
status: "Untested",
};

const status = await generateUserRuleStatus(sdk, template, user);
return { ...currentRule, status };
});

// Await all role and user statuses
const roleResults = await Promise.all(rolePromises);
const userResults = await Promise.all(userPromises);

// Combine results
newRules.push(...roleResults, ...userResults);

template.rules = newRules;
templateStore.updateTemplate(template.id, template);
sdk.api.send("templates:updated", template);
const newRules: TemplateDTO["rules"] = [];
const roles = roleStore.getRoles();
const rolePromises = roles.map(async (role) => {
const currentRule = template.rules.find(
(rule) => rule.type === "RoleRule" && rule.roleId === role.id,
) ?? {
type: "RoleRule",
roleId: role.id,
hasAccess: false,
status: "Untested",
};


if (currentRule.status !== "Untested") {
return currentRule;
}

const status = await generateRoleRuleStatus(sdk, template, role.id);
return { ...currentRule, status };
});

const userPromises = users.map(async (user) => {
const currentRule = template.rules.find(
(rule) => rule.type === "UserRule" && rule.userId === user.id,
) ?? {
type: "UserRule",
userId: user.id,
hasAccess: false,
status: "Untested",
};

if (currentRule.status !== "Untested") {
return currentRule;
}

const status = await generateUserRuleStatus(sdk, template, user);
return { ...currentRule, status };
});

const roleResults = await Promise.all(rolePromises);
const userResults = await Promise.all(userPromises);

// Combine results
newRules.push(...roleResults, ...userResults);

template.rules = newRules;
templateStore.updateTemplate(template.id, template);
sdk.api.send("templates:updated", template);
})()
}
};

Expand Down
15 changes: 12 additions & 3 deletions packages/backend/src/stores/templates.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { TemplateDTO } from "shared";
import type { RoleRuleDTO, TemplateDTO, UserRuleDTO } from "shared";

export class TemplateStore {
private static _store?: TemplateStore;
Expand Down Expand Up @@ -49,7 +49,7 @@ export class TemplateStore {
});

if (currRule) {
currRule.hasAccess = !currRule.hasAccess;
this.toggleRule(currRule);
} else {
template.rules.push({
type: "RoleRule",
Expand All @@ -63,6 +63,15 @@ export class TemplateStore {
return template;
}

toggleRule(currRule: RoleRuleDTO | UserRuleDTO) {
currRule.hasAccess = !currRule.hasAccess;
if (currRule.status === "Bypassed" && currRule.hasAccess) {
currRule.status = "Enforced"
} else if (currRule.status === "Enforced" && !currRule.hasAccess) {
currRule.status = "Bypassed"
}
}

toggleTemplateUser(templateId: string, userId: string) {
const template = this.templates.get(templateId);
if (template) {
Expand All @@ -71,7 +80,7 @@ export class TemplateStore {
});

if (currRule) {
currRule.hasAccess = !currRule.hasAccess;
this.toggleRule(currRule);
} else {
template.rules.push({
type: "UserRule",
Expand Down

0 comments on commit b2645a2

Please sign in to comment.