public Task <FurnitureReservationResult> Handle(FurnitureReservationRequest request, CancellationToken cancellationToken) { var result = new FurnitureReservationResult(); Contract.AddNotifications( request.User.Contract , request.Payment.Contract , request.Furniture.Contract); if (Contract.Invalid) { foreach (var notification in Contract.Notifications) { result.Errors.Add(notification.Message); } return(Task.FromResult(result)); } try { if (_furnitureRep.AlreadyHostedForThisTime( request.Furniture, request.Checkin.Date, request.Checkout.Date )) { Contract.AddNotification("Furniture handler", "this furniture already hosted for this time"); } } catch (Exception ex) { Contract.AddNotification("Internal error", ex.Message); result.Errors.Add(ex.Message); return(Task.FromResult(result)); } var newAccomodationReserve = new Acommodation( request.User, request.Furniture, request.Checkin, request.Checkout); newAccomodationReserve.AddPayment(request.Payment); if (newAccomodationReserve.Contract.Invalid) { Contract.AddNotifications(newAccomodationReserve.Contract); } if (Contract.Invalid) { foreach (var notification in Contract.Notifications) { result.Errors.Add(notification.Message); } return(Task.FromResult(result)); } try { _paymentService.makeAPayment(request.Payment); _acommodationRep.AddAcommodationAndUpdateFurnitureSchedule(newAccomodationReserve); } catch (Exception ex) { Contract.AddNotification("External error", ex.Message); result.Errors.Add(ex.Message); return(Task.FromResult(result)); } result.FurnitureDetails = newAccomodationReserve.Furniture; result.Checkin = newAccomodationReserve.Checkin; result.Checkout = newAccomodationReserve.Checkout; return(Task.FromResult(result)); }