All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.theagilemonkeys.meets.magento.models.MeetsMageCustomer Maven / Gradle / Ivy

package com.theagilemonkeys.meets.magento.models;

import com.theagilemonkeys.meets.apimethod.ApiMethod;
import com.theagilemonkeys.meets.apimethod.ApiMethodModelHelper;
import com.theagilemonkeys.meets.Meets;
import com.theagilemonkeys.meets.magento.MageApiMethodCollectionResponseClasses;
import com.theagilemonkeys.meets.magento.connector.MeetsMageConnector;
import com.theagilemonkeys.meets.magento.methods.*;
import com.theagilemonkeys.meets.magento.models.base.MeetsMageModel;
import com.theagilemonkeys.meets.magento.utils.soap.SoapSerializableList;
import com.theagilemonkeys.meets.magento.utils.soap.SoapSerializableMap;
import com.theagilemonkeys.meets.models.MeetsAddress;
import com.theagilemonkeys.meets.models.MeetsCustomer;
import com.theagilemonkeys.meets.utils.StringUtils;
import org.jdeferred.Deferred;
import org.jdeferred.DoneCallback;
import org.jdeferred.DonePipe;
import org.jdeferred.FailCallback;
import org.jdeferred.impl.DeferredObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Android Meets SDK
 * Original work Copyright (c) 2014 [TheAgileMonkeys]
 *
 * @author Álvaro López Espinosa
 */
@SuppressWarnings("unchecked")
public class MeetsMageCustomer extends MeetsMageModel implements MeetsCustomer {
    public final static String MODE_GUEST = "guest";
    public final static String MODE_CUSTOMER = "customer";

    private String mode = MODE_CUSTOMER;
    private int customer_id;
    private String email;
    private String firstname;
    private String lastname;
    private String taxvat;
    private int store_id;
    private int website_id;
    private String password;
    private String password_hash;
    private List addresses;

    {
        MeetsMageConnector mageConnector = (MeetsMageConnector) Meets.getConnector();
        store_id = mageConnector.getStoreId();
        website_id = mageConnector.getWebsiteId();
    }

    //This is specific of magento
    public MeetsCustomer setMode(String mode) {
        this.mode = mode;
        return this;
    }

