public void TimeOut() { if (Status != PaymentStatus.Pending) { throw new InvalidOperationException($"Discarding payment in '{Status}' status is not allowed."); } var @event = PaymentTimedOut.Create(Id, DateTime.UtcNow); Enqueue(@event); Apply(@event); }
public async Task Handle(PaymentTimedOut @event, CancellationToken cancellationToken) { var payment = await querySession.LoadAsync<Payment>(@event.PaymentId); var externalEvent = PaymentFailed.Create( @event.PaymentId, payment!.OrderId, payment.Amount, @event.TimedOutAt, PaymentFailReason.Discarded ); await eventBus.Publish(externalEvent); }
private void Apply(PaymentTimedOut @event) { Version++; Status = PaymentStatus.Failed; }