Plugin Directory

Changeset 2982366


Ignore:
Timestamp:
10/23/2023 03:26:07 AM (2 years ago)
Author:
smitpatelx
Message:

Adding version 1.1.0

Location:
robust-user-search/trunk
Files:
4 added
10 edited

Legend:

Unmodified
Added
Removed
  • robust-user-search/trunk/api/edit-single-user.php

    r2379176 r2982366  
    33
    44use Rus\Helper\RusHelper;
     5use Rus\Helper\RusValidation;
     6
    57/**
    68 * RestApi Class to edit user data
     
    2123        RusHelper::checkSecurity();
    2224
    23         register_rest_route( 'rsu/v1', '/user/(?P<id>\d+)', array(
     25        register_rest_route( 'rus/v1', '/user/(?P<id>\d+)', array(
    2426            'methods' => 'PUT',
    2527            'callback' => [$this,'processRequest'],
     
    3840     * @param string $company
    3941     * @param string $phone
     42     * @param string $billing_country
    4043     * @return json $data[]
    4144     */
    4245    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);
    4847       
    4948        extract($request->get_params());
     
    5251       
    5352        // Validate Request
    54         if ( !self::validateNames(sanitize_text_field($first_name)) ){
     53        if ( !RusValidation::validateNames(sanitize_text_field($first_name)) ){
    5554            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))){
    5756            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)) ){
    5958            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))){
    6160            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);
    6263        }
    6364
    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);
    6869
    69 
    70         $user_data = wp_update_user($data);
     70        $user_data                  = wp_update_user($data);
    7171       
    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);
    7576
    7677        foreach($data as $key => $meta){
    77             $user_meta = update_user_meta($id, $key, $meta);
     78            update_user_meta($id, $key, $meta);
    7879        }
    7980
     
    8586            return new \WP_REST_Response(['status_code' => 200, 'message' => "User data updated successfully"], 200);
    8687        }
    87 
    8888    }
    89 
    90     /**
    91      * Validate names
    92      *
    93      * @param string $val
    94      * @return boolean
    95      */
    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 number
    107      *
    108      * @param string $val
    109      * @return boolean
    110      */
    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 
    12089}
  • robust-user-search/trunk/api/list-all-roles.php

    r2379176 r2982366  
    2121        RusHelper::checkSecurity();
    2222       
    23         register_rest_route( 'rsu/v1', '/roles', array(
     23        register_rest_route( 'rus/v1', '/roles', array(
    2424            'methods' => 'GET',
    2525            'callback' => [$this,'processRequest'],
     
    3636     * @return json $data[]
    3737     */
    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);
    4640
    4741        global $wp_roles;
     
    5246        return new \WP_REST_Response($editable_roles, 200);
    5347    }
    54 
    55    
    56 
    5748}
  • robust-user-search/trunk/api/list-all-users.php

    r2379176 r2982366  
    2121        RusHelper::checkSecurity();
    2222
    23         register_rest_route( 'rsu/v1', '/all', array(
     23        register_rest_route( 'rus/v1', '/all', array(
    2424            'methods' => 'GET',
    2525            'callback' => [$this,'processRequest'],
     
    3333     * List all users
    3434     *
    35      * @param string $role
     35     * @param int $page
     36     * @param int $page_size
     37     * @param string|null $sort_by
     38     * @param string $search_text
    3639     * @return json $data[]
    3740     */
    3841    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);
    4443       
    4544        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();
    59101        $i=0;
    60102
    61103        foreach ( $users as $user )
    62104        {
    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);
    70111
    71112            $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;
    79135            $i++;
    80136        }
     
    86142     *
    87143     * @param mixed $val
    88      * @return json $data[]
     144     * @return string ""
    89145     */
    90146    protected function filterNull($val){
     
    95151        }
    96152    }
     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    }
    97205}
  • robust-user-search/trunk/api/list-single-user.php

    r2379176 r2982366  
    1010 * @author     Smit Patel <smitpatel.dev@gmail.com>
    1111 */
    12 class RusRestApiGetSingleUser {
     12class RusRestApiGetUser {
    1313   
    1414    /**
     
    2121        RusHelper::checkSecurity();
    2222
    23         register_rest_route( 'rsu/v1', '/user/(?P<id>\d+)', array(
     23        register_rest_route( 'rus/v1', '/user/(?P<id>\d+)', array(
    2424            'methods' => 'GET',
    2525            'callback' => [$this,'processRequest'],
     
    3737     */
    3838    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);
    4440       
    4541        extract($request->get_params());
     
    6864        return new \WP_REST_Response($DBRecord, 200);
    6965    }
    70 
    71    
    7266}
  • robust-user-search/trunk/constants.php

    r2916451 r2982366  
    2121        define('RUS_MINIMUM_WP_REQUIRED_VERSION', 5.2);
    2222        define('RUS_DIRECTORY', __DIR__);
    23         define('RUS_FILE_PATH', __FILE__);
    2423        define('RUS_WP_CURRENT_VERSION', $wp_version);
    2524        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__));
    2727
    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__));
    3330    }
    34 
    3531}
  • robust-user-search/trunk/helper/Helper.php

    r2379176 r2982366  
    4343        return wp_verify_nonce($request->get_header('X-WP-Nonce'), 'wp_rest');
    4444    }
     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    }
    4558 }
  • robust-user-search/trunk/includes/activation.php

    r2379176 r2982366  
    2020    public function __construct($file){
    2121        RusHelper::checkSecurity();
    22         register_activation_hook( $file, [$this, 'activate']);
     22        register_activation_hook($file, [$this, 'activate']);
    2323    }
    2424
  • robust-user-search/trunk/includes/deactivate.php

    r2379176 r2982366  
    2020    public function __construct($file){
    2121        RusHelper::checkSecurity();
    22         register_deactivation_hook( $file, [$this, 'deactivate']);
     22        register_deactivation_hook($file, [$this, 'deactivate']);
    2323    }
    2424
  • robust-user-search/trunk/readme.txt

    r2916451 r2982366  
    55Requires at least: 5.2
    66Tested up to: 6.2.1
    7 Stable tag: 1.0.6
     7Stable tag: 1.1.0
    88License: GPLv3
    99
     
    112112== Changelog ==
    113113
     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
    114133= 1.0.6 =
    115134- Fixed overlay height.
  • robust-user-search/trunk/robust-user-search.php

    r2916451 r2982366  
    77 * Author:              Smit Patel
    88 * Author URI:          https://smitpatelx.com
    9  * Version:             1.0.6
     9 * Version:             1.1.0
    1010 * Requires at least:   5.2
    1111 * Requires PHP:        7.1
     
    1919use Rus\Includes\RusActivation;
    2020use Rus\Includes\RusDeactivation;
     21use Rus\Controller\RusUser;
    2122
    22 use Rus\Api\RusRestApiGetAllUsers;
    23 use Rus\Api\RusRestApiPutEditUser;
    24 use Rus\Api\RusRestApiGetSingleUser;
    25 use Rus\Api\RusRestApiGetRoles;
    2623/**
    2724 * Robust User Search Main Class
     
    4037    public function __construct(){
    4138        $this->includingFile();
     39        RusHelper::checkSecurity();
    4240       
    43         RusHelper::checkSecurity();
    4441        new Constants();
    4542
    4643        $this->checkWpVersion();
     44        $this->registerAllPages();
    4745        $this->registerHooks();
    48         $this->registerAllPages();
    49         $this->registerRestApi();
     46        $this->registerAllApis();
    5047    }
    5148
     
    7774
    7875        require_once(__DIR__.'/helper/Helper.php');
     76        require_once(__DIR__.'/helper/Validation.php');
    7977        require_once(__DIR__.'/includes/activation.php');
    8078        require_once(__DIR__.'/includes/deactivate.php');
    81         require_once(__DIR__.'/includes/index-controller.php');
    82         require_once(__DIR__.'/includes/settings-controller.php');
    8379
    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');
    8883    }
    8984
     
    106101     */
    107102    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);
    111105    }
    112106
    113107    /**
    114      * Calls to register rest APIs
     108     * Add action to register pages into admin menu
    115109     *
    116110     * @param none
    117111     * @return none
    118112     */
    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();
    129116    }
    130 
    131117}
    132118
Note: See TracChangeset for help on using the changeset viewer.