diff --git a/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php new file mode 100644 index 0000000..af8d977 --- /dev/null +++ b/backend/app/plugins/wiaas/includes/api/class-wiaas-rest-customer.php @@ -0,0 +1,175 @@ +\d+)/profile-addresses', array( + 'methods' => 'PUT', + 'callback' => array(__CLASS__, 'update_customer_profile_addresses'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + register_rest_route( self::$namespace, 'customer/(?P\d+)/profile-addresses', array( + 'methods' => 'POST', + 'callback' => array(__CLASS__, 'delete_customer_profile_address'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + register_rest_route( self::$namespace, 'customer/(?P\d+)/billing-addresses', array( + 'methods' => 'PUT', + 'callback' => array(__CLASS__, 'update_customer_billing_addresses'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + register_rest_route( self::$namespace, 'customer/(?P\d+)/billing-addresses', array( + 'methods' => 'POST', + 'callback' => array(__CLASS__, 'delete_customer_billing_addresses'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + register_rest_route( self::$namespace, 'customer/(?P\d+)/personal-info', array( + 'methods' => 'PUT', + 'callback' => array(__CLASS__, 'update_customer_personal_info'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + register_rest_route( self::$namespace, 'customer/(?P\d+)/company-info', array( + 'methods' => 'PUT', + 'callback' => array(__CLASS__, 'update_customer_company_info'), + 'permission_callback' => 'is_user_logged_in' + ) ); + + } + + + + public static function update_customer_profile_addresses(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + $new_address = json_decode($params['profile_address']); + + if (!Wiaas_Customer::update_customer_profile_addresses($customer_id, $new_address)){ + return self::generate_wiaas_response('PROFILE_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('PROFILE_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + } + + public static function delete_customer_profile_address(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + $address_id = $params['address_id']; + + if (!Wiaas_Customer::delete_customer_profile_address($customer_id, $address_id)){ + return self::generate_wiaas_response('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + } + + public static function update_customer_billing_addresses(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + $new_address = json_decode($params['billing_address']); + + if (!Wiaas_Customer::update_customer_billing_addresses($customer_id, $new_address)){ + return self::generate_wiaas_response('BILLING_ADDRESS_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('BILLING_ADDRESS_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + + } + + public static function delete_customer_billing_addresses(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + $address_id = json_decode($params['address_id']); + + if (!Wiaas_Customer::delete_customer_billing_address($customer_id, $address_id)){ + return self::generate_wiaas_response('ADDRESS_ERROR', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('ADDRESS_REMOVED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + } + + public static function update_customer_personal_info(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + + $first_name = $params['first_name']; + $last_name = $params['last_name']; + $phone = $params['phone']; + $name = $first_name . ' ' . $last_name; + + if (!is_string($name) || strlen($name) < 1){ + return self::generate_wiaas_response('ADD_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + if (!is_string($phone) || strlen($phone) < 1){ + return self::generate_wiaas_response('ADD_PHONE_NUMBER', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + if (!Wiaas_Customer::update_customer_profile_info($customer_id, $first_name, $last_name, $phone)){ + return self::generate_wiaas_response('PROFILE_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('PROFILE_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + } + + public static function update_customer_company_info(WP_REST_Request $request){ + $customer_id = $request['id']; + $params = $request->get_body_params(); + + $company_name = $params['company_name']; + $vat_code = $params['vat_code']; + + + if (!is_string($company_name) || strlen($company_name) < 1){ + return self::generate_wiaas_response('ADD_COPMANY_NAME', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + if (!is_string($vat_code) || strlen($vat_code) < 1){ + return self::generate_wiaas_response('ADD_VAT', 'error', Wiaas_Customer::get_customer_info($customer_id)); + } + + if (!Wiaas_Customer::update_customer_company_info($customer_id, $company_name, $vat_code)){ + return self::generate_wiaas_response('COMPANY_NOT_CHANGED', 'warning', Wiaas_Customer::get_customer_info($customer_id)); + } + + return self::generate_wiaas_response('COMPANY_UPDATED', 'success', Wiaas_Customer::get_customer_info($customer_id)); + + + } + + + + + private static function generate_wiaas_response($message, $code, $data = NULL){ + $response = array( + 'messages' => [ + array( + 'code' => $code, + 'message' => $message + ) + ], + 'data' => $data + ); + + return new WP_REST_Response($response); + } + + +} \ No newline at end of file diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-api.php b/backend/app/plugins/wiaas/includes/class-wiaas-api.php index 5e3089f..574a7bc 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-api.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-api.php @@ -38,6 +38,9 @@ class Wiaas_API { #User controller include_once dirname( __FILE__ ) . '/api/class-wiaas-rest-user-api.php'; + #Customer controller + include_once dirname( __FILE__ ) . '/api/class-wiaas-rest-customer.php'; + } public static function register_rest_routes() { @@ -45,7 +48,8 @@ class Wiaas_API { 'Wiass_REST_Delivery_Process_API', 'Wiaas_Cart_API', 'Wiaas_Document_API', - 'Wiass_REST_User_API' + 'Wiass_REST_User_API', + 'Wiaas_REST_Customer_API' ); foreach ( $controllers as $controller ) { diff --git a/backend/app/plugins/wiaas/includes/class-wiaas-user.php b/backend/app/plugins/wiaas/includes/class-wiaas-user.php index b5043d5..f61fcb1 100644 --- a/backend/app/plugins/wiaas/includes/class-wiaas-user.php +++ b/backend/app/plugins/wiaas/includes/class-wiaas-user.php @@ -9,158 +9,15 @@ class Wiaas_User { public static function init() { include_once dirname( __FILE__ ) . '/class-wiaas-countries.php'; + include_once dirname( __FILE__ ) . '/user/class-wiaas-customer.php'; add_action('init', array(__CLASS__, 'load_user_organization')); add_action('plugins_loaded', array(__CLASS__, 'remove_default_user_groups'), 30); - add_action('woocommerce_rest_insert_customer', array(__CLASS__, 'add_meta_data_to_customer'), 10, 3); - + add_filter('woocommerce_rest_prepare_customer', array(__CLASS__, 'transform_rest_customer'), 10, 3); add_filter('jwt_auth_token_before_dispatch', array(__CLASS__, 'transform_jwt_token_response'), 10, 2); } - /** - * Fires after a customer is created or updated via the REST API. - * - * @param WP_User $customer Data used to create the customer. - * @param WP_REST_Request $request Request object. - * @param boolean $creating True when creating customer, false when updating customer. - */ - public static function add_meta_data_to_customer($customer, $request, $creating){ - if (isset($request['phone'])){ - update_user_meta( $customer->ID, 'phone', $request['phone'] ); - } - - if (isset($request['vatCode'])){ - update_user_meta( $customer->ID, 'vat_code', $request['vatCode']); - } - - if (isset($request['companyName'])){ - update_user_meta( $customer->ID, 'company_name', $request['companyName']); - } - - if (isset($request['deliveryAddress'])){ - $received_address = json_decode($request['deliveryAddress']); - if (!self::validate_address($received_address)){ - return false; - } - $profile_addresses = get_user_meta($customer->ID, 'profile_addresses', true) ?: []; - - if ($received_address->id){ - $updated = array( - 'id' => $received_address->id, - 'countryName' => Wiaas_Countries::get_country_name_by_id($received_address->idCountrySelected), - 'deliveryMail' => $received_address->deliveryMail, - 'idCountrySelected' => $received_address->idCountrySelected, - 'city' => $received_address->city, - 'detailedAddress' => $received_address->detailedAddress, - 'zipCode' => $received_address->zipCode, - 'firstName' => $received_address->firstName, - 'lastName' => $received_address->lastName, - 'deliveryMail' => $received_address->deliveryMail - ); - foreach($profile_addresses as $key => $address){ - if ($address['id'] === $received_address->id){ - $profile_addresses[$key] = $updated; - break; - } - } - }else{ - $new_delivery_address = array( - 'id' => time(), - 'countryName' => Wiaas_Countries::get_country_name_by_id($received_address->idCountrySelected), - 'deliveryMail' => $received_address->deliveryMail, - 'idCountrySelected' => $received_address->idCountrySelected, - 'city' => $received_address->city, - 'detailedAddress' => $received_address->detailedAddress, - 'zipCode' => $received_address->zipCode, - 'firstName' => $received_address->firstName, - 'lastName' => $received_address->lastName, - 'deliveryMail' => $received_address->deliveryMail - ); - - array_push($profile_addresses, $new_delivery_address); - } - - update_user_meta( $customer->ID, 'profile_addresses', $profile_addresses); - } - - if (isset($request['billingAddress'])){ - $received_address = json_decode($request['billingAddress']); - if (!self::validate_address($received_address)){ - return false; - } - $billing_addresses = get_user_meta($customer->ID, 'billing_addresses', true) ?: []; - - if ($received_address->id){ - $updated = array( - 'id' => $received_address->id, - 'countryName' => Wiaas_Countries::get_country_name_by_id($received_address->idCountrySelected), - 'deliveryMail' => $received_address->deliveryMail, - 'idCountrySelected' => $received_address->idCountrySelected, - 'city' => $received_address->city, - 'detailedAddress' => $received_address->detailedAddress, - 'zipCode' => $received_address->zipCode, - 'firstName' => $received_address->firstName, - 'lastName' => $received_address->lastName, - 'invoiceMail' => $received_address->invoiceMail - ); - foreach($billing_addresses as $key => $address){ - if ($address['id'] === $received_address->id){ - $billing_addresses[$key] = $updated; - break; - } - } - }else{ - $new_billing_address = array( - 'id' => time(), - 'countryName' => Wiaas_Countries::get_country_name_by_id($received_address->idCountrySelected), - 'deliveryMail' => $received_address->deliveryMail, - 'idCountrySelected' => $received_address->idCountrySelected, - 'city' => $received_address->city, - 'detailedAddress' => $received_address->detailedAddress, - 'zipCode' => $received_address->zipCode, - 'firstName' => $received_address->firstName, - 'lastName' => $received_address->lastName, - 'invoiceMail' => $received_address->invoiceMail - ); - - array_push($billing_addresses, $new_billing_address); - } - - update_user_meta( $customer->ID, 'billing_addresses', $billing_addresses); - } - - if (isset($request['removeDeliveryAddress'])){ - $addressID = $request['removeDeliveryAddress']; - $profile_addresses = get_user_meta($customer->ID, 'profile_addresses', true) ?: []; - $counter = 0; - foreach($profile_addresses as $key => $address){ - if ($address['id'] == $addressID){ - array_splice($profile_addresses, $counter, 1); - break; - } - $counter++; - } - update_user_meta( $customer->ID, 'profile_addresses', $profile_addresses); - } - - if (isset($request['removeBillingAddress'])){ - $addressID = $request['removeBillingAddress']; - $billing_addresses = get_user_meta($customer->ID, 'billing_addresses', true) ?: []; - $counter = 0; - foreach($billing_addresses as $key => $address){ - if ($address['id'] == $addressID){ - array_splice($billing_addresses, $counter, 1); - break; - } - $counter++; - } - - update_user_meta( $customer->ID, 'billing_addresses', $billing_addresses); - } - - } - public static function load_user_organization() { if (class_exists('WP_User_Taxonomy')) { require_once dirname( __FILE__ ) . '/user/class-wiaas-user-organization.php'; @@ -186,21 +43,9 @@ class Wiaas_User { public static function transform_rest_customer($response, $order, $request) { $data = $response->get_data(); $user_id = $data['id']; - $result = array( - 'id' => $user_id, - 'idCompany' => 0, - 'isCompanyAdmin' => 1, - 'mail' => $data['email'], - 'name' => $data['first_name'] . ' ' . $data['last_name'], - 'phone' => get_user_meta($user_id, 'phone', true), - 'companyName' => get_user_meta($user_id, 'company_name', true), - 'vatCode' => get_user_meta($user_id, 'vat_code', true), - 'billingAddresses' => get_user_meta($user_id, 'billing_addresses', true) ?: [], - 'profileAddresses' => get_user_meta($user_id, 'profile_addresses', true) ?: [], - 'userType' => $data['role'] - ); + $customer_info = Wiaas_Customer::get_customer_info($user_id); - return new WP_REST_Response($result); + return new WP_REST_Response($customer_info); } /** @@ -225,25 +70,6 @@ class Wiaas_User { } - /** - * Check if address is valid - * - * @param $address - * - * @return mixed - */ - private static function validate_address($address){ - if (empty($address->city)){ - return false; - } - - if (empty($address->detailedAddress)){ - return false; - } - - return is_numeric($address->zipCode); - } - } diff --git a/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php b/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php new file mode 100644 index 0000000..5e78abf --- /dev/null +++ b/backend/app/plugins/wiaas/includes/user/class-wiaas-customer.php @@ -0,0 +1,217 @@ + $customer_id, + 'company_id' => self::get_customer_company_id($customer_id), + 'is_company_admin' => self::get_customer_company_admin_status($customer_id), + 'mail' => $user->user_email, + 'name' => $user->first_name . ' ' . $user->last_name, + 'phone' => self::get_customer_phone_number($customer_id), + 'company_name' => self::get_customer_company_name($customer_id), + 'vat_code' => self::get_customer_vat_code($customer_id), + 'billing_addresses' => self::get_customer_billing_addresses($customer_id), + 'profile_addresses' => self::get_customer_profile_addresses($customer_id), + 'user_type' => $user->roles + ); + + return $result; + } + + public static function get_customer_profile_addresses($customer_id){ + return get_user_meta($customer_id, 'profile_addresses', true) ?: []; + } + + public static function get_customer_billing_addresses($customer_id){ + return get_user_meta($customer_id, 'billing_addresses', true) ?: []; + } + + public static function get_customer_vat_code($customer_id){ + return get_user_meta($customer_id, 'vat_code', true) ?: ''; + } + + public static function get_customer_company_name($customer_id){ + return get_user_meta($customer_id, 'company_name', true) ?: ''; + } + + public static function get_customer_company_id($customer_id){ + return 0; //TODO: don't hardocde this + } + + public static function get_customer_company_admin_status($customer_id){ + return 1; //TODO: don't hardcode this + } + + public static function get_customer_phone_number($customer_id){ + return get_user_meta($customer_id, 'phone', true) ?: ''; + } + + public static function update_customer_profile_info($customer_id, $first_name, $last_name, $phone){ + $user = array( + 'ID' => $customer_id, + 'first_name' => $first_name, + 'last_name' => $last_name + ); + + if (is_wp_error(wp_update_user($user))){ + return false; + } + update_user_meta( $customer_id, 'phone', $phone); + + return true; + } + + public static function update_customer_company_info($customer_id, $company_name, $vat_code){ + $result = update_user_meta( $customer_id, 'company_name', $company_name); + return $result || update_user_meta( $customer_id, 'vat_code', $vat_code ); + } + + public static function update_customer_billing_addresses($customer_id, $new_address){ + if (!self::validate_address($new_address)){ + return false; + } + $billing_addresses = self::get_customer_billing_addresses($customer_id); + + if ($new_address->id){ + $updated = array( + 'id' => $new_address->id, + 'countryName' => Wiaas_Countries::get_country_name_by_id($new_address->idCountrySelected), + 'deliveryMail' => $new_address->deliveryMail, + 'idCountrySelected' => $new_address->idCountrySelected, + 'city' => $new_address->city, + 'detailedAddress' => $new_address->detailedAddress, + 'zipCode' => $new_address->zipCode, + 'firstName' => $new_address->firstName, + 'lastName' => $new_address->lastName, + 'invoiceMail' => $new_address->invoiceMail + ); + foreach($billing_addresses as $key => $address){ + if ($address['id'] === $new_address->id){ + $billing_addresses[$key] = $updated; + break; + } + } + }else{ + $new_billing_address = array( + 'id' => time(), + 'countryName' => Wiaas_Countries::get_country_name_by_id($new_address->idCountrySelected), + 'deliveryMail' => $new_address->deliveryMail, + 'idCountrySelected' => $new_address->idCountrySelected, + 'city' => $new_address->city, + 'detailedAddress' => $new_address->detailedAddress, + 'zipCode' => $new_address->zipCode, + 'firstName' => $new_address->firstName, + 'lastName' => $new_address->lastName, + 'invoiceMail' => $new_address->invoiceMail + ); + + array_push($billing_addresses, $new_billing_address); + } + + return update_user_meta( $customer_id, 'billing_addresses', $billing_addresses); + } + + public static function update_customer_profile_addresses($customer_id, $new_address){ + if (!self::validate_address($new_address)){ + return false; + } + $profile_addresses = self::get_customer_profile_addresses($customer_id); + + if ($new_address->id){ + $updated = array( + 'id' => $new_address->id, + 'countryName' => Wiaas_Countries::get_country_name_by_id($new_address->idCountrySelected), + 'deliveryMail' => $new_address->deliveryMail, + 'idCountrySelected' => $new_address->idCountrySelected, + 'city' => $new_address->city, + 'detailedAddress' => $new_address->detailedAddress, + 'zipCode' => $new_address->zipCode, + 'firstName' => $new_address->firstName, + 'lastName' => $new_address->lastName, + 'deliveryMail' => $new_address->deliveryMail + ); + foreach($profile_addresses as $key => $address){ + if ($address['id'] === $new_address->id){ + $profile_addresses[$key] = $updated; + break; + } + } + }else{ + $new_delivery_address = array( + 'id' => time(), + 'countryName' => Wiaas_Countries::get_country_name_by_id($new_address->idCountrySelected), + 'deliveryMail' => $new_address->deliveryMail, + 'idCountrySelected' => $new_address->idCountrySelected, + 'city' => $new_address->city, + 'detailedAddress' => $new_address->detailedAddress, + 'zipCode' => $new_address->zipCode, + 'firstName' => $new_address->firstName, + 'lastName' => $new_address->lastName, + 'deliveryMail' => $new_address->deliveryMail + ); + + array_push($profile_addresses, $new_delivery_address); + } + + return update_user_meta( $customer_id, 'profile_addresses', $profile_addresses); + } + + public static function delete_customer_profile_address($customer_id, $address_id){ + $profile_addresses = self::get_customer_profile_addresses($customer_id); + $counter = 0; + foreach($profile_addresses as $key => $address){ + if ($address['id'] == $address_id){ + array_splice($profile_addresses, $counter, 1); + break; + } + $counter++; + } + return update_user_meta( $customer_id, 'profile_addresses', $profile_addresses); + } + + public static function delete_customer_billing_address($customer_id, $address_id){ + $billing_addresses = self::get_customer_billing_addresses($customer_id); + $counter = 0; + foreach($billing_addresses as $key => $address){ + if ($address['id'] == $address_id){ + array_splice($billing_addresses, $counter, 1); + break; + } + $counter++; + } + return update_user_meta( $customer_id, 'billing_addresses', $billing_addresses); + } + + /** + * Check if address is valid + * + * @param $address + * + * @return bool + */ + private static function validate_address($address){ + if (empty($address->city)){ + return false; + } + + if (empty($address->detailedAddress)){ + return false; + } + + return is_numeric($address->zipCode); + } + + +} \ No newline at end of file