1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
<?php
namespace WPGraphQL\Type\User\Mutation;
use GraphQL\Error\UserError;
use GraphQLRelay\Relay;
use WPGraphQL\Types;
/**
* Class UserCreate
*
* @package WPGraphQL\Type\User\Mutation
*/
class UserCreate {
/**
* Stores the user create mutation
*
* @var array $mutation
* @access private
*/
private static $mutation;
/**
* Process the user creat mutation
*
* @return array|null
* @access public
*/
public static function mutate() {
if ( empty( self::$mutation ) ) {
self::$mutation = Relay::mutationWithClientMutationId( [
'name' => 'CreateUser',
'description' => __( 'Create new user object', 'wp-graphql' ),
'inputFields' => self::input_fields(),
'outputFields' => [
'user' => [
'type' => Types::user(),
'resolve' => function( $payload ) {
return get_user_by( 'ID', $payload['id'] );
}
]
],
'mutateAndGetPayload' => function( $input ) {
if ( ! current_user_can( 'create_users' ) ) {
throw new UserError( __( 'Sorry, you are not allowed to create a new user.', 'wp-graphql' ) );
}
/**
* Map all of the args from GQL to WP friendly
*/
$user_args = UserMutation::prepare_user_object( $input, 'userCreate' );
/**
* Create the new user
*/
$user_id = wp_insert_user( $user_args );
/**
* Throw an exception if the post failed to create
*/
if ( is_wp_error( $user_id ) ) {
$error_message = $user_id->get_error_message();
if ( ! empty( $error_message ) ) {
throw new UserError( esc_html( $error_message ) );
} else {
throw new UserError( __( 'The object failed to create but no error was provided', 'wp-graphql' ) );
}
}
/**
* If the $post_id is empty, we should throw an exception
*/
if ( empty( $user_id ) ) {
throw new UserError( __( 'The object failed to create', 'wp-graphql' ) );
}
/**
* Update additional user data
*/
UserMutation::update_additional_user_object_data( $user_id, $input, 'create' );
/**
* Return the new user ID
*/
return [
'id' => $user_id,
];
}
] );
}
return ( ! empty( self::$mutation ) ) ? self::$mutation : null;
}
/**
* Add the email as a nonNull field for update mutations
*
* @return array
*/
private static function input_fields() {
/**
* Update mutations require an ID to be passed
*/
return array_merge(
UserMutation::input_fields(),
[
'username' => [
'type' => Types::non_null( Types::string() ),
// translators: the placeholder is the name of the type of post object being updated
'description' => __( 'A string that contains the user\'s username for logging in.', 'wp-graphql' ),
],
]
);
}
}