1
0
mirror of https://github.com/bitwarden/server synced 2026-01-04 09:33:40 +00:00

[PM-26967] Added new metric properties (#6519)

This commit is contained in:
Vijay Oommen
2025-10-30 16:54:05 -05:00
committed by GitHub
parent b8325414bf
commit e102a7488e
17 changed files with 359 additions and 39 deletions

View File

@@ -0,0 +1,48 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;
namespace Bit.Core.Dirt.Reports.Models.Data;
public class OrganizationReportMetricsData
{
public Guid OrganizationId { get; set; }
public int? ApplicationCount { get; set; }
public int? ApplicationAtRiskCount { get; set; }
public int? CriticalApplicationCount { get; set; }
public int? CriticalApplicationAtRiskCount { get; set; }
public int? MemberCount { get; set; }
public int? MemberAtRiskCount { get; set; }
public int? CriticalMemberCount { get; set; }
public int? CriticalMemberAtRiskCount { get; set; }
public int? PasswordCount { get; set; }
public int? PasswordAtRiskCount { get; set; }
public int? CriticalPasswordCount { get; set; }
public int? CriticalPasswordAtRiskCount { get; set; }
public static OrganizationReportMetricsData From(Guid organizationId, OrganizationReportMetricsRequest? request)
{
if (request == null)
{
return new OrganizationReportMetricsData
{
OrganizationId = organizationId
};
}
return new OrganizationReportMetricsData
{
OrganizationId = organizationId,
ApplicationCount = request.ApplicationCount,
ApplicationAtRiskCount = request.ApplicationAtRiskCount,
CriticalApplicationCount = request.CriticalApplicationCount,
CriticalApplicationAtRiskCount = request.CriticalApplicationAtRiskCount,
MemberCount = request.MemberCount,
MemberAtRiskCount = request.MemberAtRiskCount,
CriticalMemberCount = request.CriticalMemberCount,
CriticalMemberAtRiskCount = request.CriticalMemberAtRiskCount,
PasswordCount = request.PasswordCount,
PasswordAtRiskCount = request.PasswordAtRiskCount,
CriticalPasswordCount = request.CriticalPasswordCount,
CriticalPasswordAtRiskCount = request.CriticalPasswordAtRiskCount
};
}
}

View File

@@ -35,14 +35,28 @@ public class AddOrganizationReportCommand : IAddOrganizationReportCommand
throw new BadRequestException(errorMessage);
}
var requestMetrics = request.Metrics ?? new OrganizationReportMetricsRequest();
var organizationReport = new OrganizationReport
{
OrganizationId = request.OrganizationId,
ReportData = request.ReportData,
ReportData = request.ReportData ?? string.Empty,
CreationDate = DateTime.UtcNow,
ContentEncryptionKey = request.ContentEncryptionKey,
ContentEncryptionKey = request.ContentEncryptionKey ?? string.Empty,
SummaryData = request.SummaryData,
ApplicationData = request.ApplicationData,
ApplicationCount = requestMetrics.ApplicationCount,
ApplicationAtRiskCount = requestMetrics.ApplicationAtRiskCount,
CriticalApplicationCount = requestMetrics.CriticalApplicationCount,
CriticalApplicationAtRiskCount = requestMetrics.CriticalApplicationAtRiskCount,
MemberCount = requestMetrics.MemberCount,
MemberAtRiskCount = requestMetrics.MemberAtRiskCount,
CriticalMemberCount = requestMetrics.CriticalMemberCount,
CriticalMemberAtRiskCount = requestMetrics.CriticalMemberAtRiskCount,
PasswordCount = requestMetrics.PasswordCount,
PasswordAtRiskCount = requestMetrics.PasswordAtRiskCount,
CriticalPasswordCount = requestMetrics.CriticalPasswordCount,
CriticalPasswordAtRiskCount = requestMetrics.CriticalPasswordAtRiskCount,
RevisionDate = DateTime.UtcNow
};

View File

@@ -1,16 +1,15 @@
// FIXME: Update this file to be null safe and then delete the line below
#nullable disable
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
public class AddOrganizationReportRequest
{
public Guid OrganizationId { get; set; }
public string ReportData { get; set; }
public string? ReportData { get; set; }
public string ContentEncryptionKey { get; set; }
public string? ContentEncryptionKey { get; set; }
public string SummaryData { get; set; }
public string? SummaryData { get; set; }
public string ApplicationData { get; set; }
public string? ApplicationData { get; set; }
public OrganizationReportMetricsRequest? Metrics { get; set; }
}

View File

