1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-24 20:58:49 -05:00

PM-20576 added logs and updated errors as per PR comments

This commit is contained in:
voommen-livefront 2025-06-23 09:39:05 -05:00
parent ff72e768d7
commit 6999a3ac8e
4 changed files with 45 additions and 17 deletions

View File

@ -4,6 +4,7 @@ using Bit.Core.Dirt.Reports.ReportFeatures.Requests;
using Bit.Core.Dirt.Repositories; using Bit.Core.Dirt.Repositories;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Microsoft.Extensions.Logging;
namespace Bit.Core.Dirt.Reports.ReportFeatures; namespace Bit.Core.Dirt.Reports.ReportFeatures;
@ -11,20 +12,26 @@ public class AddOrganizationReportCommand : IAddOrganizationReportCommand
{ {
private readonly IOrganizationRepository _organizationRepo; private readonly IOrganizationRepository _organizationRepo;
private readonly IOrganizationReportRepository _organizationReportRepo; private readonly IOrganizationReportRepository _organizationReportRepo;
private ILogger<AddOrganizationReportCommand> _logger;
public AddOrganizationReportCommand( public AddOrganizationReportCommand(
IOrganizationRepository organizationRepository, IOrganizationRepository organizationRepository,
IOrganizationReportRepository organizationReportRepository) IOrganizationReportRepository organizationReportRepository,
ILogger<AddOrganizationReportCommand> logger)
{ {
_organizationRepo = organizationRepository; _organizationRepo = organizationRepository;
_organizationReportRepo = organizationReportRepository; _organizationReportRepo = organizationReportRepository;
_logger = logger;
} }
public async Task<OrganizationReport> AddOrganizationReportAsync(AddOrganizationReportRequest request) public async Task<OrganizationReport> AddOrganizationReportAsync(AddOrganizationReportRequest request)
{ {
var (req, IsValid, errorMessage) = await ValidateRequestAsync(request); _logger.LogInformation("Adding organization report for organization {organizationId}", request.OrganizationId);
if (!IsValid)
var (isValid, errorMessage) = await ValidateRequestAsync(request);
if (!isValid)
{ {
_logger.LogInformation("Failed to add organization {organizationId} report: {errorMessage}", request.OrganizationId, errorMessage);
throw new BadRequestException(errorMessage); throw new BadRequestException(errorMessage);
} }
@ -40,25 +47,29 @@ public class AddOrganizationReportCommand : IAddOrganizationReportCommand
organizationReport.SetNewId(); organizationReport.SetNewId();
var data = await _organizationReportRepo.CreateAsync(organizationReport); var data = await _organizationReportRepo.CreateAsync(organizationReport);
_logger.LogInformation("Successfully added organization report for organization {organizationId}, {organizationReportId}",
request.OrganizationId, data.Id);
return data; return data;
} }
private async Task<Tuple<AddOrganizationReportRequest, bool, string>> ValidateRequestAsync( private async Task<(bool IsValid, string errorMessage)> ValidateRequestAsync(
AddOrganizationReportRequest request) AddOrganizationReportRequest request)
{ {
// verify that the organization exists // verify that the organization exists
var organization = await _organizationRepo.GetByIdAsync(request.OrganizationId); var organization = await _organizationRepo.GetByIdAsync(request.OrganizationId);
if (organization == null) if (organization == null)
{ {
return new Tuple<AddOrganizationReportRequest, bool, string>(request, false, "Invalid Organization"); return (false, "Invalid Organization");
} }
// ensure that we have a URL // ensure that we have report data
if (string.IsNullOrWhiteSpace(request.ReportData)) if (string.IsNullOrWhiteSpace(request.ReportData))
{ {
return new Tuple<AddOrganizationReportRequest, bool, string>(request, false, "Report Data is required"); return (false, "Report Data is required");
} }
return new Tuple<AddOrganizationReportRequest, bool, string>(request, true, string.Empty); return (true, string.Empty);
} }
} }

View File

