-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature : Implement Audit Trail (#1017)
* feature : Add Auditing Backend for #1016 * add api endpoint to get user audit * blazor changes for #1016 * add audit trail to navmenu * fix image url
- Loading branch information
1 parent
bc260cf
commit 8eb77ea
Showing
33 changed files
with
1,193 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
namespace FSH.Framework.Core.Audit; | ||
public class AuditTrail | ||
{ | ||
public Guid Id { get; set; } | ||
public Guid UserId { get; set; } | ||
public string? Operation { get; set; } | ||
public string? Entity { get; set; } | ||
public DateTimeOffset DateTime { get; set; } | ||
public string? PreviousValues { get; set; } | ||
public string? NewValues { get; set; } | ||
public string? ModifiedProperties { get; set; } | ||
public string? PrimaryKey { get; set; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
namespace FSH.Framework.Core.Audit; | ||
public interface IAuditService | ||
{ | ||
Task<List<AuditTrail>> GetUserTrailsAsync(Guid userId); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
using System.Collections.ObjectModel; | ||
using System.Text.Json; | ||
|
||
namespace FSH.Framework.Core.Audit; | ||
public class TrailDto() | ||
{ | ||
public Guid Id { get; set; } | ||
public DateTimeOffset DateTime { get; set; } | ||
public Guid UserId { get; set; } | ||
public Dictionary<string, object?> KeyValues { get; } = new(); | ||
public Dictionary<string, object?> OldValues { get; } = new(); | ||
public Dictionary<string, object?> NewValues { get; } = new(); | ||
public Collection<string> ModifiedProperties { get; } = new(); | ||
public TrailType Type { get; set; } | ||
public string? TableName { get; set; } | ||
|
||
private static readonly JsonSerializerOptions serializerOptions = new() | ||
{ | ||
WriteIndented = false, | ||
}; | ||
|
||
public AuditTrail ToAuditTrail() | ||
{ | ||
return new() | ||
{ | ||
Id = Guid.NewGuid(), | ||
UserId = UserId, | ||
Operation = Type.ToString(), | ||
Entity = TableName, | ||
DateTime = DateTime, | ||
PrimaryKey = JsonSerializer.Serialize(KeyValues, serializerOptions), | ||
PreviousValues = OldValues.Count == 0 ? null : JsonSerializer.Serialize(OldValues, serializerOptions), | ||
NewValues = NewValues.Count == 0 ? null : JsonSerializer.Serialize(NewValues, serializerOptions), | ||
ModifiedProperties = ModifiedProperties.Count == 0 ? null : JsonSerializer.Serialize(ModifiedProperties, serializerOptions) | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
namespace FSH.Framework.Core.Audit; | ||
public enum TrailType | ||
{ | ||
None = 0, | ||
Create = 1, | ||
Update = 2, | ||
Delete = 3 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
namespace FSH.Framework.Infrastructure; | ||
public class FshInfrastructure | ||
{ | ||
public static string Name { get; set; } = "FshInfrastructure"; | ||
} |
13 changes: 13 additions & 0 deletions
13
src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEvent.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
using System.Collections.ObjectModel; | ||
using FSH.Framework.Core.Audit; | ||
using MediatR; | ||
|
||
namespace FSH.Framework.Infrastructure.Identity.Audit; | ||
public class AuditPublishedEvent : INotification | ||
{ | ||
public AuditPublishedEvent(Collection<AuditTrail>? trails) | ||
{ | ||
Trails = trails; | ||
} | ||
public Collection<AuditTrail>? Trails { get; } | ||
} |
24 changes: 24 additions & 0 deletions
24
src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEventHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
using FSH.Framework.Core.Audit; | ||
using FSH.Framework.Infrastructure.Identity.Persistence; | ||
using MediatR; | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace FSH.Framework.Infrastructure.Identity.Audit; | ||
public class AuditPublishedEventHandler(ILogger<AuditPublishedEventHandler> logger, IdentityDbContext context) : INotificationHandler<AuditPublishedEvent> | ||
{ | ||
public async Task Handle(AuditPublishedEvent notification, CancellationToken cancellationToken) | ||
{ | ||
if (context == null) return; | ||
logger.LogInformation("received audit trails"); | ||
try | ||
{ | ||
await context.Set<AuditTrail>().AddRangeAsync(notification.Trails!, default); | ||
await context.SaveChangesAsync(default); | ||
} | ||
catch | ||
{ | ||
logger.LogError("error while saving audit trail"); | ||
} | ||
return; | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/api/framework/Infrastructure/Identity/Audit/AuditService.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
using FSH.Framework.Core.Audit; | ||
using FSH.Framework.Infrastructure.Identity.Persistence; | ||
using Microsoft.EntityFrameworkCore; | ||
|
||
namespace FSH.Framework.Infrastructure.Identity.Audit; | ||
public class AuditService(IdentityDbContext context) : IAuditService | ||
{ | ||
public async Task<List<AuditTrail>> GetUserTrailsAsync(Guid userId) | ||
{ | ||
var trails = await context.AuditTrails | ||
.Where(a => a.UserId == userId) | ||
.OrderByDescending(a => a.DateTime) | ||
.Take(250) | ||
.ToListAsync(); | ||
return trails; | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
src/api/framework/Infrastructure/Identity/Audit/Endpoints/GetUserAuditTrailEndpoint.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using FSH.Framework.Core.Audit; | ||
using FSH.Framework.Infrastructure.Auth.Policy; | ||
using Microsoft.AspNetCore.Builder; | ||
using Microsoft.AspNetCore.Http; | ||
using Microsoft.AspNetCore.Routing; | ||
|
||
namespace FSH.Framework.Infrastructure.Identity.Audit.Endpoints; | ||
|
||
public static class GetUserAuditTrailEndpoint | ||
{ | ||
internal static RouteHandlerBuilder MapGetUserAuditTrailEndpoint(this IEndpointRouteBuilder endpoints) | ||
{ | ||
return endpoints.MapGet("/{id:guid}/audit-trails", (Guid id, IAuditService service) => | ||
{ | ||
return service.GetUserTrailsAsync(id); | ||
}) | ||
.WithName(nameof(GetUserAuditTrailEndpoint)) | ||
.WithSummary("Get user's audit trail details") | ||
.RequirePermission("Permissions.AuditTrails.View") | ||
.WithDescription("Get user's audit trail details."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.