/// <summary> /// Creates a Braintree <see cref="Customer"/> from a Merchello <see cref="ICustomer"/> /// </summary> /// <param name="customer"> /// The customer. /// </param> /// <param name="paymentMethodNonce"> /// The "nonce-from-the-client" /// </param> /// <param name="billingAddress"> /// The billing address /// </param> /// <param name="shippingAddress"> /// The shipping Address. /// </param> /// <returns> /// The <see cref="Attempt{Customer}"/>. /// </returns> public Attempt <Customer> Create(ICustomer customer, string paymentMethodNonce = "", IAddress billingAddress = null, IAddress shippingAddress = null) { if (Exists(customer)) { return(Attempt.Succeed(GetBraintreeCustomer(customer))); } var request = RequestFactory.CreateCustomerRequest(customer, paymentMethodNonce, billingAddress); Creating.RaiseEvent(new Core.Events.NewEventArgs <CustomerRequest>(request), this); // attempt the API call var attempt = TryGetApiResult(() => BraintreeGateway.Customer.Create(request)); if (!attempt.Success) { return(Attempt <Customer> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { Created.RaiseEvent(new Core.Events.NewEventArgs <Customer>(result.Target), this); return(Attempt.Succeed((Customer)RuntimeCache.GetCacheItem(MakeCustomerCacheKey(customer), () => result.Target))); } var error = new BraintreeApiException(result.Errors); LogHelper.Error <BraintreeCustomerApiService>("Braintree API Customer Create return a failure", error); return(Attempt <Customer> .Fail(error)); }
/// <summary> /// The update. /// </summary> /// <param name="customer"> /// The customer. /// </param> /// <param name="paymentMethodNonce">The "nonce-from-the-client"</param> /// <param name="billingAddress">The customer billing address</param> /// <param name="shippinggAddress">The shipping address</param> /// <returns> /// The <see cref="Customer"/>. /// </returns> public Attempt <Customer> Update(ICustomer customer, string paymentMethodNonce = "", IAddress billingAddress = null, IAddress shippinggAddress = null) { if (!this.Exists(customer)) { return(Attempt <Customer> .Fail(new NullReferenceException("Could not finde matching Braintree customer."))); } var request = RequestFactory.CreateCustomerRequest(customer, paymentMethodNonce, billingAddress, true); Updating.RaiseEvent(new SaveEventArgs <CustomerRequest>(request), this); // attempt the API call var attempt = TryGetApiResult(() => BraintreeGateway.Customer.Update(customer.Key.ToString(), request)); if (!attempt.Success) { return(Attempt <Customer> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { var cacheKey = MakeCustomerCacheKey(customer); RuntimeCache.ClearCacheItem(cacheKey); Updated.RaiseEvent(new SaveEventArgs <Customer>(result.Target), this); return(Attempt <Customer> .Succeed((Customer)RuntimeCache.GetCacheItem(cacheKey, () => result.Target))); } var error = new BraintreeApiException(result.Errors); LogHelper.Error <BraintreeCustomerApiService>("Braintree API Customer Create return a failure", error); return(Attempt <Customer> .Fail(error)); }