@ -2,29 +2,40 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Requests; using Bit.Core.Dirt.Reports.ReportFeatures.Requests;
using Bit.Core.Dirt.Repositories; using Bit.Core.Dirt.Repositories;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Microsoft.Extensions.Logging;
namespace Bit.Core.Dirt.Reports.ReportFeatures; namespace Bit.Core.Dirt.Reports.ReportFeatures;
public class DropOrganizationReportCommand : IDropOrganizationReportCommand public class DropOrganizationReportCommand : IDropOrganizationReportCommand
{ {
private IOrganizationReportRepository _organizationReportRepo; private IOrganizationReportRepository _organizationReportRepo;
private ILogger<DropOrganizationReportCommand> _logger;
public DropOrganizationReportCommand( public DropOrganizationReportCommand(
IOrganizationReportRepository organizationReportRepository) IOrganizationReportRepository organizationReportRepository,
ILogger<DropOrganizationReportCommand> logger)
{ {
_organizationReportRepo = organizationReportRepository; _organizationReportRepo = organizationReportRepository;
_logger = logger;
} }
public async Task DropOrganizationReportAsync(DropOrganizationReportRequest request) public async Task DropOrganizationReportAsync(DropOrganizationReportRequest request)
{ {
_logger.LogInformation("Dropping organization report for organization {organizationId}",
request.OrganizationId);
var data = await _organizationReportRepo.GetByOrganizationIdAsync(request.OrganizationId); var data = await _organizationReportRepo.GetByOrganizationIdAsync(request.OrganizationId);
if (data == null || data.Count() == 0) if (data == null || data.Count() == 0)
{ {
throw new BadRequestException("Organization does not have any records."); _logger.LogInformation("No organization reports found for organization {organizationId}", request.OrganizationId);
throw new BadRequestException("No data found.");
} }
data.Where(_ => request.OrganizationReportIds.Contains(_.Id)).ToList().ForEach(async _ => data.Where(_ => request.OrganizationReportIds.Contains(_.Id)).ToList().ForEach(async _ =>
{ {
_logger.LogInformation("Dropping organization report {organizationReportId} for organization {organizationId}",
_.Id, request.OrganizationId);
await _organizationReportRepo.DeleteAsync(_); await _organizationReportRepo.DeleteAsync(_);
}); });
} }

View File

@ -2,17 +2,21 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Interfaces; using Bit.Core.Dirt.Reports.ReportFeatures.Interfaces;
using Bit.Core.Dirt.Repositories; using Bit.Core.Dirt.Repositories;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Microsoft.Extensions.Logging;
namespace Bit.Core.Dirt.Reports.ReportFeatures; namespace Bit.Core.Dirt.Reports.ReportFeatures;
public class GetOrganizationReportQuery : IGetOrganizationReportQuery public class GetOrganizationReportQuery : IGetOrganizationReportQuery
{ {
private IOrganizationReportRepository _organizationReportRepo; private IOrganizationReportRepository _organizationReportRepo;
private ILogger<GetOrganizationReportQuery> _logger;
public GetOrganizationReportQuery( public GetOrganizationReportQuery(
IOrganizationReportRepository organizationReportRepo) IOrganizationReportRepository organizationReportRepo,
ILogger<GetOrganizationReportQuery> logger)
{ {
_organizationReportRepo = organizationReportRepo; _organizationReportRepo = organizationReportRepo;
_logger = logger;
} }
public async Task<IEnumerable<OrganizationReport>> GetOrganizationReportAsync(Guid organizationId) public async Task<IEnumerable<OrganizationReport>> GetOrganizationReportAsync(Guid organizationId)
@ -22,6 +26,7 @@ public class GetOrganizationReportQuery : IGetOrganizationReportQuery
throw new BadRequestException("OrganizationId is required."); throw new BadRequestException("OrganizationId is required.");
} }
_logger.LogInformation("Fetching organization reports for organization {organizationId}", organizationId);
return await _organizationReportRepo.GetByOrganizationIdAsync(organizationId); return await _organizationReportRepo.GetByOrganizationIdAsync(organizationId);
} }
@ -32,6 +37,7 @@ public class GetOrganizationReportQuery : IGetOrganizationReportQuery
throw new BadRequestException("OrganizationId is required."); throw new BadRequestException("OrganizationId is required.");
} }
_logger.LogInformation("Fetching latest organization report for organization {organizationId}", organizationId);
return await _organizationReportRepo.GetLatestByOrganizationIdAsync(organizationId); return await _organizationReportRepo.GetLatestByOrganizationIdAsync(organizationId);
} }
} }

View File

@ -115,7 +115,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
[Theory, BitAutoData] [Theory, BitAutoData]
@ -131,7 +131,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
[Theory, BitAutoData] [Theory, BitAutoData]
@ -146,7 +146,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
[Theory, BitAutoData] [Theory, BitAutoData]
@ -161,7 +161,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
[Theory, BitAutoData] [Theory, BitAutoData]
@ -176,7 +176,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
[Theory, BitAutoData] [Theory, BitAutoData]
@ -188,7 +188,7 @@ public class DeleteOrganizationReportCommandTests
// Act & Assert // Act & Assert
var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request)); var exception = await Assert.ThrowsAsync<BadRequestException>(async () => await sutProvider.Sut.DropOrganizationReportAsync(request));
Assert.Equal("Organization does not have any records.", exception.Message); Assert.Equal("No data found.", exception.Message);
} }
} }