    @Override
    public MeetsCustomer fetch() {
        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                Map params = new HashMap();
                params.put("customerId", getId());
                return params;
            }
        };

        pushMethod(new CustomerCustomerInfo(), params)
                .done(updateFromResult)
                .always(triggerListeners);
        return this;
    }

    @Override
    public MeetsCustomer setId(int id) {
        customer_id = id;
        return this;
    }

    @Override
    public int getId() {
        return customer_id;
    }

    @Override
    public String getFirstName() {
        return firstname;
    }

    @Override
    public String getLastName() {
        return lastname;
    }

    @Override
    public String getEmail() {
        return email;
    }

    @Override
    public String getVatNumber() {
        return taxvat;
    }

    @Override
    public MeetsAddress getDefaultBillingAddress() {
        for (MeetsAddress address : getAddresses()){
            if ( address.isDefaultBilling() ) return address;
        }
        return null;
    }

    @Override
    public MeetsAddress getDefaultShippingAddress() {
        for (MeetsAddress address : getAddresses()){
            if ( address.isDefaultShipping() ) return address;
        }
        return null;
    }

    @Override
    public List getAddresses() {
        if (addresses == null)
            addresses = new ArrayList();
        return addresses;
    }

    private MeetsCustomer create() {
        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                Map params = new HashMap();
                params.put("customerData", MeetsMageCustomer.this);
                return params;
            }
        };

        forceNextCacheToBe(false);
        pushMethod(new CustomerCustomerCreate(), params)
                .done(updateFromResult)
                .always(triggerListeners);
        return this;
    }

    @Override
    public MeetsCustomer save() {
        if (isNew()){
            return create();
        }
        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                Map params = new HashMap();
                params.put("customerId", getId());
                params.put("customerData", MeetsMageCustomer.this);
                return params;
            }
        };

        forceNextCacheToBe(false);
        pushMethod(new CustomerCustomerUpdate(), params).always(triggerListeners);
        return this;
    }

    @Override
    public MeetsCustomer fetchByEmail(final String email) {
        return internalFetchByEmail(email, null);
    }

    @Override
    public MeetsCustomer fetchByEmailAndCheckPassword(String email, String password) {
        return internalFetchByEmail(email, password);
    }

    private MeetsCustomer internalFetchByEmail(final String email, final String password) {
        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                List> complexFilter = new SoapSerializableList>();
                    //Email filter key
                    Map filter = new SoapSerializableMap();
                        //Email filter value
                        Map filterValue = new SoapSerializableMap();
                        filterValue.put("key", "eq");
                        filterValue.put("value", email);
                    filter.put("key", "email");
                    filter.put("value", filterValue);
                complexFilter.add(filter);

                Map filters = new SoapSerializableMap();
                filters.put("complex_filter", complexFilter);

                Map params = new HashMap();
                params.put("filters", filters);
                return params;
            }
        };

        forceNextCacheToBe(false);
        pushMethod(new CustomerCustomerList(), params);
        pushPipe(new DonePipe() {
            @Override
            public Deferred pipeDone(Object o) {
                MageApiMethodCollectionResponseClasses.Customers customers = (MageApiMethodCollectionResponseClasses.Customers) o;
                Exception e;
                if (customers.size() == 0) {
                    e = new Exception("Customer not found");
                }
                else{
                    MeetsMageCustomer customer = customers.get(0);
                    if (password == null || internalCheckPassword(password, customer.password_hash)) {
                        updateFromResult(customer);
                        triggerListeners();
                        return new DeferredObject().resolve(MeetsMageCustomer.this);
                    }
                    e = new Exception("Incorrect password");
                }

                triggerListeners(e);
                return new DeferredObject().reject(e);
            }
        }, null);
        return this;
    }

    @Override
    public boolean checkPassword(String password) {
        return internalCheckPassword(password, password_hash);
    }

    private boolean internalCheckPassword(String password, String passwordHash){
        String[] pass_salt = passwordHash.split(":");
        String pass = pass_salt[0];
        String salt = pass_salt[1];
        String typedPassword = StringUtils.MD5Hash(salt + password);
        return pass.equals(typedPassword);
    }

    @Override
    public MeetsCustomer fetchAddresses() {
        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                Map params = new HashMap();
                params.put("customerId", getId());
                return params;
            }
        };

        pushMethod(new CustomerAddressList(), params)
                .done(new DoneCallback() {
                    @Override
                    public void onDone(Object o) {
                        addresses = (List) o;
                    }
                })
                .always(triggerListeners);
        return this;
    }

    @Override
    public MeetsCustomer saveAddress(final MeetsAddress meetsAddress) {
        ApiMethodModelHelper.DelayedParams params;
        ApiMethod method;
        if ( meetsAddress.isNew() ) {
            // We have to create the address
            params = new ApiMethodModelHelper.DelayedParams() {
                @Override
                public Map buildParams() {
                    Map params = new HashMap();
                    params.put("customerId", getId());
                    params.put("addressData", meetsAddress);
                    return params;
                }
            };
            method = new CustomerAddressCreate();
        }
        else {
            params = new ApiMethodModelHelper.DelayedParams() {
                @Override
                public Map buildParams() {
                    Map params = new HashMap();
                    params.put("addressId", meetsAddress.getId());
                    params.put("addressData", meetsAddress);
                    return params;
                }
            };
            method = new CustomerAddressUpdate();
        }

        forceNextCacheToBe(false);
        pushMethod(method, params)
                .done(new DoneCallback() {
                    @Override
                    public void onDone(Object o) {
                        if (o instanceof MeetsAddress)
                            meetsAddress.setId(((MeetsAddress)o).getId());
                        refreshAddressesAfterSave(meetsAddress);
                    }
                })
                .always(triggerListeners);
        return this;
    }

    @Override
    public MeetsCustomer removeAddress(final int addressId) {
        int removedIndex = -1;
        MeetsAddress removedAddress = null;

        for(int i = 0; i < getAddresses().size(); ++i) {
            if (getAddresses().get(i).getId() == addressId) {
                removedIndex = i;
                removedAddress = getAddresses().remove(removedIndex);
                break;
            }
        }

        ApiMethodModelHelper.DelayedParams params = new ApiMethodModelHelper.DelayedParams() {
            @Override
            public Map buildParams() {
                Map params = new HashMap();
                params.put("addressId", addressId);
                return params;
            }
        };

        final int finalRemovedIndex = removedIndex;
        final MeetsAddress finalRemovedAddress = removedAddress;

        forceNextCacheToBe(false);
        pushMethod(new CustomerAddressDelete(), params)
                .fail(new FailCallback() {
                    @Override
                    public void onFail(Object result) {
                        if (finalRemovedAddress != null)
                            getAddresses().add(finalRemovedIndex, finalRemovedAddress);
                    }
                })
                .always(triggerListeners);

        return this;
    }

    private void refreshAddressesAfterSave(MeetsAddress savedAddress) {
        boolean addressIsNew = true;
        for (MeetsAddress address : addresses) {
            if (address.getId() == savedAddress.getId()) {
                address.shallowCopyFrom(savedAddress);
                addressIsNew = false;
            }
            else {
                if (savedAddress.isDefaultBilling() && address.isDefaultBilling())
                    address.setDefaultBilling(false);
                if (savedAddress.isDefaultShipping() && address.isDefaultShipping())
                    address.setDefaultShipping(false);
            }
        }
        if (addressIsNew)
            addresses.add(savedAddress);
    }

    @Override
    public MeetsCustomer setFirstName(String firstName) {
        this.firstname = firstName;
        return this;
    }

    @Override
    public MeetsCustomer setLastName(String lastname) {
        this.lastname = lastname;
        return this;
    }

    @Override
    public MeetsCustomer setEmail(String email) {
        this.email = email;
        return this;
    }

    @Override
    public MeetsCustomer setVatNumber(String taxvat) {
        this.taxvat = taxvat;
        return this;
    }

    @Override
    public MeetsCustomer setPassword(String password) {
        this.password = password;
        return this;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy