public void UpdateStatus(BookingStatus newStatus, string updatedBy, string cancelReason) { if (string.IsNullOrEmpty(updatedBy)) { throw new ArgumentNullException(nameof(updatedBy)); } if (newStatus == BookingStatus.Cancelled && string.IsNullOrEmpty(cancelReason)) { throw new ArgumentNullException(nameof(cancelReason)); } var bookingStatusTransition = new BookingStatusTransition(); var statusChangedEvent = new StatusChangedEvent(Status, newStatus); if (!bookingStatusTransition.IsValid(statusChangedEvent)) { throw new DomainRuleException("BookingStatus", $"Cannot change the booking status from {Status} to {newStatus}"); } Status = newStatus; UpdatedDate = DateTime.UtcNow; UpdatedBy = updatedBy; CancelReason = cancelReason; if (newStatus == BookingStatus.Created) { // Booking confirmed ConfirmedBy = updatedBy; ConfirmedDate = DateTime.UtcNow; } }
public bool IsValid(StatusChangedEvent statusChangedEvent) { return(_permissibleTransitions.Any(x => x.Key == statusChangedEvent.CurrentStatus && x.Value == statusChangedEvent.NewStatus)); }