From 84d40b8ea051e6d2b36d21b5485a12d3fe0cd15f Mon Sep 17 00:00:00 2001 From: Leslie Tilton <23057410+Banrion@users.noreply.github.com> Date: Wed, 12 Nov 2025 14:30:21 -0600 Subject: [PATCH] Add application model for risk insights reports following company architecture --- .../api/risk-insights-application.api.ts | 32 ++++++++++++++ .../data/risk-insights-application.data.ts | 29 ++++++++++++ .../domain/risk-insights-application.ts | 31 +++++++++++++ .../view/risk-insights-application.view.ts | 44 +++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/api/risk-insights-application.api.ts create mode 100644 bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/data/risk-insights-application.data.ts create mode 100644 bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/domain/risk-insights-application.ts create mode 100644 bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/view/risk-insights-application.view.ts diff --git a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/api/risk-insights-application.api.ts b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/api/risk-insights-application.api.ts new file mode 100644 index 00000000000..3a66d77aa7e --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/api/risk-insights-application.api.ts @@ -0,0 +1,32 @@ +import { BaseResponse } from "@bitwarden/common/models/response/base.response"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationData } from "../data/risk-insights-application.data"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplication } from "../domain/risk-insights-application"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationView } from "../view/risk-insights-application.view"; + +/** + * Converts a RiskInsightsApplication API response + * + * - See {@link RiskInsightsApplication} for domain model + * - See {@link RiskInsightsApplicationData} for data model + * - See {@link RiskInsightsApplicationView} from View Model + */ +export class RiskInsightsApplicationApi extends BaseResponse { + applicationName: string; + isCritical: boolean = false; + reviewedDate: string | undefined; + + constructor(data: any) { + super(data); + if (data == null) { + return; + } + + this.applicationName = this.getResponseProperty("applicationName"); + this.isCritical = this.getResponseProperty("isCritical") ?? false; + this.reviewedDate = this.getResponseProperty("reviewedDate"); + } +} diff --git a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/data/risk-insights-application.data.ts b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/data/risk-insights-application.data.ts new file mode 100644 index 00000000000..faa8a21cdbc --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/data/risk-insights-application.data.ts @@ -0,0 +1,29 @@ +import { RiskInsightsApplicationApi } from "../api/risk-insights-application.api"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplication } from "../domain/risk-insights-application"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationView } from "../view/risk-insights-application.view"; + +/** + * Serializable data model for Application data in risk insights report + * + * - See {@link RiskInsightsApplication} for domain model + * - See {@link RiskInsightsApplicationApi} for API model + * - See {@link RiskInsightsApplicationView} from View Model + */ + +export class RiskInsightsApplicationData { + applicationName: string; + isCritical: boolean; + reviewedDate: string | undefined; + + constructor(data?: RiskInsightsApplicationApi) { + if (data == null) { + return; + } + + this.applicationName = data.applicationName; + this.isCritical = data.isCritical; + this.reviewedDate = data.reviewedDate; + } +} diff --git a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/domain/risk-insights-application.ts b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/domain/risk-insights-application.ts new file mode 100644 index 00000000000..036f9a5bdbd --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/domain/risk-insights-application.ts @@ -0,0 +1,31 @@ +import Domain from "@bitwarden/common/platform/models/domain/domain-base"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationApi } from "../api/risk-insights-application.api"; +import { RiskInsightsApplicationData } from "../data/risk-insights-application.data"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationView } from "../view/risk-insights-application.view"; + +/** + * Domain model for Application data in Risk Insights containing encrypted properties + * + * - See {@link RiskInsightsApplicationApi} for API model + * - See {@link RiskInsightsApplicationData} for data model + * - See {@link RiskInsightsApplicationView} from View Model + */ +export class RiskInsightsApplication extends Domain { + applicationName: string = ""; // TODO: Encrypt? + isCritical: boolean = false; + reviewedDate?: Date; + + constructor(obj?: RiskInsightsApplicationData) { + super(); + if (obj == null) { + return; + } + + this.applicationName = obj.applicationName; + this.isCritical = obj.isCritical; + this.reviewedDate = new Date(obj.reviewedDate); + } +} diff --git a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/view/risk-insights-application.view.ts b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/view/risk-insights-application.view.ts new file mode 100644 index 00000000000..1a5326e6eed --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/models/view/risk-insights-application.view.ts @@ -0,0 +1,44 @@ +import { Jsonify } from "type-fest"; + +import { View } from "@bitwarden/common/models/view/view"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationApi } from "../api/risk-insights-application.api"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { RiskInsightsApplicationData } from "../data/risk-insights-application.data"; +import { RiskInsightsApplication } from "../domain/risk-insights-application"; + +/** + * View model for Application data in Risk Insights containing decrypted properties + * + * - See {@link RiskInsightsApplication} for domain model + * - See {@link RiskInsightsApplicationData} for data model + * - See {@link RiskInsightsApplicationApi} for API model + */ +export class RiskInsightsApplicationView implements View { + applicationName: string = ""; + isCritical = false; + reviewedDate?: Date; + + constructor(a?: RiskInsightsApplication) { + if (a == null) { + return; + } + + this.applicationName = a.applicationName; + this.isCritical = a.isCritical; + this.reviewedDate = a.reviewedDate; + } + + toJSON() { + return this; + } + + static fromJSON(obj: Partial>): RiskInsightsApplicationView { + return Object.assign(new RiskInsightsApplicationView(), obj); + } + + // [TODO] SDK Mapping + // toSdkRiskInsightsApplicationView(): SdkRiskInsightsApplicationView {} + // static fromRiskInsightsApplicationView(obj?: SdkRiskInsightsApplicationView): RiskInsightsApplicationView | undefined {} +}