Skip to content

Commit

Permalink
Merge pull request #62 from argon-chat/feature/interceptors
Browse files Browse the repository at this point in the history
Add timestamp and soft delete interceptor
  • Loading branch information
urumo authored Nov 23, 2024
2 parents cf9ba6e + bd92f5f commit 1d9b386
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/Argon.Api/Features/EF/TimeStampAndSoftDeleteInterceptor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
namespace Argon.Api.Features.EF;

using Contracts.Models;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore;

public class TimeStampAndSoftDeleteInterceptor : SaveChangesInterceptor
{
public override InterceptionResult<int> SavingChanges(
DbContextEventData eventData,
InterceptionResult<int> result)
{
HandleSoftDelete(eventData.Context);
SetTimestamps(eventData.Context);
return base.SavingChanges(eventData, result);
}

public override ValueTask<InterceptionResult<int>> SavingChangesAsync(
DbContextEventData eventData,
InterceptionResult<int> result,
CancellationToken cancellationToken = default)
{
HandleSoftDelete(eventData.Context);
SetTimestamps(eventData.Context);
return base.SavingChangesAsync(eventData, result, cancellationToken);
}

private void SetTimestamps(DbContext? context)
{
if (context == null) return;

var entries = context.ChangeTracker
.Entries()
.Where(e => e is { Entity: ArgonEntity, State: EntityState.Added or EntityState.Modified });

foreach (var entry in entries)
{
var entity = (ArgonEntity)entry.Entity;

if (entry.State == EntityState.Added)
entity.CreatedAt = DateTime.UtcNow;

entity.UpdatedAt = DateTime.UtcNow;
}
}

private void HandleSoftDelete(DbContext? context)
{
if (context == null) return;

var entries = context.ChangeTracker
.Entries()
.Where(e => e is { Entity: ArgonEntity, State: EntityState.Deleted });

foreach (var entry in entries)
{
var entity = (ArgonEntity)entry.Entity;

entity.DeletedAt = DateTime.UtcNow;
entity.IsDeleted = true;

entry.State = EntityState.Modified;
}
}
}

0 comments on commit 1d9b386

Please sign in to comment.