Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class DBContextWithUserAuditing : IdentityDbContext<ApplicationUser, ApplicationRole, string>
- {
- public string UserId { get; set; }
- public int? TenantId { get; set; }
- public DBContextWithUserAuditing(DbContextOptions<DBContextWithUserAuditing> options) : base(options) { }
- // here we declare our db sets
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- base.OnModelCreating(modelBuilder);
- modelBuilder.NamesToSnakeCase(); // PostgreSQL
- modelBuilder.EnableSoftDelete();
- }
- public override int SaveChanges()
- {
- ChangeTracker.DetectChanges();
- ChangeTracker.ProcessModification(UserId);
- ChangeTracker.ProcessDeletion(UserId);
- ChangeTracker.ProcessCreation(UserId, TenantId);
- return base.SaveChanges();
- }
- public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
- {
- ChangeTracker.DetectChanges();
- ChangeTracker.ProcessModification(UserId);
- ChangeTracker.ProcessDeletion(UserId);
- ChangeTracker.ProcessCreation(UserId, TenantId);
- return (await base.SaveChangesAsync(true, cancellationToken));
- }
- }
- public class AppInitializerFilter : IAsyncActionFilter
- {
- private Session _session;
- private DBContextWithUserAuditing _dbContext;
- private ITenantService _tenantService;
- public AppInitializerFilter(
- DBContextWithUserAuditing dbContext
- )
- {
- _dbContext = dbContext;
- }
- public async Task OnActionExecutionAsync(
- ActionExecutingContext context,
- ActionExecutionDelegate next
- )
- {
- string userId = null;
- int? tenantId = null;
- var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
- var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
- if (userIdClaim != null)
- {
- userId = userIdClaim.Value;
- }
- var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
- if (tenantIdClaim != null)
- {
- tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
- }
- _dbContext.UserId = userId;
- _dbContext.TenantId = tenantId;
- var resultContext = await next();
- }
- }
- services
- .AddMvc(options =>
- {
- options.Filters.Add(typeof(OnRequestInit));
- })
- public static class ChangeTrackerExtensions
- {
- public static void ProcessCreation(this ChangeTracker changeTracker, string userId, int? tenantId)
- {
- foreach (var item in changeTracker.Entries<IHasCreationTime>().Where(e => e.State == EntityState.Added))
- {
- item.Entity.CreationTime = DateTime.Now;
- }
- foreach (var item in changeTracker.Entries<IHasCreatorUserId>().Where(e => e.State == EntityState.Added))
- {
- item.Entity.CreatorUserId = userId;
- }
- foreach (var item in changeTracker.Entries<IMustHaveTenant>().Where(e => e.State == EntityState.Added))
- {
- if (tenantId.HasValue)
- {
- item.Entity.TenantId = tenantId.Value;
- }
- }
- }
Add Comment
Please, Sign In to add comment