55 lines
1.9 KiB
C#
Executable File
55 lines
1.9 KiB
C#
Executable File
using GamificationService.Models.Database;
|
|
using GamificationService.Services.CurrentUsers;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
|
|
|
namespace GamificationService.Database.Extensions;
|
|
|
|
public static class ChangeTrackerExtensions
|
|
{
|
|
public static void SetAuditProperties(this ChangeTracker changeTracker, ICurrentUserService currentUserService)
|
|
{
|
|
changeTracker.DetectChanges();
|
|
IEnumerable<EntityEntry> entities =
|
|
changeTracker
|
|
.Entries()
|
|
.Where(t => t.Entity is AuditableEntity &&
|
|
(
|
|
t.State == EntityState.Deleted
|
|
|| t.State == EntityState.Added
|
|
|| t.State == EntityState.Modified
|
|
));
|
|
|
|
if (entities.Any())
|
|
{
|
|
DateTimeOffset timestamp = DateTimeOffset.UtcNow;
|
|
|
|
string user = currentUserService.GetCurrentUser().Login ?? "Unknown";
|
|
|
|
foreach (EntityEntry entry in entities)
|
|
{
|
|
AuditableEntity entity = (AuditableEntity)entry.Entity;
|
|
|
|
switch (entry.State)
|
|
{
|
|
case EntityState.Added:
|
|
entity.CreatedOn = timestamp;
|
|
entity.CreatedBy = user;
|
|
entity.UpdatedOn = timestamp;
|
|
entity.UpdatedBy = user;
|
|
break;
|
|
case EntityState.Modified:
|
|
entity.UpdatedOn = timestamp;
|
|
entity.UpdatedBy = user;
|
|
break;
|
|
case EntityState.Deleted:
|
|
entity.UpdatedOn = timestamp;
|
|
entity.UpdatedBy = user;
|
|
entry.State = EntityState.Deleted;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|