private async Task <bool> PublishEventAsync(ReliableEvent @event, CancellationToken cancellationToken) { var actualEvent = Deserialize(@event); if (actualEvent == null) { logger.LogWarning($"Unknown reliable event type: {@event.EventName}. The event won't be dispatched."); return(true); } using (var scope = serviceProvider.CreateScope()) { var mediator = scope.ServiceProvider.GetRequiredService <IMediator>(); var securityContext = scope.ServiceProvider.GetRequiredService <ISecurityContext>(); InitializeSecurityContext(@event, securityContext); try { await mediator.Publish(actualEvent, cancellationToken); return(true); } catch (BusinessException ex) { logger.LogError($"Business exception occurred while processing reliable event. Details: {ex}"); return(true); } catch (Exception ex) { logger.LogError($"Unknown error occured while processing reliable event. Details: {ex}"); return(false); // TODO: handle poison events } } }
private static void InitializeSecurityContext(ReliableEvent @event, ISecurityContext securityContext) { var identity = new ClaimsIdentity(); identity.AddClaim(new Claim(BookFastClaimTypes.ObjectId, @event.User)); identity.AddClaim(new Claim(BookFastClaimTypes.TenantId, @event.Tenant)); var acceptor = (ISecurityContextAcceptor)securityContext; acceptor.Principal = new ClaimsPrincipal(identity); }
private Event Deserialize(ReliableEvent @event) { var type = eventMapper.GetEventType(@event.EventName); return(type != null ? (Event)JsonConvert.DeserializeObject(@event.Payload, type) : null); }