BP_REST_Group_Messages_Endpoint
Group Messages endpoints.
Description
Source
File: bp-messages/classes/class-bp-rest-group-messages-endpoint.php
class BP_REST_Group_Messages_Endpoint extends WP_REST_Controller { /** * Reuse some parts of the BP_REST_Messages_Endpoint class. * * @since 0.1.0 * * @var BP_REST_Messages_Endpoint */ protected $message_endppoint; /** * Constructor. * * @since 0.1.0 */ public function __construct() { $this->namespace = bp_rest_namespace() . '/' . bp_rest_version(); $this->rest_base = buddypress()->messages->id; $this->message_endppoint = new BP_REST_Messages_Endpoint(); } /** * Register the component routes. * * @since 0.1.0 */ public function register_routes() { register_rest_route( $this->namespace, '/' . $this->rest_base . '/group', array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'create_item' ), 'permission_callback' => array( $this, 'create_item_permissions_check' ), 'args' => $this->get_collection_params(), ), 'schema' => array( $this, 'get_item_schema' ), ) ); } /** * Init a Messages Thread or add a reply to an existing Thread. * -- from bp_nouveau_ajax_groups_send_message(); * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response | WP_Error * @since 0.1.0 * * @api {POST} /wp-json/buddyboss/v1/messages/group Create Group Thread * @apiName CreateBBGroupThread * @apiGroup Messages * @apiDescription Create Group thread * @apiVersion 1.0.0 * @apiPermission LoggedInUser * @apiParam {String} message Content of the Message to add to the Thread. * @apiParam {Number} group_id A unique numeric ID for the Group. * @apiParam {Number} user_id Limit result to messages created by a specific user. * @apiParam {String=open,private} type=open Type of message, Group thread or private reply. * @apiParam {String=all,individual} users=all Group thread users individual or all. * @apiParam {Array} [users_list] Limit result to messages created by a specific user. */ public function create_item( $request ) { global $wpdb, $bp; $group = ( isset( $request['group_id'] ) && ! empty( $request['group_id'] ) ) ? $request['group_id'] : ''; $message = ( isset( $request['message'] ) && ! empty( $request['message'] ) ) ? $request['message'] : ''; $users_list = ( isset( $request['users_list'] ) && ! empty( $request['users_list'] ) ) ? $request['users_list'] : ''; $message_users = ( isset( $request['users'] ) && ! empty( $request['users'] ) ) ? $request['users'] : ''; $message_type = ( isset( $request['type'] ) && ! empty( $request['type'] ) ) ? $request['type'] : ''; // verification for phpcs. wp_verify_nonce( wp_create_nonce( 'group_messages' ), 'group_messages' ); // Get Members list if "All Group Members" selected. if ( 'all' === $message_users ) { // Fetch all the group members. $args = array( 'per_page' => 9999999999999999999, 'group_id' => $group, 'exclude' => array( bp_loggedin_user_id() ), 'exclude_admins_mods' => false, ); $group_members = groups_get_group_members( $args ); $members = wp_list_pluck( $group_members['members'], 'ID' ); // We get members array from $_POST['users_list'] because user already selected them. } else { $members = $users_list; } if ( empty( $group ) ) { return new WP_Error( 'bp_rest_no_group_selected', __( 'Sorry, Group id is missing.', 'buddyboss' ), array( 'status' => 400, ) ); } if ( empty( $members ) ) { return new WP_Error( 'bp_rest_no_members_selected', __( 'Sorry, you have not selected any members.', 'buddyboss' ), array( 'status' => 400, ) ); } $_POST = array(); $_POST['users'] = $message_users; $_POST['type'] = $message_type; $_POST['content'] = $message; $_POST['group'] = $group; // If "Group Thread" selected. if ( 'open' === $message_type ) { // "All Group Members" selected. if ( 'all' === $message_users ) { // Comma separated members list to find in meta query. $message_users_ids = implode( ',', $members ); // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "message_users_ids". $_POST['message_meta_users_list'] = $message_users_ids; $group_thread = groups_get_groupmeta( (int) $group, 'group_message_thread' ); $is_deleted = false; $group_thread_id = ''; $_POST['message_thread_type'] = ''; if ( '' !== $group_thread ) { // phpcs:ignore $total_threads = $wpdb->get_results( $wpdb->prepare( "SELECT is_deleted FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", (int) $group_thread ) ); // db call ok; no-cache ok; foreach ( $total_threads as $thread ) { if ( 1 === (int) $thread->is_deleted ) { $is_deleted = true; break; } } if ( $is_deleted || empty( $total_threads ) ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } if ( '' !== $group_thread && ! $is_deleted && isset( $_POST['message_thread_type'] ) && empty( $_POST['message_thread_type'] ) ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; $group_thread_id = $group_thread; } else { // Backward compatibility when we dont store thread_id in group meta. $meta = array( array( 'key' => 'group_id', 'value' => $group, 'compare' => '=', ), array( 'key' => 'group_message_users', 'value' => 'all', 'compare' => '=', ), array( 'key' => 'group_message_type', 'value' => 'open', 'compare' => '=', ), array( 'key' => 'message_users_ids', 'value' => $message_users_ids, ), ); // Check if there is already previously group thread created. if ( bp_has_message_threads( array( 'meta_query' => $meta ) // phpcs:ignore ) ) { $thread_id = 0; while ( bp_message_threads() ) { bp_message_thread(); $thread_id = bp_get_message_thread_id(); if ( $thread_id ) { break; } } // If $thread_id found then add as a reply to that thread. if ( $thread_id ) { $group_thread_id = $thread_id; // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; // Create a new group thread. } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } // Create a new group thread. } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } /** * Create Message based on the `message_thread_type` and `group_thread_id`. */ if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) { $send = $this->bp_rest_groups_messages_new_message( array( 'recipients' => $members, 'subject' => wp_trim_words( $message, messages_get_default_subject_length() ), 'content' => $message, 'error_type' => 'wp_error', 'append_thread' => false, ) ); if ( ! is_wp_error( $send ) && ! empty( $send ) ) { groups_update_groupmeta( (int) $group, 'group_message_thread', $send ); } return $this->bp_rest_groups_messages_validate_message( $send, $request ); } elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $group_thread_id ) ) { groups_update_groupmeta( (int) $group, 'group_message_thread', $group_thread_id ); $new_reply = $this->bp_rest_groups_messages_new_message( array( 'thread_id' => $group_thread_id, 'subject' => ! empty( $message ) ? $message : ' ', 'content' => ! empty( $message ) ? $message : ' ', 'date_sent' => bp_core_current_time(), 'mark_visible' => true, 'error_type' => 'wp_error', ) ); return $this->bp_rest_groups_messages_validate_message( $new_reply, $request ); } // "Individual Members" Selected. } else { $meta = array( array( 'key' => 'group_message_type', 'value' => 'open', 'compare' => '!=', ), ); $individual_thread_id = 0; $_POST['message_thread_type'] = ''; // Check if there is already previously individual group thread created. if ( bp_has_message_threads( array( 'meta_query' => $meta ) ) ) { // phpcs:ignore $thread_id = 0; while ( bp_message_threads() ) { bp_message_thread(); $thread_id = bp_get_message_thread_id(); if ( $thread_id ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients = $members; $members_recipients = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members_recipients[] = (int) $single_recipients; } // check both previous and current recipients are same. $is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members_recipients ) && count( $previous_thread_recipients ) === count( $members_recipients ) && array_diff( $previous_thread_recipients, $members_recipients ) === array_diff( $members_recipients, $previous_thread_recipients ) ); $group_thread = (int) groups_get_groupmeta( (int) $group, 'group_message_thread' ); // If recipients are matched. if ( $is_recipient_match && (int) $thread_id !== $group_thread ) { break; } } } // If $thread_id found then add as a reply to that thread. if ( $thread_id ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); $last_message = BP_Messages_Thread::get_last_message( $thread_id ); $message_type = bp_messages_get_meta( $last_message->id, 'group_message_users', true ); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients = $members; $members_recipients = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members_recipients[] = (int) $single_recipients; } // check both previous and current recipients are same. $is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members_recipients ) && count( $previous_thread_recipients ) === count( $members_recipients ) && array_diff( $previous_thread_recipients, $members_recipients ) === array_diff( $members_recipients, $previous_thread_recipients ) ); $group_thread = (int) groups_get_groupmeta( (int) $group, 'group_message_thread' ); // If recipients are matched. if ( $is_recipient_match && (int) $thread_id !== $group_thread ) { $individual_thread_id = $thread_id; // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; // Else recipients not matched. } else { $previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() ); $existing_thread = 0; if ( $previous_threads ) { foreach ( $previous_threads as $thread ) { $is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() ); if ( $is_active_recipient ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread->thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients = $members; $members = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members[] = (int) $single_recipients; } // check both previous and current recipients are same. $is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) ); // check any messages of this thread should not be a open & all. $message_ids = wp_list_pluck( $thread->messages, 'id' ); $add_existing = true; foreach ( $message_ids as $id ) { // group_message_users not open. $message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual. if ( 'all' === $message_users ) { $add_existing = false; break; } } // If recipients are matched. if ( $is_recipient_match && $add_existing ) { $existing_thread = (int) $thread->thread_id; } } } if ( $existing_thread > 0 ) { $individual_thread_id = $existing_thread; // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } // Else no thread found. } else { $previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() ); $existing_thread = 0; if ( $previous_threads ) { foreach ( $previous_threads as $thread ) { $is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() ); if ( $is_active_recipient ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread->thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients = $members; $members = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members[] = (int) $single_recipients; } // check both previous and current recipients are same. $is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) ); // check any messages of this thread should not be a open & all. $message_ids = wp_list_pluck( $thread->messages, 'id' ); $add_existing = true; foreach ( $message_ids as $id ) { // group_message_users not open. $message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual. if ( 'all' === $message_users ) { $add_existing = false; break; } } // If recipients are matched. if ( $is_recipient_match && $add_existing ) { $existing_thread = (int) $thread->thread_id; } } } if ( $existing_thread > 0 ) { $individual_thread_id = $existing_thread; // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } // Else no previous thread found. } else { $previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() ); $existing_thread = 0; if ( $previous_threads ) { foreach ( $previous_threads as $thread ) { $is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() ); if ( $is_active_recipient ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread->thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients = $members; $members = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members[] = (int) $single_recipients; } // check both previous and current recipients are same. $is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) ); // check any messages of this thread should not be a open & all. $message_ids = wp_list_pluck( $thread->messages, 'id' ); $add_existing = true; foreach ( $message_ids as $id ) { // group_message_users not open. $message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual. if ( 'all' === $message_users ) { $add_existing = false; break; } } // If recipients are matched. if ( $is_recipient_match && $add_existing ) { $existing_thread = (int) $thread->thread_id; } } } if ( $existing_thread > 0 ) { $individual_thread_id = $existing_thread; // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } /** * Create Message based on the `message_thread_type` and `individual_thread_id`. */ if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) { $send = $this->bp_rest_groups_messages_new_message( array( 'recipients' => $members, 'subject' => wp_trim_words( $message, messages_get_default_subject_length() ), 'content' => $message, 'error_type' => 'wp_error', 'append_thread' => false, ) ); return $this->bp_rest_groups_messages_validate_message( $send, $request, 'individual' ); } elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $individual_thread_id ) ) { $new_reply = $this->bp_rest_groups_messages_new_message( array( 'thread_id' => $individual_thread_id, 'subject' => ! empty( $message ) ? $message : ' ', 'content' => ! empty( $message ) ? $message : ' ', 'date_sent' => bp_core_current_time(), 'mark_visible' => true, 'error_type' => 'wp_error', ) ); return $this->bp_rest_groups_messages_validate_message( $new_reply, $request, 'individual' ); } } // Else "Private Reply (BCC)" selected. } else { $all_members = $members; $messages_all = array(); // We have to send Message to all members to "Individual" message in both cases like "All Group Members" OR "Individual Members" selected. foreach ( $members as $member ) { $meta = array( array( 'key' => 'group_message_type', 'value' => 'open', 'compare' => '!=', ), ); $thread_loop_message_member = $member; $thread_loop_message_sent = false; // Find existing thread which are private. if ( bp_has_message_threads( array( 'meta_query' => $meta ) ) ) { // phpcs:ignore $thread_id = 0; $member_thread_id = 0; while ( bp_message_threads() ) { bp_message_thread(); $thread_id = bp_get_message_thread_id(); if ( $thread_id ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); $current_recipients[] = $thread_loop_message_member; $member_arr = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $member_arr[] = (int) $single_recipients; } $first_message = BP_Messages_Thread::get_first_message( $thread_id ); $message_user = bp_messages_get_meta( $first_message->id, 'group_message_users', true ); $message_type = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private. // check both previous and current recipients are same. $is_recipient_match = ( $previous_thread_recipients === $member_arr ); // If recipients are matched. if ( $is_recipient_match && 'all' !== $message_user ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; $member_thread_id = $thread_id; $thread_loop_message_sent = true; // If recipients then break the loop and go ahead because we don't need to check other threads. break; } elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; $member_thread_id = $thread_id; $thread_loop_message_sent = true; // If recipients then break the loop and go ahead because we don't need to check other threads. break; } } } // If there is no any thread matched. if ( false === $thread_loop_message_sent ) { $member_check = array(); $member_check[] = $member; $member_check[] = bp_loggedin_user_id(); $previous_threads = BP_Messages_Message::get_existing_threads( $member_check, bp_loggedin_user_id() ); $existing_thread = 0; if ( $previous_threads ) { foreach ( $previous_threads as $thread ) { $is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() ); if ( $is_active_recipient ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread->thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); if ( is_array( $member ) ) { $current_recipients = $member; } else { $current_recipients[] = $member; } $members = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members[] = (int) $single_recipients; } $first_message = BP_Messages_Thread::get_first_message( $thread->thread_id ); $message_user = bp_messages_get_meta( $first_message->id, 'group_message_users', true ); $message_type = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private. // check both previous and current recipients are same. $is_recipient_match = ( $previous_thread_recipients === $members ); // If recipients are matched. if ( $is_recipient_match && 'all' !== $message_user ) { $existing_thread = (int) $thread->thread_id; } elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) { $existing_thread = (int) $thread->thread_id; } } } if ( $existing_thread > 0 ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; $member_thread_id = $existing_thread; } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } /** * Create Message based on the `message_thread_type` and `member_thread_id`. */ if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) { $messages_all[] = $this->bp_rest_groups_messages_new_message( array( 'recipients' => $member, 'subject' => wp_trim_words( $message, messages_get_default_subject_length() ), 'content' => $message, 'error_type' => 'wp_error', 'is_hidden' => true, 'append_thread' => false, ) ); } elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $member_thread_id ) ) { $messages_all[] = $this->bp_rest_groups_messages_new_message( array( 'thread_id' => $member_thread_id, 'subject' => ! empty( $message ) ? $message : ' ', 'content' => ! empty( $message ) ? $message : ' ', 'date_sent' => bp_core_current_time(), 'mark_visible' => true, 'error_type' => 'wp_error', ) ); } // If no existing private thread found. } else { $member_check = array(); $member_check[] = $member; $member_check[] = bp_loggedin_user_id(); $previous_threads = BP_Messages_Message::get_existing_threads( $member_check, bp_loggedin_user_id() ); $existing_thread = 0; $member_thread_id = 0; if ( $previous_threads ) { foreach ( $previous_threads as $thread ) { $is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() ); if ( $is_active_recipient ) { // get the thread recipients. $thread = new BP_Messages_Thread( $thread->thread_id ); $thread_recipients = $thread->get_recipients(); $previous_thread_recipients = array(); // Store thread recipients to $previous_ids array. foreach ( $thread_recipients as $thread_recipient ) { if ( bp_loggedin_user_id() !== $thread_recipient->user_id ) { $previous_thread_recipients[] = $thread_recipient->user_id; } } $current_recipients = array(); if ( is_array( $member ) ) { $current_recipients = $member; } else { $current_recipients[] = $member; } $members = array(); // Store current recipients to $members array. foreach ( $current_recipients as $single_recipients ) { $members[] = (int) $single_recipients; } $first_message = BP_Messages_Thread::get_first_message( $thread->thread_id ); $message_user = bp_messages_get_meta( $first_message->id, 'group_message_users', true ); $message_type = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private. // check both previous and current recipients are same. $is_recipient_match = ( $previous_thread_recipients === $members ); // If recipients are matched. if ( $is_recipient_match && 'all' !== $message_user ) { $existing_thread = (int) $thread->thread_id; } elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) { $existing_thread = (int) $thread->thread_id; } } } if ( $existing_thread > 0 ) { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'reply'; $member_thread_id = $existing_thread; } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } } else { // This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type". $_POST['message_thread_type'] = 'new'; } /** * Create Message based on the `message_thread_type` and `member_thread_id`. */ if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) { $messages_all[] = $this->bp_rest_groups_messages_new_message( array( 'recipients' => $member, 'subject' => wp_trim_words( $message, messages_get_default_subject_length() ), 'content' => $message, 'error_type' => 'wp_error', 'is_hidden' => true, 'append_thread' => false, ) ); } elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $member_thread_id ) ) { $messages_all[] = $this->bp_rest_groups_messages_new_message( array( 'thread_id' => $member_thread_id, 'subject' => ! empty( $message ) ? $message : ' ', 'content' => ! empty( $message ) ? $message : ' ', 'date_sent' => $date_sent = bp_core_current_time(), 'mark_visible' => true, 'error_type' => 'wp_error', ) ); } } } $error = array(); $retval = array( 'message' => '', 'errors' => array(), 'data' => array(), ); if ( 'all' !== $message_users ) { $retval['message'] = sprintf( /* translators: Message member count. */ __( 'Your message was sent privately to %s members of this group.', 'buddyboss' ), count( $all_members ) ); } else { $retval['message'] = __( 'Your message was sent privately to all members of this group.', 'buddyboss' ); } if ( ! empty( $messages_all ) ) { foreach ( $messages_all as $message ) { if ( is_wp_error( $message ) ) { $error[] = $message->get_error_message(); } else { $thread = new BP_Messages_Thread( (int) $message ); $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 ) ) { $error[] = $fields_update; } $retval['data'][] = $this->prepare_response_for_collection( $this->message_endppoint->prepare_item_for_response( $thread, $request ) ); } } } if ( ! empty( $error ) ) { $retval['errors'] = $error; } $response = rest_ensure_response( $retval ); /** * Fires after a thread is fetched via the REST API. * * @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. * * @since 0.1.0 */ do_action( 'bp_rest_group_messages_create_items', $message, $response, $request ); return $response; } } /** * Check if a given request has access to create a message. * * @param WP_REST_Request $request Full details about the request. * * @return WP_Error|bool * @since 0.1.0 */ 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 group message.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } if ( true === $retval && function_exists( 'bp_disable_group_messages' ) && false === bp_disable_group_messages() ) { $retval = new WP_Error( 'bp_rest_authorization_required', __( 'Sorry, you are not allowed to create a group message.', 'buddyboss' ), array( 'status' => rest_authorization_required_code(), ) ); } /** * Filter the messages `create_item` permissions check. * * @param bool|WP_Error $retval Returned value. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ return apply_filters( 'bp_rest_messages_group_create_item_permissions_check', $retval, $request ); } /** * Get the message schema, conforming to JSON Schema. * * @return array * @since 0.1.0 */ public function get_item_schema() { $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'bp_messages', 'type' => 'object', 'properties' => array( 'message' => array( 'context' => array( 'view', 'edit' ), 'description' => __( 'Information for the user.', 'buddyboss' ), 'type' => 'string', ), 'data' => array( 'context' => array( 'view', 'edit' ), 'description' => __( 'Message thread', 'buddyboss' ), 'readonly' => true, 'type' => 'object', 'properties' => array(), ), ), ); $schema['properties']['data']['properties'] = $this->message_endppoint->get_item_schema()['properties']; /** * Filters the message schema. * * @param array $schema The endpoint schema. * * @since 0.1.0 */ return apply_filters( 'bp_rest_message_schema', $this->add_additional_fields_schema( $schema ) ); } /** * Get the query params for Messages collections. * * @return array * @since 0.1.0 */ public function get_collection_params() { $params = parent::get_collection_params(); $params['context']['default'] = 'edit'; unset( $params['page'], $params['per_page'], $params['search'] ); $params['group_id'] = array( 'description' => __( 'A unique numeric ID for the Group.', 'buddyboss' ), 'type' => 'integer', 'required' => true, 'sanitize_callback' => 'absint', 'validate_callback' => 'rest_validate_request_arg', ); $params['message'] = array( 'description' => __( 'Content of the Message to add to the Thread.', 'buddyboss' ), 'type' => 'string', 'required' => true, 'validate_callback' => 'rest_validate_request_arg', ); $params['users'] = array( 'description' => __( 'Group thread users individual or all.', 'buddyboss' ), 'type' => 'string', 'required' => true, 'enum' => array( 'all', 'individual' ), 'validate_callback' => 'rest_validate_request_arg', ); $params['users_list'] = array( 'description' => __( 'Limit result to messages created by a specific user.', 'buddyboss' ), 'type' => 'array', 'items' => array( 'type' => 'integer' ), 'sanitize_callback' => 'bp_rest_sanitize_string_list', 'validate_callback' => 'rest_validate_request_arg', ); $params['type'] = array( 'description' => __( 'Type of message, Group thread or private reply.', 'buddyboss' ), 'type' => 'string', 'required' => true, 'enum' => array( 'open', 'private' ), 'validate_callback' => 'rest_validate_request_arg', ); /** * Filters the collection query params. * * @param array $params Query params. */ return apply_filters( 'bp_rest_messages_group_collection_params', $params ); } /** * Create New Group Message. * -- from bp_groups_messages_new_message(); * * @param array|string $args { * Array of arguments. * * @type int $sender_id Optional. ID of the user who is sending the * message. Default: ID of the logged-in user. * @type int $thread_id Optional. ID of the parent thread. Leave blank to * create a new thread for the message. * @type array $recipients IDs or usernames of message recipients. If this * is an existing thread, it is unnecessary to pass a $recipients * argument - existing thread recipients will be assumed. * @type string $subject Optional. Subject line for the message. For * existing threads, the existing subject will be used. For new * threads, 'No Subject' will be used if no $subject is provided. * @type string $content Content of the message. Cannot be empty. * @type string $date_sent Date sent, in 'Y-m-d H:i:s' format. Default: current date/time. * @type bool $is_hidden Optional. Whether to hide the thread from sender messages inbox or not. Default: false. * @type bool $mark_visible Optional. Whether to mark thread visible to all other participants. Default: false. * @type string $error_type Optional. Error type. Either 'bool' or 'wp_error'. Default: 'bool'. * } * * @return int|bool|WP_Error ID of the message thread on success, false on failure. */ public function bp_rest_groups_messages_new_message( $args = '' ) { $send = ''; remove_action( 'messages_message_sent', 'messages_notification_new_message', 10 ); add_action( 'messages_message_sent', 'group_messages_notification_new_message', 10 ); $r = bp_parse_args( $args, array( 'sender_id' => bp_loggedin_user_id(), 'thread_id' => false, // False for a new message, thread id for a reply to a thread. 'recipients' => array(), // Can be an array of usernames, user_ids or mixed. 'subject' => false, 'content' => false, 'date_sent' => bp_core_current_time(), 'append_thread' => false, 'is_hidden' => false, 'mark_visible' => false, 'group_thread' => true, 'error_type' => 'wp_error', ), 'bp_groups_messages_new_message' ); // Attempt to send the message. $send = messages_new_message( $r ); remove_action( 'messages_message_sent', 'group_messages_notification_new_message', 10 ); add_action( 'messages_message_sent', 'messages_notification_new_message', 10 ); return $send; } /** * Check group message has been successfully sent or not. * - bp_groups_messages_validate_message(); * * @param mixed $send int|bool|WP_Error. * @param WP_REST_Request $request Rest request. * @param string $type Type of the message `all` or `individual`. * * @return WP_Error */ public function bp_rest_groups_messages_validate_message( $send, $request, $type = 'all' ) { if ( is_wp_error( $send ) ) { return new WP_Error( 'bp_rest_unknown_error', $send->get_error_message(), array( 'status' => rest_authorization_required_code(), ) ); } elseif ( ! empty( $send ) ) { $thread = new BP_Messages_Thread( (int) $send ); $recipients_count = ( count( $thread->recipients ) > 1 ? count( $thread->recipients ) - ( isset( $request['user_id'] ) && ! empty( $request['user_id'] ) ? 1 : 0 ) : 0 ); if ( 'individual' === $type ) { $retval['message'] = sprintf( /* translators: Message member count. */ __( 'Your message was sent to %s members of this group.', 'buddyboss' ), $recipients_count ); } else { $retval['message'] = __( 'Your message was sent to all members of this group.', 'buddyboss' ); } $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['data'] = $this->prepare_response_for_collection( $this->message_endppoint->prepare_item_for_response( $thread, $request ) ); $response = rest_ensure_response( $retval ); /** * Fires after a thread is fetched via the REST API. * * @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. * * @since 0.1.0 */ do_action( 'bp_rest_group_messages_create_items', $thread, $response, $request ); return $response; } } }
Changelog
Version | Description |
---|---|
0.1.0 | Introduced. |
Methods
- __construct — Constructor.
- bp_rest_groups_messages_new_message — Create New Group Message.
- bp_rest_groups_messages_validate_message — Check group message has been successfully sent or not.
- 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.
- get_collection_params — Get the query params for Messages collections.
- get_item_schema — Get the message schema, conforming to JSON Schema.
- register_routes — Register the component routes.
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.