/// <inheritdoc />
        public async Task <ProcessResponse> Execute(ProcessRequest <TState> request, ProcessMiddlewareDelegate next, CancellationToken token)
        {
            var response = await next();

            var correlationId = request.State is IIntegrationEvent @event
                ? @event.CorrelationId
                : Unified.NewCode();

            var processMessages = response.ProcessMessages
                                  .Select(m =>
            {
                m.Message.CorrelationId = correlationId;
                EnrichWithUserId(m.Message, options.ActorId);
                EnrichWithRoles(m.Message, "[]");

                var principal = new Principal
                {
                    IdentityId       = options.ActorId,
                    UserId           = options.ActorId,
                    IsProcessManager = true,
                };

                m.Message.Actor = principal.AsActor();
                if (m.Message is Command cmd)
                {
                    cmd.Principal = principal;
                }

                return(new ProcessMessage(m.Message, m.IsPublished));
            })
                                  .ToArray();

            return(new ProcessResponse(response.Id, processMessages, response.IsPersisted));
        }
        /// <summary>
        /// Creates integration event from command context.
        /// </summary>
        /// <typeparam name="TIntegrationEvent">Type of the integration event.</typeparam>
        /// <returns>Integration event.</returns>
        public TIntegrationEvent CreateIntegrationEvent <TIntegrationEvent>()
            where TIntegrationEvent : IntegrationEvent, new()
        {
            var @event = new TIntegrationEvent
            {
                Id = Unified.NewCode(),
                AggregateRootId = AggregateRootId,
                CorrelationId   = CorrelationId,
                Actor           = Principal.AsActor(),
                Version         = ExpectedVersion,
                SourceId        = SourceId
            };

            foreach (var pair in Metadata)
            {
                @event.Metadata[pair.Key] = pair.Value;
            }

            return(@event);
        }