namespace, '/media', array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'create_item' ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), ) ); } /** * Saves one uploaded image sent as the "file" field. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function create_item( $request ) { $user_id = get_current_user_id(); if ( ! self::can_post_somewhere( $user_id ) && ! \SpaceBay\Messages\Rules::can_use( $user_id ) ) { return new WP_Error( 'spacebay_cannot_upload', __( 'Join a space to share images.', 'spacebay' ), array( 'status' => 403 ) ); } if ( Media::pending_count( $user_id ) >= Media::MAX_PENDING ) { return new WP_Error( 'spacebay_too_many_uploads', __( 'You have many images that are not posted yet. Post or remove them first.', 'spacebay' ), array( 'status' => 429 ) ); } $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', $user_id, 20 ); if ( is_wp_error( $limited ) ) { return $limited; } $media = Media::upload( $files['file'], get_current_user_id() ); if ( is_wp_error( $media ) ) { return $media; } $response = rest_ensure_response( $media ); $response->set_status( 201 ); return $response; } /** * Whether the member may post in at least one space. * * @param int $user_id User ID. * @return bool */ private static function can_post_somewhere( $user_id ) { foreach ( \SpaceBay\Spaces\SpaceRepository::all( 'space' ) as $space ) { if ( \SpaceBay\Feed\PostAccess::can_post( $space, $user_id ) ) { return true; } } return false; } }