Changeset 2982366
- Timestamp:
- 10/23/2023 03:26:07 AM (2 years ago)
- Location:
- robust-user-search/trunk
- Files:
-
- 4 added
- 10 edited
-
api/edit-single-user.php (modified) (5 diffs)
-
api/list-all-roles.php (modified) (3 diffs)
-
api/list-all-users.php (modified) (4 diffs)
-
api/list-single-user.php (modified) (4 diffs)
-
constants.php (modified) (1 diff)
-
controller (added)
-
controller/index.php (added)
-
controller/settings.php (added)
-
controller/user.php (added)
-
helper/Helper.php (modified) (1 diff)
-
includes/activation.php (modified) (1 diff)
-
includes/deactivate.php (modified) (1 diff)
-
readme.txt (modified) (2 diffs)
-
robust-user-search.php (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
robust-user-search/trunk/api/edit-single-user.php
r2379176 r2982366 3 3 4 4 use Rus\Helper\RusHelper; 5 use Rus\Helper\RusValidation; 6 5 7 /** 6 8 * RestApi Class to edit user data … … 21 23 RusHelper::checkSecurity(); 22 24 23 register_rest_route( 'r su/v1', '/user/(?P<id>\d+)', array(25 register_rest_route( 'rus/v1', '/user/(?P<id>\d+)', array( 24 26 'methods' => 'PUT', 25 27 'callback' => [$this,'processRequest'], … … 38 40 * @param string $company 39 41 * @param string $phone 42 * @param string $billing_country 40 43 * @return json $data[] 41 44 */ 42 45 public function processRequest(\WP_REST_Request $request){ 43 44 $check_nonce = RusHelper::checkNonce($request); 45 if(!$check_nonce){ 46 return new \WP_REST_Response(['status_code' => 400, 'message' => "You dont have permission to view all roles"], 400); 47 } 46 RusHelper::checkNonceApi($request); 48 47 49 48 extract($request->get_params()); … … 52 51 53 52 // Validate Request 54 if ( ! self::validateNames(sanitize_text_field($first_name)) ){53 if ( !RusValidation::validateNames(sanitize_text_field($first_name)) ){ 55 54 return new \WP_REST_Response(['status_code' => 400, 'message' => "Invalid first name"], 400); 56 } elseif ( ! self::validateNames(sanitize_text_field($last_name))){55 } elseif ( !RusValidation::validateNames(sanitize_text_field($last_name))){ 57 56 return new \WP_REST_Response(['status_code' => 400, 'message' => "Invalid last name"], 400); 58 } elseif ( ! filter_var(sanitize_email($email), FILTER_VALIDATE_EMAIL) ){57 } elseif ( !RusValidation::validateEmail(sanitize_email($email)) ){ 59 58 return new \WP_REST_Response(['status_code' => 400, 'message' => "Invalid email address"], 400); 60 } elseif ( ! self::validatePhone(sanitize_text_field($phone))){59 } elseif ( !RusValidation::validatePhone(sanitize_text_field($phone))){ 61 60 return new \WP_REST_Response(['status_code' => 400, 'message' => "Invalid phone number"], 400); 61 } elseif ( !RusValidation::validateCountryCode(sanitize_text_field($billing_country))){ 62 return new \WP_REST_Response(['status_code' => 400, 'message' => "Invalid country code"], 400); 62 63 } 63 64 64 $data['ID'] =$id;65 $data['first_name'] =sanitize_text_field($first_name);66 $data['last_name'] =sanitize_text_field($last_name);67 $data['user_email'] =sanitize_email($email);65 $data['ID'] = $id; 66 $data['first_name'] = sanitize_text_field($first_name); 67 $data['last_name'] = sanitize_text_field($last_name); 68 $data['user_email'] = sanitize_email($email); 68 69 69 70 $user_data = wp_update_user($data); 70 $user_data = wp_update_user($data); 71 71 72 $data = []; 73 $data['billing_company']=sanitize_text_field($company); 74 $data['billing_phone']=sanitize_text_field($phone); 72 $data = []; 73 $data['billing_company'] = sanitize_text_field($company); 74 $data['billing_country'] = sanitize_text_field($billing_country); 75 $data['billing_phone'] = sanitize_text_field($phone); 75 76 76 77 foreach($data as $key => $meta){ 77 $user_meta =update_user_meta($id, $key, $meta);78 update_user_meta($id, $key, $meta); 78 79 } 79 80 … … 85 86 return new \WP_REST_Response(['status_code' => 200, 'message' => "User data updated successfully"], 200); 86 87 } 87 88 88 } 89 90 /**91 * Validate names92 *93 * @param string $val94 * @return boolean95 */96 private function validateNames($val){97 if (empty(trim($val))) { return true; }98 if(preg_match ("/^[a-zA-Z\s]+$/",trim($val)) && strlen(trim($val)) <= 25) {99 return true;100 } else {101 return false;102 }103 }104 105 /**106 * Validate phone number107 *108 * @param string $val109 * @return boolean110 */111 private function validatePhone($val){112 if (empty(trim($val))) { return true; }113 if(preg_match("/^[0-9]{10}$/", trim($val)) && strlen(trim($val)) == 10){114 return true;115 } else {116 return false;117 }118 }119 120 89 } -
robust-user-search/trunk/api/list-all-roles.php
r2379176 r2982366 21 21 RusHelper::checkSecurity(); 22 22 23 register_rest_route( 'r su/v1', '/roles', array(23 register_rest_route( 'rus/v1', '/roles', array( 24 24 'methods' => 'GET', 25 25 'callback' => [$this,'processRequest'], … … 36 36 * @return json $data[] 37 37 */ 38 public function processRequest(\WP_REST_Request $request) { 39 40 RusHelper::checkSecurity(); 41 42 $check_nonce = RusHelper::checkNonce($request); 43 if(!$check_nonce){ 44 return new \WP_REST_Response(['status_code' => 400, 'message' => "You dont have permission to view all roles"], 400); 45 } 38 function processRequest(\WP_REST_Request $request) { 39 RusHelper::checkNonceApi($request); 46 40 47 41 global $wp_roles; … … 52 46 return new \WP_REST_Response($editable_roles, 200); 53 47 } 54 55 56 57 48 } -
robust-user-search/trunk/api/list-all-users.php
r2379176 r2982366 21 21 RusHelper::checkSecurity(); 22 22 23 register_rest_route( 'r su/v1', '/all', array(23 register_rest_route( 'rus/v1', '/all', array( 24 24 'methods' => 'GET', 25 25 'callback' => [$this,'processRequest'], … … 33 33 * List all users 34 34 * 35 * @param string $role 35 * @param int $page 36 * @param int $page_size 37 * @param string|null $sort_by 38 * @param string $search_text 36 39 * @return json $data[] 37 40 */ 38 41 function processRequest(\WP_REST_Request $request){ 39 40 $check_nonce = RusHelper::checkNonce($request); 41 if(!$check_nonce){ 42 return new \WP_REST_Response(['status_code' => 400, 'message' => "You dont have permission to view all roles"], 400); 43 } 42 RusHelper::checkNonceApi($request); 44 43 45 44 extract($request->get_params()); 46 $DBRecord = array(); 47 $args = array( 48 'orderby' => 'first_name', 49 'order' => 'ASC' 50 ); 51 if(isset($role)){ 52 $args = array( 53 'orderby' => 'first_name', 54 'order' => 'ASC', 55 'role' => $role 56 ); 57 } 58 $users = get_users( $args ); 45 46 global $wpdb; 47 $DBRecord = []; 48 49 // Pagination 50 $page = isset($page) ? $page : 1; 51 $page_size = isset($page_size) ? $page_size : 10; 52 $offset = ($page - 1) * $page_size; 53 54 // Sorting 55 $sort_order = isset($sort_order) ? strtoupper($sort_order) : 'ASC'; 56 $sort_by = self::mapTableColumns($sort_by, "t1", "t2"); 57 58 // Search 59 $search_text = self::filterNull($search_text); 60 $role = self::filterNull($role); 61 62 $sql_on = " 63 t1.ID = t2.user_id 64 AND (t2.meta_value LIKE '%$role%' AND t2.meta_key = 'wp_capabilities') 65 "; 66 $sql_where = " 67 t1.user_login LIKE '%$search_text%' 68 OR t1.user_email LIKE '%$search_text%' 69 OR t1.user_nicename LIKE '%$search_text%' 70 OR t1.display_name LIKE '%$search_text%' 71 "; 72 73 $sql = " 74 SELECT * FROM {$wpdb->users} as t1 75 INNER JOIN {$wpdb->usermeta} as t2 76 ON ($sql_on) 77 WHERE 78 $sql_where 79 GROUP BY t2.user_id 80 ORDER BY $sort_by $sort_order 81 LIMIT $offset, $page_size 82 "; 83 84 $users = $wpdb->get_results($sql); 85 86 // Get total records 87 $sql_for_total_count = " 88 SELECT COUNT(*) FROM {$wpdb->users} as t1 89 INNER JOIN {$wpdb->usermeta} as t2 90 ON ($sql_on) 91 WHERE 92 $sql_where 93 GROUP BY t2.user_id 94 "; 95 $total_count_result = count($wpdb->get_results($sql_for_total_count)); 96 97 $DBRecord['total'] = (int) $total_count_result; 98 $DBRecord['page'] = (int) $page; 99 $DBRecord['page_size'] = (int) $page_size; 100 $DBRecord['users'] = array(); 59 101 $i=0; 60 102 61 103 foreach ( $users as $user ) 62 104 { 63 $DBRecord[$i]['roles'] = self::filterNull($user->roles); 64 $DBRecord[$i]['username'] = self::filterNull($user->user_login); 65 $DBRecord[$i]['id'] = self::filterNull($user->ID); 66 $DBRecord[$i]['first_name'] = self::filterNull($user->first_name); 67 $DBRecord[$i]['last_name'] = self::filterNull($user->last_name); 68 $DBRecord[$i]['user_registered'] = self::filterNull($user->user_registered); 69 $DBRecord[$i]['email'] = self::filterNull($user->user_email); 105 $record = array(); 106 $record['roles'] = self::filterNull($user->roles); 107 $record['username'] = self::filterNull($user->user_login); 108 $record['id'] = self::filterNull($user->ID); 109 $record['user_registered'] = self::filterNull($user->user_registered); 110 $record['email'] = self::filterNull($user->user_email); 70 111 71 112 $UserData = get_user_meta( $user->ID ); 72 $DBRecord[$i]['billing_company'] = self::filterNull($UserData['billing_company'][0]); 73 $DBRecord[$i]['billing_address_1'] = self::filterNull($UserData['billing_address_1'][0]); 74 $DBRecord[$i]['billing_city'] = self::filterNull($UserData['billing_city'][0]); 75 $DBRecord[$i]['billing_state'] = self::filterNull($UserData['billing_state'][0]); 76 $DBRecord[$i]['billing_postcode'] = self::filterNull($UserData['billing_postcode'][0]); 77 $DBRecord[$i]['billing_country'] = self::filterNull($UserData['billing_country'][0]); 78 $DBRecord[$i]['billing_phone'] = self::filterNull($UserData['billing_phone'][0]); 113 114 // https://regex101.com/library/3q3RYF - smit 115 // a:1:{s:11:"contributor";b:1;} ==to==> ["contributor"] 116 $re = '/"([^"]+)"/'; 117 preg_match_all($re, $user->meta_value, $matches, PREG_SET_ORDER, 0); 118 if ($matches) { 119 $record['roles'] = []; 120 foreach ($matches as $key => $value) { 121 array_push($record['roles'], $value[1]); 122 } 123 } 124 125 $record['first_name'] = self::filterNullFirst($UserData['first_name']); 126 $record['last_name'] = self::filterNullFirst($UserData['last_name']); 127 $record['billing_company'] = self::filterNullFirst($UserData['billing_company']); 128 $record['billing_address_1'] = self::filterNullFirst($UserData['billing_address_1']); 129 $record['billing_city'] = self::filterNullFirst($UserData['billing_city']); 130 $record['billing_state'] = self::filterNullFirst($UserData['billing_state']); 131 $record['billing_postcode'] = self::filterNullFirst($UserData['billing_postcode']); 132 $record['billing_country'] = self::filterNullFirst($UserData['billing_country']); 133 $record['billing_phone'] = self::filterNullFirst($UserData['billing_phone']); 134 $DBRecord['users'][$i] = $record; 79 135 $i++; 80 136 } … … 86 142 * 87 143 * @param mixed $val 88 * @return json $data[]144 * @return string "" 89 145 */ 90 146 protected function filterNull($val){ … … 95 151 } 96 152 } 153 154 /** 155 * Filter null values 156 * 157 * @param mixed $val 158 * @return string or NULL 159 */ 160 protected function filterIsSetNull($val){ 161 if(isset($val)) { 162 return $val; 163 } else { 164 return NULL; 165 } 166 } 167 168 /** 169 * Filter null values and return first value 170 * 171 * @param mixed $val 172 * @return string or "" 173 */ 174 protected function filterNullFirst($val){ 175 if(!isset($val) || $val===NULL || !isset($val[0]) || $val[0]===NULL) { 176 return ""; 177 } else { 178 return $val[0]; 179 } 180 } 181 182 /** 183 * Parse sort by text 184 * 185 * @param string $column_name 186 * @param string $users_table 187 * @param string $usermeta_table 188 * @return string 189 */ 190 protected function mapTableColumns($column_name, $users_table, $usermeta_table) { 191 $sort = strtolower(self::filterNull($column_name)); 192 193 $sort_map = [ 194 'username' => "$users_table.user_login", 195 'email' => "$users_table.user_email", 196 'first_name' => "$users_table.user_nicename", 197 'last_name' => "$users_table.user_login", 198 ]; 199 200 if (isset($sort_map[$sort])) { 201 return $sort_map[$sort]; 202 } 203 return "$usermeta_table.meta_value"; 204 } 97 205 } -
robust-user-search/trunk/api/list-single-user.php
r2379176 r2982366 10 10 * @author Smit Patel <smitpatel.dev@gmail.com> 11 11 */ 12 class RusRestApiGet SingleUser {12 class RusRestApiGetUser { 13 13 14 14 /** … … 21 21 RusHelper::checkSecurity(); 22 22 23 register_rest_route( 'r su/v1', '/user/(?P<id>\d+)', array(23 register_rest_route( 'rus/v1', '/user/(?P<id>\d+)', array( 24 24 'methods' => 'GET', 25 25 'callback' => [$this,'processRequest'], … … 37 37 */ 38 38 function processRequest(\WP_REST_Request $request){ 39 40 $check_nonce = RusHelper::checkNonce($request); 41 if(!$check_nonce){ 42 return new \WP_REST_Response(['status_code' => 400, 'message' => "You dont have permission to view all roles"], 400); 43 } 39 RusHelper::checkNonceApi($request); 44 40 45 41 extract($request->get_params()); … … 68 64 return new \WP_REST_Response($DBRecord, 200); 69 65 } 70 71 72 66 } -
robust-user-search/trunk/constants.php
r2916451 r2982366 21 21 define('RUS_MINIMUM_WP_REQUIRED_VERSION', 5.2); 22 22 define('RUS_DIRECTORY', __DIR__); 23 define('RUS_FILE_PATH', __FILE__);24 23 define('RUS_WP_CURRENT_VERSION', $wp_version); 25 24 define('RUS_CAPABILITY', 'robust_user_search'); 26 define('RUS_MENU_ICON_URL', plugins_url('assets/robust_teal.svg', __FILE__)); 25 define('RUS_MENU_ICON_URL', plugins_url('/assets/robust_teal.svg', __FILE__)); 26 define('RUS_FAVICON_URL', plugins_url('/dist/favicon.ico', __FILE__)); 27 27 28 define('RUS_DIST_CSS_APP', plugins_url('/dist/css/app.css', __FILE__)); 29 define('RUS_DIST_JS_MANIFEST', plugins_url('/dist/js/manifest.js', __FILE__)); 30 define('RUS_DIST_JS_VENDOR', plugins_url('/dist/js/vendor.js', __FILE__)); 31 define('RUS_DIST_JS_APP', plugins_url('/dist/js/app.js', __FILE__)); 32 define('RUS_FONTS', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500&display=swap'); 28 define('RUS_DIST_CSS_APP', plugins_url('/dist/assets/index.css', __FILE__)); 29 define('RUS_DIST_JS_APP', plugins_url('/dist/assets/index.js', __FILE__)); 33 30 } 34 35 31 } -
robust-user-search/trunk/helper/Helper.php
r2379176 r2982366 43 43 return wp_verify_nonce($request->get_header('X-WP-Nonce'), 'wp_rest'); 44 44 } 45 46 /** 47 * Check Nonce for API 48 * 49 * @param WP_REST_Request $request 50 * @return null|json $data[] 51 */ 52 public static function checkNonceApi($request){ 53 if(!self::checkNonce($request)){ 54 return new \WP_REST_Response(['status_code' => 400, 'message' => "You dont have permission to do this action."], 400); 55 } 56 return null; 57 } 45 58 } -
robust-user-search/trunk/includes/activation.php
r2379176 r2982366 20 20 public function __construct($file){ 21 21 RusHelper::checkSecurity(); 22 register_activation_hook( $file, [$this, 'activate']);22 register_activation_hook($file, [$this, 'activate']); 23 23 } 24 24 -
robust-user-search/trunk/includes/deactivate.php
r2379176 r2982366 20 20 public function __construct($file){ 21 21 RusHelper::checkSecurity(); 22 register_deactivation_hook( $file, [$this, 'deactivate']);22 register_deactivation_hook($file, [$this, 'deactivate']); 23 23 } 24 24 -
robust-user-search/trunk/readme.txt
r2916451 r2982366 5 5 Requires at least: 5.2 6 6 Tested up to: 6.2.1 7 Stable tag: 1. 0.67 Stable tag: 1.1.0 8 8 License: GPLv3 9 9 … … 112 112 == Changelog == 113 113 114 = 1.1.0 = 115 - Major next release. 116 - Rewrite using Typescript & Vue 3.3. 117 - UI updates. 118 - Validation update. 119 - Upgraded to vite for improving developer experience. 120 - Keyboard shortcuts added. 121 - More keyboard accessibility. 122 - Zod validation added. 123 - HTML native dialog component for full screen experience. 124 - Support for tablet screen size. 125 - Improved color scheme. 126 - Tailwind upgraded to 3.3.2. 127 - Support for country code. 128 - Sticky headers for accounts table. 129 - Sorting by header button. 130 - Hide columns option. 131 - Smooth animations. 132 114 133 = 1.0.6 = 115 134 - Fixed overlay height. -
robust-user-search/trunk/robust-user-search.php
r2916451 r2982366 7 7 * Author: Smit Patel 8 8 * Author URI: https://smitpatelx.com 9 * Version: 1. 0.69 * Version: 1.1.0 10 10 * Requires at least: 5.2 11 11 * Requires PHP: 7.1 … … 19 19 use Rus\Includes\RusActivation; 20 20 use Rus\Includes\RusDeactivation; 21 use Rus\Controller\RusUser; 21 22 22 use Rus\Api\RusRestApiGetAllUsers;23 use Rus\Api\RusRestApiPutEditUser;24 use Rus\Api\RusRestApiGetSingleUser;25 use Rus\Api\RusRestApiGetRoles;26 23 /** 27 24 * Robust User Search Main Class … … 40 37 public function __construct(){ 41 38 $this->includingFile(); 39 RusHelper::checkSecurity(); 42 40 43 RusHelper::checkSecurity();44 41 new Constants(); 45 42 46 43 $this->checkWpVersion(); 44 $this->registerAllPages(); 47 45 $this->registerHooks(); 48 $this->registerAllPages(); 49 $this->registerRestApi(); 46 $this->registerAllApis(); 50 47 } 51 48 … … 77 74 78 75 require_once(__DIR__.'/helper/Helper.php'); 76 require_once(__DIR__.'/helper/Validation.php'); 79 77 require_once(__DIR__.'/includes/activation.php'); 80 78 require_once(__DIR__.'/includes/deactivate.php'); 81 require_once(__DIR__.'/includes/index-controller.php');82 require_once(__DIR__.'/includes/settings-controller.php');83 79 84 include_once(__DIR__.'/api/list-all-users.php'); 85 include_once(__DIR__.'/api/list-single-user.php'); 86 include_once(__DIR__.'/api/list-all-roles.php'); 87 include_once(__DIR__.'/api/edit-single-user.php'); 80 include_once(__DIR__.'/controller/user.php'); 81 include_once(__DIR__.'/controller/index.php'); 82 include_once(__DIR__.'/controller/settings.php'); 88 83 } 89 84 … … 106 101 */ 107 102 protected function registerAllPages(){ 108 add_action('admin_head', ['Rus\Includes\RusIndexController', 'customFavicon']); 109 add_action('admin_menu', ['Rus\Includes\RusIndexController', 'instance'], 99); 110 add_action('admin_menu', ['Rus\Includes\RusSettingsController', 'instance'], 99); 103 add_action('admin_menu', ['Rus\Controller\RusIndex', 'init'], 99); 104 add_action('admin_menu', ['Rus\Controller\RusSettings', 'init'], 99); 111 105 } 112 106 113 107 /** 114 * Calls to register rest APIs108 * Add action to register pages into admin menu 115 109 * 116 110 * @param none 117 111 * @return none 118 112 */ 119 protected function registerRestApi(){ 120 add_action( 'rest_api_init', function () { 121 new RusRestApiGetAllUsers(); 122 123 new RusRestApiPutEditUser(); 124 125 new RusRestApiGetSingleUser(); 126 127 new RusRestApiGetRoles(); 128 }); 113 protected function registerAllApis(){ 114 $api_routes = new RusUser(); 115 $api_routes->init(); 129 116 } 130 131 117 } 132 118
Note: See TracChangeset
for help on using the changeset viewer.