namespace, '/me/profile', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_item' ), 'permission_callback' => array( $this, 'permission_logged_in' ), 'args' => array( 'display_name' => array( 'type' => 'string' ), 'headline' => array( 'type' => 'string' ), 'bio' => array( 'type' => 'string' ), 'website' => array( 'type' => 'string' ), 'location' => array( 'type' => 'string' ), 'privacy' => array( 'type' => 'string', 'enum' => Profiles::PRIVACY, ), 'fields' => array( 'type' => 'object' ), ), ), ) ); foreach ( array( 'avatar', 'cover' ) as $kind ) { register_rest_route( $this->namespace, '/me/' . $kind, array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'upload_' . $kind ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'callback' => array( $this, 'delete_' . $kind ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), ) ); } register_rest_route( $this->namespace, '/me/email-preferences', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_preferences' ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_preferences' ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), ) ); } /** * Returns the current member's own profile. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function get_item( $request ) { unset( $request ); $user_id = get_current_user_id(); Profiles::ensure( $user_id ); return rest_ensure_response( MemberDirectory::profile( get_userdata( $user_id ), Profiles::get( $user_id ), $user_id ) ); } /** * Saves the current member's profile. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function update_item( $request ) { $limited = \SpaceBay\Support\RateLimit::hit( 'profile', get_current_user_id(), 20 ); if ( is_wp_error( $limited ) ) { return $limited; } $input = array(); foreach ( array( 'display_name', 'headline', 'bio', 'website', 'location', 'privacy', 'fields' ) as $key ) { if ( $request->has_param( $key ) ) { $input[ $key ] = $request->get_param( $key ); } } $result = Profiles::update( get_current_user_id(), $input ); if ( is_wp_error( $result ) ) { return $result; } clean_user_cache( get_current_user_id() ); return $this->get_item( $request ); } /** * Uploads a new profile photo. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function upload_avatar( $request ) { return $this->upload( $request, 'avatar' ); } /** * Uploads a new cover image. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function upload_cover( $request ) { return $this->upload( $request, 'cover' ); } /** * Removes the profile photo. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function delete_avatar( $request ) { Profiles::remove_image( get_current_user_id(), 'avatar' ); return $this->get_item( $request ); } /** * Removes the cover image. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function delete_cover( $request ) { Profiles::remove_image( get_current_user_id(), 'cover' ); return $this->get_item( $request ); } /** * Saves an uploaded profile image. * * @param WP_REST_Request $request Request. * @param string $kind "avatar" or "cover". * @return WP_REST_Response|WP_Error */ private function upload( $request, $kind ) { $files = $request->get_file_params(); if ( empty( $files['file'] ) || ! is_array( $files['file'] ) ) { return new WP_Error( 'spacebay_no_file', __( 'Please choose an image to upload.', 'spacebay' ), array( 'status' => 400 ) ); } $limited = RateLimit::hit( 'upload', get_current_user_id(), 20 ); if ( is_wp_error( $limited ) ) { return $limited; } $result = Profiles::set_image( get_current_user_id(), $kind, $files['file'] ); if ( is_wp_error( $result ) ) { return $result; } return $this->get_item( $request ); } /** * Returns the member's email notification choices. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function get_preferences( $request ) { unset( $request ); return rest_ensure_response( Preferences::get( get_current_user_id() ) ); } /** * Saves the member's email notification choices. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function update_preferences( $request ) { return rest_ensure_response( Preferences::update( get_current_user_id(), (array) $request->get_json_params() ) ); } }