| | 1 | | using System.Diagnostics; |
| | 2 | | using Microsoft.EntityFrameworkCore.Diagnostics; |
| | 3 | | using Syki.Back.Features.Cross.CreateInstitution; |
| | 4 | | using Microsoft.EntityFrameworkCore.Infrastructure; |
| | 5 | |
|
| | 6 | | namespace Syki.Back.Database.Interceptors; |
| | 7 | |
|
| | 8 | | public sealed class SaveDomainEventsInterceptor : SaveChangesInterceptor |
| | 9 | | { |
| | 10 | | public override async ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, Interception |
| | 11 | | { |
| 15320 | 12 | | var activityId = Activity.Current?.Id; |
| | 13 | |
|
| 15320 | 14 | | var httpContextAccessor = eventData.Context.GetService<IHttpContextAccessor>(); |
| 15320 | 15 | | var ctx = httpContextAccessor?.HttpContext; |
| 15320 | 16 | | Guid? institutionId = (ctx != null && ctx.User.IsAuthenticated) ? ctx.User.InstitutionId : null; |
| | 17 | |
|
| 15320 | 18 | | var domainEvents = eventData.Context.ChangeTracker |
| 15320 | 19 | | .Entries<Entity>() |
| 15320 | 20 | | .SelectMany(entry => |
| 15320 | 21 | | { |
| 7476 | 22 | | var entity = entry.Entity; |
| 7476 | 23 | | var domainEvents = entity.GetDomainEvents(); |
| 12422 | 24 | | if (domainEvents.Count == 0) return []; |
| 15320 | 25 | |
|
| 2530 | 26 | | entity.ClearDomainEvents(); |
| 15320 | 27 | |
|
| 2530 | 28 | | var entityId = entry.Property<Guid>("Id").CurrentValue; |
| 2530 | 29 | | institutionId ??= (entry.Entity is Institution) ? entityId : entry.Property<Guid>("InstitutionId").Curre |
| 15320 | 30 | |
|
| 5060 | 31 | | return domainEvents.Select(evt => new DomainEvent(institutionId.Value, entityId, evt, activityId)); |
| 15320 | 32 | | }) |
| 15320 | 33 | | .ToList(); |
| | 34 | |
|
| 35700 | 35 | | foreach (var evt in domainEvents) |
| | 36 | | { |
| 2530 | 37 | | eventData.Context.Add(evt); |
| | 38 | | } |
| | 39 | |
|
| 30640 | 40 | | return await Task.Run(() => result); |
| 15320 | 41 | | } |
| | 42 | | } |