BP_REST_Messages_Endpoint
Messages endpoints.
Description Description
Source Source
File: bp-messages/classes/class-bp-rest-messages-endpoint.php
class BP_REST_Messages_Endpoint extends WP_REST_Controller {
/**
* Constructor.
*
* @since 5.0.0
*/
public function __construct() {
$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
$this->rest_base = buddypress()->messages->id;
}
/**
* Register the component routes.
*
* @since 5.0.0
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_items' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => $this->get_collection_params(),
),
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => array( $this, 'create_item' ),
'permission_callback' => array( $this, 'create_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
// Attention: (?P<id>[\d]+) is the placeholder for **Thread** ID, not the Message ID one.
$thread_endpoint = '/' . $this->rest_base . '/(?P<id>[\d]+)';
register_rest_route(
$this->namespace,
$thread_endpoint,
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_item' ),
'permission_callback' => array( $this, 'get_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::READABLE ),
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'update_item' ),
'permission_callback' => array( $this, 'update_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
),
array(
'methods' => WP_REST_Server::DELETABLE,
'callback' => array( $this, 'delete_item' ),
'permission_callback' => array( $this, 'delete_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::DELETABLE ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
// Register the starred route.
if ( bp_is_active( 'messages', 'star' ) ) {
// Attention: (?P<id>[\d]+) is the placeholder for **Message** ID, not the Thread ID one.
$starred_endpoint = '/' . $this->rest_base . '/' . bp_get_messages_starred_slug() . '/(?P<id>[\d]+)';
register_rest_route(
$this->namespace,
$starred_endpoint,
array(
'args' => array(
'id' => array(
'description' => __( 'ID of one of the message of the Thread.', 'buddypress' ),
'type' => 'integer',
),
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'update_starred' ),
'permission_callback' => array( $this, 'update_starred_permissions_check' ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
}
}
/**
* Retrieve threads.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response
*/
public function get_items( $request ) {
$args = array(
'user_id' => $request['user_id'],
'box' => $request['box'],
'type' => $request['type'],
'page' => $request['page'],
'per_page' => $request['per_page'],
'search_terms' => $request['search'],
);
// Include the meta_query for starred messages.
if ( 'starred' === $args['box'] ) {
$args['meta_query'] = array( // phpcs:ignore
array(
'key' => 'starred_by_user',
'value' => $args['user_id'],
),
);
}
/**
* Filter the query arguments for the request.
*
* @since 5.0.0
*
* @param array $args Key value array of query var to query value.
* @param WP_REST_Request $request The request sent to the API.
*/
$args = apply_filters( 'bp_rest_messages_get_items_query_args', $args, $request );
// Actually, query it.
$messages_box = new BP_Messages_Box_Template( $args );
$retval = array();
foreach ( (array) $messages_box->threads as $thread ) {
$retval[] = $this->prepare_response_for_collection(
$this->prepare_item_for_response( $thread, $request )
);
}
$response = rest_ensure_response( $retval );
$response = bp_rest_response_add_total_headers( $response, $messages_box->total_thread_count, $args['per_page'] );
/**
* Fires after a thread is fetched via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Box_Template $messages_box Fetched thread.
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_messages_get_items', $messages_box, $response, $request );
return $response;
}
/**
* Check if a given request has access to thread items.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|bool
*/
public function get_items_permissions_check( $request ) {
$retval = true;
if ( ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to see the messages.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
$user = bp_rest_get_user( $request['user_id'] );
if ( true === $retval && ! $user instanceof WP_User ) {
$retval = new WP_Error(
'bp_rest_invalid_id',
__( 'Invalid member ID.', 'buddypress' ),
array(
'status' => 404,
)
);
}
if ( true === $retval && (int) bp_loggedin_user_id() !== $user->ID && ! bp_current_user_can( 'bp_moderate' ) ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you cannot view the messages.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
/**
* Filter the messages `get_items` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_get_items_permissions_check', $retval, $request );
}
/**
* Get a single thread.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_REST_Response
*/
public function get_item( $request ) {
$thread = $this->get_thread_object( $request['id'] );
$retval = array(
$this->prepare_response_for_collection(
$this->prepare_item_for_response( $thread, $request )
),
);
$response = rest_ensure_response( $retval );
/**
* Fires after a thread is fetched via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Thread $thread Thread object.
* @param WP_REST_Response $retval The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_messages_get_item', $thread, $response, $request );
return $response;
}
/**
* Check if a given request has access to a thread item.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|bool
*/
public function get_item_permissions_check( $request ) {
$retval = true;
if ( ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to see this thread.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
$thread = $this->get_thread_object( $request['id'] );
if ( true === $retval && empty( $thread->thread_id ) ) {
$retval = new WP_Error(
'bp_rest_invalid_id',
__( 'Sorry, this thread does not exist.', 'buddypress' ),
array(
'status' => 404,
)
);
}
if ( true === $retval && bp_current_user_can( 'bp_moderate' ) ) {
$retval = true;
} else {
$id = messages_check_thread_access( $thread->thread_id );
if ( true === $retval && is_null( $id ) ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to see this thread.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
if ( true === $retval ) {
$retval = true;
}
}
/**
* Filter the messages `get_item` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_get_item_permissions_check', $retval, $request );
}
/**
* Init a Messages Thread or add a reply to an existing Thread.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
public function create_item( $request ) {
// Setting context.
$request->set_param( 'context', 'edit' );
// Prepare the message or the reply arguments.
$args = array(
'sender_id' => $request['sender_id'],
'thread_id' => 0,
'subject' => $request['subject'],
'content' => $request['message'],
'recipients' => $request['recipients'],
);
$error = new WP_Error(
'bp_rest_messages_create_failed',
__( 'There was an error trying to create the message.', 'buddypress' ),
array(
'status' => 500,
)
);
// Replying to an existing Thread ?
if ( $request['id'] ) {
// Try to get the thread.
$thread = $this->get_thread_object( $request['id'] );
// Validate the Thread exists.
if ( ! $thread->thread_id ) {
return $error;
}
$args['thread_id'] = (int) $thread->thread_id;
$args['recipients'] = wp_parse_id_list( wp_list_pluck( $thread->recipients, 'user_id' ) );
}
if ( ! $args['recipients'] ) {
return new WP_Error(
'bp_rest_messages_missing_recipients',
__( 'Please provide some recipients for your message or reply.', 'buddypress' ),
array(
'status' => 400,
)
);
}
// Create the message or the reply.
$thread_id = messages_new_message( $args );
// Validate it created a Thread or was added to it.
if ( ! $thread_id ) {
return $error;
}
// Make sure to get the newest message to update REST Additional fields.
$thread = $this->get_thread_object( $thread_id );
$last_message = wp_list_filter( $thread->messages, array( 'id' => $thread->last_message_id ) );
$last_message = reset( $last_message );
$fields_update = $this->update_additional_fields_for_object( $last_message, $request );
if ( is_wp_error( $fields_update ) ) {
return $fields_update;
}
$retval = array(
$this->prepare_response_for_collection(
$this->prepare_item_for_response( $thread, $request )
),
);
$response = rest_ensure_response( $retval );
/**
* Fires after a message is created via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Thread $thread Thread object.
* @param WP_REST_Response $retval The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_messages_create_item', $thread, $response, $request );
return $response;
}
/**
* Check if a given request has access to create a message.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_Error|bool
*/
public function create_item_permissions_check( $request ) {
$retval = true;
if ( ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you need to be logged in to create a message.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
/**
* Filter the messages `create_item` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_create_item_permissions_check', $retval, $request );
}
/**
* Update metadata for one of the messages of the thread.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
public function update_item( $request ) {
// Setting context.
$request->set_param( 'context', 'edit' );
// Get the thread.
$thread = $this->get_thread_object( $request['id'] );
$error = new WP_Error(
'bp_rest_messages_update_failed',
__( 'There was an error trying to update the message.', 'buddypress' ),
array(
'status' => 500,
)
);
if ( ! $thread->thread_id ) {
return $error;
}
// By default use the last message.
$message_id = $thread->last_message_id;
if ( $request['message_id'] ) {
$message_id = $request['message_id'];
}
$updated_message = wp_list_filter( $thread->messages, array( 'id' => $message_id ) );
$updated_message = reset( $updated_message );
/**
* Filter here to allow more users to edit the message meta (eg: the recipients).
*
* @since 5.0.0
*
* @param boolean $value Whether the user can edit the message meta.
* By default: only the sender and a community moderator can.
* @param BP_Messages_Message $updated_message The updated message object.
* @param WP_REST_Request $request The request sent to the API.
*/
$can_edit_item_meta = apply_filters(
'bp_rest_messages_can_edit_item_meta',
bp_loggedin_user_id() === $updated_message->sender_id || bp_current_user_can( 'bp_moderate' ),
$updated_message,
$request
);
// The message must exist in the thread, and the logged in user must be the sender.
if ( ! isset( $updated_message->id ) || ! $updated_message->id || ! $can_edit_item_meta ) {
return $error;
}
$fields_update = $this->update_additional_fields_for_object( $updated_message, $request );
if ( is_wp_error( $fields_update ) ) {
return $fields_update;
}
$retval = array(
$this->prepare_response_for_collection(
$this->prepare_item_for_response( $thread, $request )
),
);
$response = rest_ensure_response( $retval );
/**
* Fires after a message is updated via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Message $updated_message The updated message.
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_messages_update_item', $updated_message, $response, $request );
return $response;
}
/**
* Check if a given request has access to update a message.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return bool|WP_Error
*/
public function update_item_permissions_check( $request ) {
$retval = $this->get_item_permissions_check( $request );
/**
* Filter the message `update_item` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_update_item_permissions_check', $retval, $request );
}
/**
* Adds or removes the message from the current user's starred box.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
public function update_starred( $request ) {
// Setting context.
$request->set_param( 'context', 'edit' );
$message = $this->get_message_object( $request['id'] );
if ( empty( $message->id ) ) {
return new WP_Error(
'bp_rest_invalid_id',
__( 'Sorry, this message does not exist.', 'buddypress' ),
array(
'status' => 404,
)
);
}
$user_id = bp_loggedin_user_id();
$result = false;
$action = 'star';
$info = __( 'Sorry, you cannot add the message to your starred box.', 'buddypress' );
if ( bp_messages_is_message_starred( $message->id, $user_id ) ) {
$action = 'unstar';
$info = __( 'Sorry, you cannot remove the message from your starred box.', 'buddypress' );
}
$result = bp_messages_star_set_action(
array(
'user_id' => $user_id,
'message_id' => $message->id,
'action' => $action,
)
);
if ( ! $result ) {
return new WP_Error(
'bp_rest_user_cannot_update_starred_message',
$info,
array(
'status' => 500,
)
);
}
// Prepare the message for the REST response.
$data = array(
$this->prepare_response_for_collection(
$this->prepare_message_for_response( $message, $request )
),
);
$response = rest_ensure_response( $data );
/**
* Fires after a message is starred/unstarred via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Message $message Message object.
* @param string $action Informs about the update performed.
* Possible values are `star` or `unstar`.
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_message_update_starred_item', $message, $action, $response, $request );
return $response;
}
/**
* Check if a given request has access to update user starred messages.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return bool|WP_Error
*/
public function update_starred_permissions_check( $request ) {
$retval = true;
$thread_id = messages_get_message_thread_id( $request['id'] );
if ( ! is_user_logged_in() || ! messages_check_thread_access( $thread_id ) ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to star/unstar messages.', 'buddypress' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
/**
* Filter the message `update_starred` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_update_starred_permissions_check', $retval, $request );
}
/**
* Delete a thread.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
public function delete_item( $request ) {
// Setting context.
$request->set_param( 'context', 'edit' );
// Get the thread before it's deleted.
$thread = $this->get_thread_object( $request['id'] );
$previous = $this->prepare_item_for_response( $thread, $request );
$user_id = bp_loggedin_user_id();
if ( ! empty( $request['user_id'] ) ) {
$user_id = $request['user_id'];
}
// Check the user is one of the recipients.
$recipient_ids = wp_parse_id_list( wp_list_pluck( $thread->recipients, 'user_id' ) );
// Delete a thread.
if ( ! in_array( $user_id, $recipient_ids, true ) || ! messages_delete_thread( $thread->thread_id, $user_id ) ) {
return new WP_Error(
'bp_rest_messages_delete_thread_failed',
__( 'There was an error trying to delete a thread.', 'buddypress' ),
array(
'status' => 500,
)
);
}
// Build the response.
$response = new WP_REST_Response();
$response->set_data(
array(
'deleted' => true,
'previous' => $previous->get_data(),
)
);
/**
* Fires after a thread is deleted via the REST API.
*
* @since 5.0.0
*
* @param BP_Messages_Thread $thread Thread object.
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'bp_rest_messages_delete_item', $thread, $response, $request );
return $response;
}
/**
* Check if a given request has access to delete a thread.
*
* @since 5.0.0
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_Error|bool
*/
public function delete_item_permissions_check( $request ) {
$retval = $this->get_item_permissions_check( $request );
/**
* Filter the thread `delete_item` permissions check.
*
* @since 5.0.0
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*/
return apply_filters( 'bp_rest_messages_delete_item_permissions_check', $retval, $request );
}
/**
* Prepares message data for the REST response.
*
* @since 5.0.0
*
* @param BP_Messages_Message $message The Message object.
* @param WP_REST_Request $request Full details about the request.
* @return array The Message data for the REST response.
*/
public function prepare_message_for_response( $message, $request ) {
$data = array(
'id' => (int) $message->id,
'thread_id' => (int) $message->thread_id,
'sender_id' => (int) $message->sender_id,
'subject' => array(
'raw' => $message->subject,
'rendered' => apply_filters( 'bp_get_message_thread_subject', wp_staticize_emoji( $message->subject ) ),
),
'message' => array(
'raw' => $message->message,
'rendered' => apply_filters( 'bp_get_the_thread_message_content', wp_staticize_emoji( $message->message ) ),
),
'date_sent' => bp_rest_prepare_date_response( $message->date_sent ),
);
if ( bp_is_active( 'messages', 'star' ) ) {
$user_id = bp_loggedin_user_id();
if ( isset( $request['user_id'] ) && $request['user_id'] ) {
$user_id = (int) $request['user_id'];
}
$data['is_starred'] = bp_messages_is_message_starred( $data['id'], $user_id );
}
// Add REST Fields (BP Messages meta) data.
$data = $this->add_additional_fields_to_object( $data, $request );
/**
* Filter a message value returned from the API.
*
* @since 5.0.0
*
* @param array $data The message value for the REST response.
* @param BP_Messages_Message $message The Message object.
* @param WP_REST_Request $request Request used to generate the response.
*/
return apply_filters( 'bp_rest_message_prepare_value', $data, $message, $request );
}
/**
* Prepares recipient data for the REST response.
*
* @since 5.0.0
*
* @param object $recipient The recipient object.
* @param WP_REST_Request $request Full details about the request.
* @return array The recipient data for the REST response.
*/
public function prepare_recipient_for_response( $recipient, $request ) {
$data = array(
'id' => (int) $recipient->id,
'user_id' => (int) $recipient->user_id,
'user_link' => esc_url( bp_core_get_user_domain( $recipient->user_id ) ),
);
// Fetch the user avatar urls (Full & thumb).
if ( true === buddypress()->avatar->show_avatars ) {
foreach ( array( 'full', 'thumb' ) as $type ) {
$data['user_avatars'][ $type ] = bp_core_fetch_avatar(
array(
'item_id' => $recipient->user_id,
'html' => false,
'type' => $type,
)
);
}
}
$data = array_merge(
$data,
array(
'thread_id' => (int) $recipient->thread_id,
'unread_count' => (int) $recipient->unread_count,
'sender_only' => (int) $recipient->sender_only,
'is_deleted' => (int) $recipient->is_deleted,
)
);
/**
* Filter a recipient value returned from the API.
*
* @since 5.0.0
*
* @param array $data The recipient value for the REST response.
* @param object $recipient The recipient object.
* @param WP_REST_Request $request Request used to generate the response.
*/
return apply_filters( 'bp_rest_messages_prepare_recipient_value', $data, $recipient, $request );
}
/**
* Prepare links for the request.
*
* @since 5.0.0
*
* @param BP_Messages_Thread $thread Thread object.
* @return array Links for the given thread.
*/
protected function prepare_links( $thread ) {
$base = sprintf( '/%s/%s/', $this->namespace, $this->rest_base );
// Entity meta.
$links = array(
'self' => array(
'href' => rest_url( $base . $thread->thread_id ),
),
'collection' => array(
'href' => rest_url( $base ),
),
);
// Add star links for each message of the thread.
if ( bp_is_active( 'messages', 'star' ) ) {
$starred_base = $base . bp_get_messages_starred_slug() . '/';
foreach ( $thread->messages as $message ) {
$links[ $message->id ] = array(
'href' => rest_url( $starred_base . $message->id ),
);
}
}
/**
* Filter links prepared for the REST response.
*
* @since 5.0.0
*
* @param array $links The prepared links of the REST response.
* @param BP_Messages_Thread $thread Thread object.
*/
return apply_filters( 'bp_rest_messages_prepare_links', $links, $thread );
}
/**
* Prepares thread data for return as an object.
*
* @since 5.0.0
*
* @param BP_Messages_Thread $thread Thread object.
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response
*/
public function prepare_item_for_response( $thread, $request ) {
$excerpt = '';
if ( isset( $thread->last_message_content ) ) {
$excerpt = wp_strip_all_tags( bp_create_excerpt( $thread->last_message_content, 75 ) );
}
$data = array(
'id' => $thread->thread_id,
'message_id' => $thread->last_message_id,
'last_sender_id' => $thread->last_sender_id,
'subject' => array(
'raw' => $thread->last_message_subject,
'rendered' => apply_filters( 'bp_get_message_thread_subject', wp_staticize_emoji( $thread->last_message_subject ) ),
),
'excerpt' => array(
'raw' => $excerpt,
'rendered' => apply_filters( 'bp_get_message_thread_excerpt', $excerpt ),
),
'message' => array(
'raw' => $thread->last_message_content,
'rendered' => apply_filters( 'bp_get_message_thread_content', wp_staticize_emoji( $thread->last_message_content ) ),
),
'date' => bp_rest_prepare_date_response( $thread->last_message_date ),
'unread_count' => ! empty( $thread->unread_count ) ? $thread->unread_count : 0,
'sender_ids' => $thread->sender_ids,
'recipients' => array(),
'messages' => array(),
);
// Loop through messages to prepare them for the response.
foreach ( $thread->messages as $message ) {
$data['messages'][] = $this->prepare_message_for_response( $message, $request );
}
// Loop through recipients to prepare them for the response.
foreach ( $thread->recipients as $recipient ) {
$data['recipients'][ $recipient->user_id ] = $this->prepare_recipient_for_response( $recipient, $request );
}
// Pluck starred message ids.
$data['starred_message_ids'] = array_keys( array_filter( wp_list_pluck( $data['messages'], 'is_starred', 'id' ) ) );
$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
$data = $this->add_additional_fields_to_object( $data, $request );
$data = $this->filter_response_by_context( $data, $context );
$response = rest_ensure_response( $data );
$response->add_links( $this->prepare_links( $thread ) );
/**
* Filter a thread value returned from the API.
*
* @since 5.0.0
*
* @param WP_REST_Response $response Response generated by the request.
* @param WP_REST_Request $request Request used to generate the response.
* @param BP_Messages_Thread $thread The thread object.
*/
return apply_filters( 'bp_rest_messages_prepare_value', $response, $request, $thread );
}
/**
* Get thread object.
*
* @since 5.0.0
*
* @param int $thread_id Thread ID.
* @return BP_Messages_Thread
*/
public function get_thread_object( $thread_id ) {
return new BP_Messages_Thread( $thread_id );
}
/**
* Get the message object thanks to its ID.
*
* @since 5.0.0
*
* @param int $message_id Message ID.
* @return BP_Messages_Message
*/
public function get_message_object( $message_id ) {
return new BP_Messages_Message( $message_id );
}
/**
* Select the item schema arguments needed for the CREATABLE, EDITABLE and DELETABLE methods.
*
* @since 5.0.0
*
* @param string $method Optional. HTTP method of the request.
* @return array Endpoint arguments.
*/
public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) {
$key = 'get_item';
$args = WP_REST_Controller::get_endpoint_args_for_item_schema( $method );
$args['id']['description'] = __( 'ID of the Messages Thread.', 'buddypress' );
if ( WP_REST_Server::CREATABLE === $method ) {
$key = 'create_item';
// Edit the Thread ID description and default properties.
$args['id']['description'] = __( 'ID of the Messages Thread. Required when replying to an existing Thread.', 'buddypress' );
$args['id']['default'] = 0;
// Add the sender_id argument.
$args['sender_id'] = array(
'description' => __( 'The user ID of the Message sender.', 'buddypress' ),
'required' => false,
'default' => bp_loggedin_user_id(),
'type' => 'integer',
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
);
// Edit subject's properties.
$args['subject']['type'] = 'string';
$args['subject']['default'] = false;
$args['subject']['description'] = __( 'Subject of the Message initializing the Thread.', 'buddypress' );
// Edit message's properties.
$args['message']['type'] = 'string';
$args['message']['description'] = __( 'Content of the Message to add to the Thread.', 'buddypress' );
// Edit recipients properties.
$args['recipients']['items'] = array( 'type' => 'integer' );
$args['recipients']['sanitize_callback'] = 'wp_parse_id_list';
$args['recipients']['validate_callback'] = 'rest_validate_request_arg';
$args['recipients']['description'] = __( 'The list of the recipients user IDs of the Message.', 'buddypress' );
// Remove unused properties for this transport method.
unset( $args['subject']['properties'], $args['message']['properties'] );
} else {
unset( $args['sender_id'], $args['subject'], $args['message'], $args['recipients'] );
if ( WP_REST_Server::EDITABLE === $method ) {
$key = 'update_item';
$args['message_id'] = array(
'description' => __( 'By default the latest message of the thread will be updated. Specify this message ID to edit another message of the thread.', 'buddypress' ),
'required' => false,
'type' => 'integer',
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
);
}
if ( WP_REST_Server::DELETABLE === $method ) {
$key = 'delete_item';
$args['user_id'] = array(
'description' => __( 'The user ID to remove from the thread', 'buddypress' ),
'required' => true,
'type' => 'integer',
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
'default' => bp_loggedin_user_id(),
);
}
}
/**
* Filters the method query arguments.
*
* @since 5.0.0
*
* @param array $args Query arguments.
* @param string $method HTTP method of the request.
*/
return apply_filters( "bp_rest_messages_{$key}_query_arguments", $args, $method );
}
/**
* Get the message schema, conforming to JSON Schema.
*
* @since 5.0.0
*
* @return array
*/
public function get_item_schema() {
$schema = array(
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'bp_messages',
'type' => 'object',
'properties' => array(
'id' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'A unique numeric ID for the Thread.', 'buddypress' ),
'type' => 'integer',
),
'message_id' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'The ID of the latest message of the Thread.', 'buddypress' ),
'readonly' => true,
'type' => 'integer',
),
'last_sender_id' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'The ID of latest sender of the Thread.', 'buddypress' ),
'readonly' => true,
'type' => 'integer',
),
'subject' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'Title of the latest message of the Thread.', 'buddypress' ),
'type' => 'object',
'arg_options' => array(
'sanitize_callback' => null,
'validate_callback' => null,
),
'properties' => array(
'raw' => array(
'description' => __( 'Title of the latest message of the Thread, as it exists in the database.', 'buddypress' ),
'type' => 'string',
'context' => array( 'edit' ),
'default' => false,
),
'rendered' => array(
'description' => __( 'Title of the latest message of the Thread, transformed for display.', 'buddypress' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
'readonly' => true,
'default' => false,
),
),
),
'excerpt' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'Summary of the latest message of the Thread.', 'buddypress' ),
'type' => 'object',
'readonly' => true,
'arg_options' => array(
'sanitize_callback' => null,
'validate_callback' => null,
),
'properties' => array(
'raw' => array(
'description' => __( 'Summary for the latest message of the Thread, as it exists in the database.', 'buddypress' ),
'type' => 'string',
'context' => array( 'edit' ),
),
'rendered' => array(
'description' => __( 'HTML summary for the latest message of the Thread, transformed for display.', 'buddypress' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
),
),
),
'message' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'Content of the latest message of the Thread.', 'buddypress' ),
'type' => 'object',
'required' => true,
'arg_options' => array(
'sanitize_callback' => null,
'validate_callback' => null,
),
'properties' => array(
'raw' => array(
'description' => __( 'Content for the latest message of the Thread, as it exists in the database.', 'buddypress' ),
'type' => 'string',
'context' => array( 'edit' ),
),
'rendered' => array(
'description' => __( 'HTML content for the latest message of the Thread, transformed for display.', 'buddypress' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
),
),
'date' => array(
'context' => array( 'view', 'edit' ),
'description' => __( "The date the latest message of the Thread, in the site's timezone.", 'buddypress' ),
'readonly' => true,
'type' => 'string',
'format' => 'date-time',
),
'unread_count' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'Total count of unread messages into the Thread for the requested user.', 'buddypress' ),
'readonly' => true,
'type' => 'integer',
),
'sender_ids' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'The list of user IDs for all messages in the Thread.', 'buddypress' ),
'readonly' => true,
'type' => 'array',
'items' => array(
'type' => 'integer',
),
),
'recipients' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'The list of recipient User Objects involved into the Thread.', 'buddypress' ),
'type' => 'array',
'items' => array(
'type' => 'object',
),
),
'messages' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'List of message objects for the thread.', 'buddypress' ),
'readonly' => true,
'type' => 'array',
'items' => array(
'type' => 'object',
),
),
'starred_message_ids' => array(
'context' => array( 'view', 'edit' ),
'description' => __( 'List of starred message IDs.', 'buddypress' ),
'readonly' => true,
'type' => 'array',
'items' => array(
'type' => 'integer',
),
'default' => array(),
),
),
);
/**
* Filters the message schema.
*
* @since 5.0.0
*
* @param array $schema The endpoint schema.
*/
return apply_filters( 'bp_rest_message_schema', $this->add_additional_fields_schema( $schema ) );
}
/**
* Get the query params for Messages collections.
*
* @since 5.0.0
*
* @return array
*/
public function get_collection_params() {
$params = parent::get_collection_params();
$params['context']['default'] = 'view';
$boxes = array( 'sentbox', 'inbox' );
if ( bp_is_active( 'messages', 'star' ) ) {
$boxes[] = 'starred';
}
$params['box'] = array(
'description' => __( 'Filter the result by box.', 'buddypress' ),
'default' => 'inbox',
'type' => 'string',
'enum' => $boxes,
'sanitize_callback' => 'sanitize_key',
'validate_callback' => 'rest_validate_request_arg',
);
$params['type'] = array(
'description' => __( 'Filter the result by thread status.', 'buddypress' ),
'default' => 'all',
'type' => 'string',
'enum' => array( 'all', 'read', 'unread' ),
'sanitize_callback' => 'sanitize_key',
'validate_callback' => 'rest_validate_request_arg',
);
$params['user_id'] = array(
'description' => __( 'Limit result to messages created by a specific user.', 'buddypress' ),
'default' => bp_loggedin_user_id(),
'type' => 'integer',
'required' => true,
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
);
/**
* Filters the collection query params.
*
* @param array $params Query params.
*/
return apply_filters( 'bp_rest_messages_collection_params', $params );
}
}
Changelog Changelog
| Version | Description |
|---|---|
| 5.0.0 | Introduced. |
Methods Methods
- __construct — Constructor.
- create_item — Init a Messages Thread or add a reply to an existing Thread.
- create_item_permissions_check — Check if a given request has access to create a message.
- delete_item — Delete a thread.
- delete_item_permissions_check — Check if a given request has access to delete a thread.
- get_collection_params — Get the query params for Messages collections.
- get_endpoint_args_for_item_schema — Select the item schema arguments needed for the CREATABLE, EDITABLE and DELETABLE methods.
- get_item — Get a single thread.
- get_item_permissions_check — Check if a given request has access to a thread item.
- get_item_schema — Get the message schema, conforming to JSON Schema.
- get_items — Retrieve threads.
- get_items_permissions_check — Check if a given request has access to thread items.
- get_message_object — Get the message object thanks to its ID.
- get_thread_object — Get thread object.
- prepare_item_for_database — Prepare a message for create.
- prepare_item_for_response — Prepares thread data for return as an object.
- prepare_links — Prepare links for the request.
- prepare_message_for_response — Prepares message data for the REST response.
- prepare_recipient_for_response — Prepares recipient data for the REST response.
- register_routes — Register the component routes.
- update_item — Update metadata for one of the messages of the thread.
- update_item_permissions_check — Check if a given request has access to update a message.
- update_starred — Adds or removes the message from the current user's starred box.
- update_starred_permissions_check — Check if a given request has access to update user starred messages.