1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-19 19:04:01 +00:00

PM-14927 Refactor critical app service and render counts

This commit is contained in:
voommen-livefront
2024-11-18 10:07:31 -06:00
parent c0b8f78db6
commit 4dce7a52cf
7 changed files with 255 additions and 183 deletions

View File

@@ -5,19 +5,13 @@ import { ActivatedRoute } from "@angular/router";
import { debounceTime, firstValueFrom, map, switchMap } from "rxjs";
// eslint-disable-next-line no-restricted-imports
import {
CriticalAppsService,
PasswordHealthReportApplicationsRequest,
PasswordHealthReportApplicationsResponse,
} from "@bitwarden/bit-common/tools/reports/risk-insights";
import { CriticalAppsApiService } from "@bitwarden/bit-common/tools/reports/risk-insights";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
@@ -28,7 +22,6 @@ import {
TableDataSource,
ToastService,
} from "@bitwarden/components";
import { KeyService } from "@bitwarden/key-management";
import { CardComponent } from "@bitwarden/tools-card";
import { HeaderModule } from "../../layouts/header/header.module";
@@ -53,7 +46,6 @@ export class AllApplicationsComponent implements OnInit {
noItemsIcon = Icons.Security;
protected markingAsCritical = false;
isCritialAppsFeatureEnabled = false;
private flaggedCriticalApps: PasswordHealthReportApplicationsResponse[] = [];
// MOCK DATA
protected mockData = applicationTableMockData;
@@ -74,17 +66,7 @@ export class AllApplicationsComponent implements OnInit {
}),
switchMap(async (params) => {
const organizationId = (await params).get("organizationId");
const result = await this.criticalAppsService.getCriticalApps(organizationId);
const key = await this.keyService.getOrgKey(this.organization.id);
const flaggedCriticalAppsPromise = result.map(async (r) => {
const decryptedUrl = await this.encryptService.decryptToUtf8(new EncString(r.uri), key);
return {
id: r.id,
organizationId: r.organizationId,
uri: decryptedUrl,
} as PasswordHealthReportApplicationsResponse;
});
this.flaggedCriticalApps = await Promise.all(flaggedCriticalAppsPromise);
await this.criticalAppsService.getCriticalApps(organizationId);
}),
)
.subscribe();
@@ -103,9 +85,7 @@ export class AllApplicationsComponent implements OnInit {
protected toastService: ToastService,
protected organizationService: OrganizationService,
protected configService: ConfigService,
protected criticalAppsService: CriticalAppsService,
private keyService: KeyService,
private encryptService: EncryptService,
protected criticalAppsService: CriticalAppsApiService,
) {
this.dataSource.data = applicationTableMockData;
this.searchControl.valueChanges
@@ -124,38 +104,10 @@ export class AllApplicationsComponent implements OnInit {
markAppsAsCritical = async () => {
this.markingAsCritical = true;
const key = await this.keyService.getOrgKey(this.organization.id);
// only save records that are not already in the database
const newEntries = Array.from(this.selectedUrls).filter((url) => {
return !this.flaggedCriticalApps.some((r) => r.uri === url);
});
const criticalAppsPromises = newEntries.map(async (url) => {
const encryptedUrlName = await this.encryptService.encrypt(url, key);
return {
organizationId: this.organization.id,
url: encryptedUrlName.encryptedString.toString(),
} as PasswordHealthReportApplicationsRequest;
});
const criticalApps = await Promise.all(criticalAppsPromises);
await this.criticalAppsService
.setCriticalApps(criticalApps)
.then((result) => {
// append to flaggedCriticalApps
result
.filter((r) => !this.flaggedCriticalApps.some((f) => f.uri === r.uri))
.forEach(async (r) => {
const decryptedUrl = await this.encryptService.decryptToUtf8(new EncString(r.uri), key);
this.flaggedCriticalApps.push({
id: r.id,
organizationId: r.organizationId,
uri: decryptedUrl,
} as PasswordHealthReportApplicationsResponse);
});
.setCriticalApps(this.organization.id, Array.from(this.selectedUrls))
.then(() => {
this.toastService.showToast({
variant: "success",
title: null,

View File

@@ -4,6 +4,8 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { ActivatedRoute, Router } from "@angular/router";
import { JslibModule } from "@bitwarden/angular/jslib.module";
// eslint-disable-next-line no-restricted-imports
import { CriticalAppsApiService } from "@bitwarden/bit-common/tools/reports/risk-insights";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { AsyncActionsModule, ButtonModule, TabsModule } from "@bitwarden/components";
@@ -11,6 +13,7 @@ import { AsyncActionsModule, ButtonModule, TabsModule } from "@bitwarden/compone
import { HeaderModule } from "../../layouts/header/header.module";
import { AllApplicationsComponent } from "./all-applications.component";
import { applicationTableMockData } from "./application-table.mock";
import { CriticalApplicationsComponent } from "./critical-applications.component";
import { NotifiedMembersTableComponent } from "./notified-members-table.component";
import { PasswordHealthMembersURIComponent } from "./password-health-members-uri.component";
@@ -46,7 +49,7 @@ export class RiskInsightsComponent implements OnInit {
dataLastUpdated = new Date();
isCritialAppsFeatureEnabled = false;
apps: any[] = [];
apps: any[] = applicationTableMockData;
criticalApps: any[] = [];
notifiedMembers: any[] = [];
@@ -78,9 +81,14 @@ export class RiskInsightsComponent implements OnInit {
protected route: ActivatedRoute,
private router: Router,
private configService: ConfigService,
private criticalAppsApiService: CriticalAppsApiService,
) {
route.queryParams.pipe(takeUntilDestroyed()).subscribe(({ tabIndex }) => {
this.tabIndex = !isNaN(tabIndex) ? tabIndex : RiskInsightsTabType.AllApps;
});
this.criticalAppsApiService.criticalApps$.pipe(takeUntilDestroyed()).subscribe((apps) => {
this.criticalApps = apps;
});
}
}