@@ -0,0 +1,31 @@
using System.Text.Json.Serialization;
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
public class OrganizationReportMetricsRequest
{
[JsonPropertyName("totalApplicationCount")]
public int? ApplicationCount { get; set; } = null;
[JsonPropertyName("totalAtRiskApplicationCount")]
public int? ApplicationAtRiskCount { get; set; } = null;
[JsonPropertyName("totalCriticalApplicationCount")]
public int? CriticalApplicationCount { get; set; } = null;
[JsonPropertyName("totalCriticalAtRiskApplicationCount")]
public int? CriticalApplicationAtRiskCount { get; set; } = null;
[JsonPropertyName("totalMemberCount")]
public int? MemberCount { get; set; } = null;
[JsonPropertyName("totalAtRiskMemberCount")]
public int? MemberAtRiskCount { get; set; } = null;
[JsonPropertyName("totalCriticalMemberCount")]
public int? CriticalMemberCount { get; set; } = null;
[JsonPropertyName("totalCriticalAtRiskMemberCount")]
public int? CriticalMemberAtRiskCount { get; set; } = null;
[JsonPropertyName("totalPasswordCount")]
public int? PasswordCount { get; set; } = null;
[JsonPropertyName("totalAtRiskPasswordCount")]
public int? PasswordAtRiskCount { get; set; } = null;
[JsonPropertyName("totalCriticalPasswordCount")]
public int? CriticalPasswordCount { get; set; } = null;
[JsonPropertyName("totalCriticalAtRiskPasswordCount")]
public int? CriticalPasswordAtRiskCount { get; set; } = null;
}

View File

@@ -1,11 +1,8 @@
// FIXME: Update this file to be null safe and then delete the line below
#nullable disable
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
public class UpdateOrganizationReportApplicationDataRequest
{
public Guid Id { get; set; }
public Guid OrganizationId { get; set; }
public string ApplicationData { get; set; }
public string? ApplicationData { get; set; }
}

View File

@@ -1,11 +1,9 @@
// FIXME: Update this file to be null safe and then delete the line below
#nullable disable
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
namespace Bit.Core.Dirt.Reports.ReportFeatures.Requests;
public class UpdateOrganizationReportSummaryRequest
{
public Guid OrganizationId { get; set; }
public Guid ReportId { get; set; }
public string SummaryData { get; set; }
public string? SummaryData { get; set; }
public OrganizationReportMetricsRequest? Metrics { get; set; }
}

View File

@@ -53,7 +53,7 @@ public class UpdateOrganizationReportApplicationDataCommand : IUpdateOrganizatio
throw new BadRequestException("Organization report does not belong to the specified organization");
}
var updatedReport = await _organizationReportRepo.UpdateApplicationDataAsync(request.OrganizationId, request.Id, request.ApplicationData);
var updatedReport = await _organizationReportRepo.UpdateApplicationDataAsync(request.OrganizationId, request.Id, request.ApplicationData ?? string.Empty);
_logger.LogInformation(Constants.BypassFiltersEventId, "Successfully updated organization report application data {reportId} for organization {organizationId}",
request.Id, request.OrganizationId);

View File

@@ -1,4 +1,5 @@
using Bit.Core.Dirt.Entities;
using Bit.Core.Dirt.Reports.Models.Data;
using Bit.Core.Dirt.Reports.ReportFeatures.Interfaces;
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;
using Bit.Core.Dirt.Repositories;
@@ -53,7 +54,8 @@ public class UpdateOrganizationReportSummaryCommand : IUpdateOrganizationReportS
throw new BadRequestException("Organization report does not belong to the specified organization");
}
var updatedReport = await _organizationReportRepo.UpdateSummaryDataAsync(request.OrganizationId, request.ReportId, request.SummaryData);
await _organizationReportRepo.UpdateMetricsAsync(request.ReportId, OrganizationReportMetricsData.From(request.OrganizationId, request.Metrics));
var updatedReport = await _organizationReportRepo.UpdateSummaryDataAsync(request.OrganizationId, request.ReportId, request.SummaryData ?? string.Empty);
_logger.LogInformation(Constants.BypassFiltersEventId, "Successfully updated organization report summary {reportId} for organization {organizationId}",
request.ReportId, request.OrganizationId);

View File

@@ -1,5 +1,6 @@
using Bit.Core.Dirt.Entities;
using Bit.Core.Dirt.Models.Data;
using Bit.Core.Dirt.Reports.Models.Data;
using Bit.Core.Repositories;
namespace Bit.Core.Dirt.Repositories;
@@ -21,5 +22,8 @@ public interface IOrganizationReportRepository : IRepository<OrganizationReport,
// ApplicationData methods
Task<OrganizationReportApplicationDataResponse> GetApplicationDataAsync(Guid reportId);
Task<OrganizationReport> UpdateApplicationDataAsync(Guid orgId, Guid reportId, string applicationData);
// Metrics methods
Task UpdateMetricsAsync(Guid reportId, OrganizationReportMetricsData metrics);
}