Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_JSON_API_User_Create_Endpoint
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 4
272
0.00% covered (danger)
0.00%
0 / 1
 result
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 validate_input
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
20
 create_or_get_user
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
56
 get_user
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
20
1<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3use Automattic\Jetpack\Connection\Utils;
4use Automattic\Jetpack\Constants;
5
6if ( ! defined( 'ABSPATH' ) ) {
7    exit( 0 );
8}
9
10/**
11 * User create endpoint class.
12 *
13 * @phan-constructor-used-for-side-effects
14 */
15class Jetpack_JSON_API_User_Create_Endpoint extends Jetpack_JSON_API_Endpoint {
16
17    /**
18     * Needed capabilities.
19     *
20     * @var string
21     */
22    protected $needed_capabilities = 'create_users';
23
24    /**
25     * User data.
26     *
27     * @var array
28     */
29    private $user_data;
30
31    /**
32     * Endpoint callback.
33     *
34     * @return object|false
35     */
36    public function result() {
37        return $this->create_or_get_user();
38    }
39
40    /**
41     * Validate the input.
42     *
43     * @param object $object - the object.
44     *
45     * @return bool|WP_Error
46     */
47    public function validate_input( $object ) {
48        $this->user_data = $this->input();
49
50        if ( empty( $this->user_data ) ) {
51            return new WP_Error( 'input_error', __( 'user_data is required', 'jetpack' ) );
52        }
53        if ( ! isset( $this->user_data['email'] ) ) {
54            return new WP_Error( 'input_error', __( 'user email is required', 'jetpack' ) );
55        }
56        if ( ! isset( $this->user_data['login'] ) ) {
57            return new WP_Error( 'input_error', __( 'user login is required', 'jetpack' ) );
58        }
59        return parent::validate_input( $object );
60    }
61
62    /**
63     * Create or get the user.
64     *
65     * @return object|false
66     */
67    public function create_or_get_user() {
68        // Check for an existing user
69        $user  = get_user_by( 'email', $this->user_data['email'] );
70        $roles = (array) $this->user_data['roles'];
71        $role  = array_pop( $roles );
72
73        $query_args = $this->query_args();
74        if ( isset( $query_args['invite_accepted'] ) && $query_args['invite_accepted'] ) {
75            Constants::set_constant( 'JETPACK_INVITE_ACCEPTED', true );
76        }
77
78        if ( ! $user ) {
79            // We modify the input here to mimick the same call structure of the update user endpoint.
80            $this->user_data               = (object) $this->user_data;
81            $this->user_data->role         = $role;
82            $this->user_data->url          = isset( $this->user_data->URL ) ? $this->user_data->URL : '';
83            $this->user_data->display_name = $this->user_data->name;
84            $this->user_data->description  = '';
85            $user                          = Utils::generate_user( $this->user_data );
86        }
87
88        if ( is_multisite() ) {
89            add_user_to_blog( get_current_blog_id(), $user->ID, $role );
90        }
91
92        if ( ! $user ) {
93
94            return false;
95        }
96
97        return $this->get_user( $user->ID );
98    }
99
100    /**
101     * Get the user.
102     *
103     * @param int $user_id - the user ID.
104     *
105     * @return object|WP_Error
106     */
107    public function get_user( $user_id ) {
108        $the_user = $this->get_author( $user_id, true );
109        if ( $the_user && ! is_wp_error( $the_user ) ) {
110            $userdata        = get_userdata( $user_id );
111            $the_user->roles = ! is_wp_error( $userdata ) ? $userdata->roles : array();
112        }
113
114        return $the_user;
115    }
116}