Skip to:
Content

BuddyPress.org

Ticket #6210: 6210.03132019.diff

File 6210.03132019.diff, 170.3 KB (added by dcavins, 5 years ago)

Change names of classes and other logic changes.

  • src/bp-core/admin/bp-core-admin-schema.php

    diff --git a/src/bp-core/admin/bp-core-admin-schema.php b/src/bp-core/admin/bp-core-admin-schema.php
    index 02a410ba9..30be48e8b 100644
    a b function bp_core_install_emails() { 
    535535         */
    536536        do_action( 'bp_core_install_emails' );
    537537}
     538
     539/**
     540 * Install database tables for the Invitations API
     541 *
     542 * @since 5.0.0
     543 *
     544 * @uses bp_core_set_charset()
     545 * @uses bp_core_get_table_prefix()
     546 * @uses dbDelta()
     547 */
     548function bp_core_install_invitations() {
     549        $sql             = array();
     550        $charset_collate = $GLOBALS['wpdb']->get_charset_collate();
     551        $bp_prefix       = bp_core_get_table_prefix();
     552        $sql[] = "CREATE TABLE {$bp_prefix}bp_invitations (
     553                id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     554                user_id bigint(20) NOT NULL,
     555                inviter_id bigint(20) NOT NULL,
     556                invitee_email varchar(100) DEFAULT NULL,
     557                class varchar(120) NOT NULL,
     558                item_id bigint(20) NOT NULL,
     559                secondary_item_id bigint(20) DEFAULT NULL,
     560                type varchar(12) NOT NULL DEFAULT 'invite',
     561                content longtext DEFAULT '',
     562                date_modified datetime NOT NULL,
     563                invite_sent tinyint(1) NOT NULL DEFAULT '0',
     564                accepted tinyint(1) NOT NULL DEFAULT '0',
     565                KEY user_id (user_id),
     566                KEY inviter_id (inviter_id),
     567                KEY invitee_email (invitee_email),
     568                KEY class (class),
     569                KEY item_id (item_id),
     570                KEY secondary_item_id (secondary_item_id),
     571                KEY type (type),
     572                KEY invite_sent (invite_sent),
     573                KEY accepted (accepted)
     574                ) {$charset_collate};";
     575        dbDelta( $sql );
     576
     577        // @TODO: Migrate invitations here
     578
     579        /**
     580         * Fires after BuddyPress adds the invitations table.
     581         *
     582         * @since 5.0.0
     583         */
     584        do_action( 'bp_core_install_invitations' );
     585}
  • src/bp-core/bp-core-functions.php

    diff --git a/src/bp-core/bp-core-functions.php b/src/bp-core/bp-core-functions.php
    index f3c8be614..dfeb65368 100644
    a b function bp_email_get_schema() { 
    34793479                        /* translators: do not remove {} brackets or translate its contents. */
    34803480                        'post_title'   => __( '[{{{site.name}}}] You have an invitation to the group: "{{group.name}}"', 'buddypress' ),
    34813481                        /* translators: do not remove {} brackets or translate its contents. */
    3482                         'post_content' => __( "<a href=\"{{{inviter.url}}}\">{{inviter.name}}</a> has invited you to join the group: &quot;{{group.name}}&quot;.\n<a href=\"{{{invites.url}}}\">Go here to accept your invitation</a> or <a href=\"{{{group.url}}}\">visit the group</a> to learn more.", 'buddypress' ),
     3482                        'post_content' => __( "<a href=\"{{{inviter.url}}}\">{{inviter.name}}</a> has invited you to join the group: &quot;{{group.name}}&quot;.\n{{invite.message}}\n<a href=\"{{{invites.url}}}\">Go here to accept your invitation</a> or <a href=\"{{{group.url}}}\">visit the group</a> to learn more.", 'buddypress' ),
    34833483                        /* translators: do not remove {} brackets or translate its contents. */
    34843484                        'post_excerpt' => __( "{{inviter.name}} has invited you to join the group: \"{{group.name}}\".\n\nTo accept your invitation, visit: {{{invites.url}}}\n\nTo learn more about the group, visit: {{{group.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ),
    34853485                ),
    function bp_email_get_schema() { 
    34953495                        /* translators: do not remove {} brackets or translate its contents. */
    34963496                        'post_title'   => __( '[{{{site.name}}}] Membership request for group: {{group.name}}', 'buddypress' ),
    34973497                        /* translators: do not remove {} brackets or translate its contents. */
    3498                         'post_content' => __( "<a href=\"{{{profile.url}}}\">{{requesting-user.name}}</a> wants to join the group &quot;{{group.name}}&quot;. As you are an administrator of this group, you must either accept or reject the membership request.\n\n<a href=\"{{{group-requests.url}}}\">Go here to manage this</a> and all other pending requests.", 'buddypress' ),
     3498                        'post_content' => __( "<a href=\"{{{profile.url}}}\">{{requesting-user.name}}</a> wants to join the group &quot;{{group.name}}&quot;.\n {{request.message}}\n As you are an administrator of this group, you must either accept or reject the membership request.\n\n<a href=\"{{{group-requests.url}}}\">Go here to manage this</a> and all other pending requests.", 'buddypress' ),
    34993499                        /* translators: do not remove {} brackets or translate its contents. */
    35003500                        'post_excerpt' => __( "{{requesting-user.name}} wants to join the group \"{{group.name}}\". As you are the administrator of this group, you must either accept or reject the membership request.\n\nTo manage this and all other pending requests, visit: {{{group-requests.url}}}\n\nTo view {{requesting-user.name}}'s profile, visit: {{{profile.url}}}", 'buddypress' ),
    35013501                ),
  • new file src/bp-core/bp-core-invitations-cache.php

    diff --git a/src/bp-core/bp-core-invitations-cache.php b/src/bp-core/bp-core-invitations-cache.php
    new file mode 100644
    index 000000000..7cf867398
    - +  
     1<?php
     2/**
     3 * BuddyPress Invitation Caching Functions.
     4 *
     5 * Caching functions handle the clearing of cached objects and pages on specific
     6 * actions throughout BuddyPress.
     7 *
     8 * @package BuddyPress
     9 * @subpackage InvitationsCache
     10 * @since 5.0.0
     11 */
     12
     13/**
     14 * Resets all incremented bp_invitations caches.
     15 *
     16 * @since 5.0.0
     17 */
     18function bp_invitations_reset_cache_incrementor() {
     19        bp_core_reset_incrementor( 'bp_invitations' );
     20}
     21add_action( 'bp_invitation_after_save', 'bp_invitations_reset_cache_incrementor' );
     22add_action( 'bp_invitation_after_delete', 'bp_invitations_reset_cache_incrementor' );
  • src/bp-core/bp-core-update.php

    diff --git a/src/bp-core/bp-core-update.php b/src/bp-core/bp-core-update.php
    index b006ff4d5..4a4b1e20a 100644
    a b function bp_version_updater() { 
    211211                bp_update_option( 'bp-active-components', $default_components );
    212212                bp_core_add_page_mappings( $default_components, 'delete' );
    213213                bp_core_install_emails();
     214                bp_core_install_invitations();
    214215
    215216        // Upgrades.
    216217        } else {
    function bp_version_updater() { 
    268269                if ( $raw_db_version < 11105 ) {
    269270                        bp_update_to_2_7();
    270271                }
     272
     273                // Version 5.0.0.
     274                if ( $raw_db_version < 11300 ) {
     275                        bp_update_to_5_0();
     276                }
    271277        }
    272278
    273279        /* All done! *************************************************************/
    function bp_update_to_2_7() { 
    542548        bp_add_option( '_bp_ignore_deprecated_code', false );
    543549}
    544550
     551/**
     552 * 5.0.0 update routine.
     553 *
     554 * - Create the invitations table.
     555 * - Migrate requests and invitations to the new table.
     556 *
     557 * @since 2.7.0
     558 */
     559function bp_update_to_5_0() {
     560        bp_core_install_invitations();
     561        //@TODO: Migration function.
     562}
     563
    545564/**
    546565 * Updates the component field for new_members type.
    547566 *
  • new file src/bp-core/classes/class-bp-invitation-manager.php

    diff --git a/src/bp-core/classes/class-bp-invitation-manager.php b/src/bp-core/classes/class-bp-invitation-manager.php
    new file mode 100644
    index 000000000..b67c73179
    - +  
     1<?php
     2/**
     3 * Core invitations class.
     4 *
     5 * @package BuddyPress
     6 * @subpackage Core
     7 * @since 5.0.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * BP Invitations class.
     15 *
     16 * Extend it to manage your class's invitations.
     17 * Your extension class, must, at a minimum, provide the
     18 * run_send_action() and run_acceptance_action() methods.
     19 *
     20 * @since 5.0.0
     21 */
     22abstract class BP_Invitation_Manager {
     23
     24        /**
     25         * The name of the related class.
     26         *
     27         * @since 5.0.0
     28         * @access public
     29         * @var string
     30         */
     31        protected $class_name;
     32
     33        /**
     34         * Construct parameters.
     35         *
     36         * @since 5.0.0
     37         *
     38         * @param array|string $args {
     39         * }
     40         */
     41        public function __construct( $args = array() ) {
     42                $this->class_name = sanitize_key( get_class( $this ) );
     43        }
     44
     45        /**
     46         * Get the invitations table name.
     47         *
     48         * @since 5.0.0
     49         * @access public
     50         * @return string
     51         */
     52        public static function get_table_name() {
     53                return buddypress()->table_prefix . 'bp_invitations';
     54        }
     55
     56        /** Create ********************************************************************/
     57
     58        /**
     59         * Add an invitation to a specific user, from a specific user, related to a
     60         * specific class.
     61         *
     62         * @since 5.0.0
     63         *
     64         * @param array $args {
     65         *     Array of arguments describing the invitation. All are optional.
     66         *         @type int    $user_id ID of the invited user.
     67         *         @type int    $inviter_id ID of the user who created the invitation.
     68         *         @type string $invitee_email Email address of the invited user.
     69         *         @type int    $item_id ID associated with the invitation and class.
     70         *         @type int    $secondary_item_id secondary ID associated with the
     71         *                              invitation and class.
     72         *         @type string $type @TODO.
     73         *         @type string $content Extra information provided by the requester
     74         *                              or inviter.
     75         *         @type string $date_modified Date the invitation was last modified.
     76         *         @type int    $send_invite Should the invitation also be sent, or is it a
     77         *                       draft invite?
     78         * }
     79         * @return int|bool ID of the newly created invitation on success, false
     80         *         on failure.
     81         */
     82        public function add_invitation( $args = array() ) {
     83
     84                $r = bp_parse_args( $args, array(
     85                        'user_id'           => 0,
     86                        'invitee_email'         => '',
     87                        'inviter_id'            => 0,
     88                        'item_id'           => 0,
     89                        'secondary_item_id' => 0,
     90                        'type'                          => 'invite',
     91                        'content'                       => '',
     92                        'date_modified'     => bp_core_current_time(),
     93                        'send_invite'       => 0,
     94                        'accepted'          => 0
     95                ), 'add_invitation' );
     96
     97                // Invitations must have an invitee and inviter.
     98                if ( ! ( ( $r['user_id'] || $r['invitee_email'] ) && $r['inviter_id'] ) ) {
     99                        return false;
     100                }
     101
     102                /**
     103                 * Is this user allowed to extend invitations in this situation?
     104                 *
     105                 * @since 5.0.0
     106                 *
     107                 * @param array $r Describes the invitation to be added.
     108                 */
     109                if ( ! $this->allow_invitation( $r ) ) {
     110                        return false;
     111                }
     112
     113                // Avoid creating duplicate invitations.
     114                $invite_id = $this->invitation_exists( array(
     115                        'user_id'           => $r['user_id'],
     116                        'invitee_email'     => $r['invitee_email'],
     117                        'inviter_id'        => $r['inviter_id'],
     118                        'item_id'           => $r['item_id'],
     119                        'secondary_item_id' => $r['secondary_item_id'],
     120                ) );
     121
     122                if ( ! $invite_id ) {
     123                        // Set up the new invitation as a draft.
     124                        $invitation                    = new BP_Invitation;
     125                        $invitation->user_id           = $r['user_id'];
     126                        $invitation->inviter_id        = $r['inviter_id'];
     127                        $invitation->invitee_email     = $r['invitee_email'];
     128                        $invitation->class             = $this->class_name;
     129                        $invitation->item_id           = $r['item_id'];
     130                        $invitation->secondary_item_id = $r['secondary_item_id'];
     131                        $invitation->type              = $r['type'];
     132                        $invitation->content           = $r['content'];
     133                        $invitation->date_modified     = $r['date_modified'];
     134                        $invitation->invite_sent       = 0;
     135                        $invitation->accepted          = 0;
     136
     137                        $invite_id = $invitation->save();
     138                }
     139
     140                // "Send" the invite if necessary.
     141                if ( $invite_id && $r['send_invite'] ) {
     142                                $sent = $this->send_invitation_by_id( $invite_id );
     143                        if ( ! $sent ) {
     144                                return false;
     145                        }
     146                }
     147
     148                return $invite_id;
     149        }
     150
     151        /**
     152         * Send an invitation notification.
     153         *
     154         * @since 5.0.0
     155         * @access public
     156         *
     157         * @param int $invitation_id ID of invitation to send.
     158         *
     159         * @return int|bool The number of rows updated, or false on error.
     160         */
     161        public function send_invitation_by_id( $invitation_id = 0 ) {
     162                $updated = false;
     163
     164                $invitation = new BP_Invitation( $invitation_id );
     165
     166                if ( ! $invitation->id ) {
     167                        return false;
     168                }
     169
     170                /**
     171                 * Fires before an invitation is sent.
     172                 *
     173                 * @since 5.0.0
     174                 *
     175                 * @param BP_Invitation object $invitation Invitation about to be sent.
     176                 */
     177                do_action( 'bp_invitations_send_invitation_by_id_before_send', $invitation );
     178
     179                /*
     180                 * Before sending an invitation, check for outstanding requests to the same item.
     181                 * A sent invitation + a request = acceptance.
     182                 */
     183                $request_args = array(
     184                        'user_id'           => $invitation->user_id,
     185                        'invitee_email'     => $invitation->invitee_email,
     186                        'item_id'           => $invitation->item_id,
     187                        'secondary_item_id' => $invitation->secondary_item_id,
     188                );
     189                $request = $this->request_exists( $request_args );
     190
     191                if ( ! empty( $request ) ) {
     192                        // Accept the request.
     193                        return $this->accept_request( $request_args );
     194                }
     195
     196                // Perform the send action.
     197                $this->run_send_action( $invitation );
     198
     199                $updated = BP_Invitation::mark_sent( $invitation->id );
     200
     201                return $updated;
     202        }
     203
     204        /**
     205         * Add a request to an item for a specific user, related to a
     206         * specific class.
     207         *
     208         * @since 5.0.0
     209         *
     210         * @param array $args {
     211         *     Array of arguments describing the invitation. All are optional.
     212         *         @type int    $user_id ID of the invited user.
     213         *         @type int    $inviter_id ID of the user who created the invitation.
     214         *         @type string $class Name of the invitations class.
     215         *         @type int    $item_id ID associated with the invitation and class.
     216         *         @type int    $secondary_item_id secondary ID associated with the
     217         *                              invitation and class.
     218         *         @type string $type @TODO.
     219         *         @type string $content Extra information provided by the requester
     220         *                              or inviter.
     221         *         @type string $date_modified Date the invitation was last modified.
     222         *         @type int    $invite_sent Has the invitation been sent, or is it a
     223         *                       draft invite?
     224         * }
     225         * @return int|bool ID of the newly created invitation on success, false
     226         *         on failure.
     227         */
     228        public function add_request( $args = array() ) {
     229
     230                $r = bp_parse_args( $args, array(
     231                        'user_id'           => 0,
     232                        'inviter_id'        => 0,
     233                        'invitee_email'     => '',
     234                        'item_id'           => 0,
     235                        'secondary_item_id' => 0,
     236                        'type'              => 'request',
     237                        'content'           => '',
     238                        'date_modified'     => bp_core_current_time(),
     239                        'invite_sent'       => 0,
     240                        'accepted'          => 0
     241                ), 'add_request' );
     242
     243                // If there is no invitee, bail.
     244                if ( ! ( $r['user_id'] || $r['invitee_email'] ) ) {
     245                                return false;
     246                }
     247
     248                /**
     249                 * Is this user allowed to make a request in this situation?
     250                 *
     251                 * @since 5.0.0
     252                 *
     253                 * @param array $r Describes the invitation to be added.
     254                 */
     255                if ( ! $this->allow_request( $r ) ) {
     256                        return false;
     257                }
     258
     259                /*
     260                 * Avoid creating duplicate requests.
     261                 */
     262                $base_args = array(
     263                        'user_id'           => $r['user_id'],
     264                        'invitee_email'     => $r['invitee_email'],
     265                        'item_id'           => $r['item_id'],
     266                        'secondary_item_id' => $r['secondary_item_id'],
     267                );
     268                if ( $this->request_exists( $base_args ) ) {
     269                        return false;
     270                }
     271
     272                /*
     273                 * Check for outstanding invitations to the same item.
     274                 * A request + a sent invite = acceptance.
     275                 */
     276                $invite_args = array_merge( $base_args, array( 'invite_sent' => 'sent' ) );
     277                $invite = $this->invitation_exists( $invite_args );
     278
     279                if ( $invite ) {
     280                        // Accept the invite.
     281                        return $this->accept_invitation( $base_args );
     282                } else {
     283                        // Set up the new request.
     284                        $request                    = new BP_Invitation;
     285                        $request->user_id           = $r['user_id'];
     286                        $request->inviter_id        = $r['inviter_id'];
     287                        $request->invitee_email     = $r['invitee_email'];
     288                        $request->class             = $this->class_name;
     289                        $request->item_id           = $r['item_id'];
     290                        $request->secondary_item_id = $r['secondary_item_id'];
     291                        $request->type              = $r['type'];
     292                        $request->content           = $r['content'];
     293                        $request->date_modified     = $r['date_modified'];
     294                        $request->invite_sent       = $r['invite_sent'];
     295                        $request->accepted          = $r['accepted'];
     296
     297                        // Save the new invitation.
     298                        return $request->save();
     299                }
     300        }
     301
     302        /**
     303         * Send a request notification.
     304         *
     305         * @since 5.0.0
     306         * @access public
     307         *
     308         * @param int $request_id ID of request to send.
     309         *
     310         * @return int|bool The number of rows updated, or false on error.
     311         */
     312        public function send_request_notification_by_id( $request_id = 0 ) {
     313                $updated = false;
     314
     315                $request = new BP_Invitation( $request_id );
     316
     317                if ( ! $request->id ) {
     318                        return false;
     319                }
     320
     321                // Different uses may need different actions on sending. Plugins can hook in here to perform their own tasks.
     322                do_action( 'bp_invitations_send_request_notification_by_id_before_send', $request_id, $request );
     323
     324                /*
     325                 * Before sending notifications, check for outstanding invitations to the same item.
     326                 * A sent invitation + a request = acceptance.
     327                 */
     328                $args = array(
     329                        'user_id'           => $request->user_id,
     330                        'invitee_email'     => $request->invitee_email,
     331                        'item_id'           => $request->item_id,
     332                        'secondary_item_id' => $request->secondary_item_id,
     333                        'invite_sent'       => 'sent'
     334                );
     335                $invites = $this->invitation_exists( $args );
     336
     337                if ( ! empty( $invites ) ) {
     338                        // Accept the request.
     339                        return $this->accept_invitation( $args );
     340                }
     341
     342                // Perform the send action.
     343                $this->run_send_action( $request );
     344
     345                $updated = BP_Invitation::mark_sent( $request->id );
     346
     347                return $updated;
     348        }
     349
     350        /** Retrieve ******************************************************************/
     351
     352        /**
     353         * Get a specific invitation by its ID.
     354         *
     355         * @since 5.0.0
     356         *
     357         * @param int $id ID of the invitation.
     358         * @return BP_Invitation object
     359         */
     360        public function get_by_id( $id = 0 ) {
     361                return new BP_Invitation( $id );
     362        }
     363
     364        /**
     365         * Get invitations, based on provided filter parameters.
     366         *
     367         * @since 5.0.0
     368         *
     369         * @see BP_Invitation::get() for a description of accepted parameters.
     370         *
     371         * @return array Located invitations.
     372         */
     373        public function get_invitations( $args = array() ) {
     374                // Default to returning invitations, not requests.
     375                if ( empty( $args['type'] ) ) {
     376                        $args['type'] = 'invite';
     377                }
     378                // Use the class_name property value.
     379                $args['class'] = $this->class_name;
     380
     381                return BP_Invitation::get( $args );
     382        }
     383
     384        /**
     385         * Get requests, based on provided filter parameters.
     386         *
     387         * @since 5.0.0
     388         *
     389         * @see BP_Invitation::get() for a description of accepted parameters.
     390         *
     391         * @return array Located invitations.
     392         */
     393        public function get_requests( $args = array() ) {
     394                // Set request-specific parameters.
     395                $args['type']        = 'request';
     396                $args['inviter_id']  = false;
     397                $args['invite_sent'] = 'all';
     398
     399                // Use the class_name property value.
     400                $args['class'] = $this->class_name;
     401
     402                return BP_Invitation::get( $args );
     403        }
     404
     405        /**
     406         * Check whether an invitation exists matching the passed arguments.
     407         *
     408         * @since 5.0.0
     409         *
     410         * @see BP_Invitation::get() for a description of accepted parameters.
     411         *
     412         * @return bool|int ID of first found invitation or false if none found.
     413         */
     414        public function invitation_exists( $args = array() ) {
     415                $is_invited = false;
     416
     417                $args['fields'] = 'ids';
     418                $invites = $this->get_invitations( $args );
     419                if ( $invites ) {
     420                        $is_invited = current( $invites );
     421                }
     422                return $is_invited;
     423        }
     424
     425        /**
     426         * Check whether a request exists matching the passed arguments.
     427         *
     428         * @since 5.0.0
     429         *
     430         * @see BP_Invitation::get() for a description of accepted parameters.
     431         *
     432         * @return bool|int ID of existing request or false if none found.
     433         */
     434        public function request_exists( $args = array() ) {
     435                $has_request = false;
     436
     437                $args['fields'] = 'ids';
     438                $requests = $this->get_requests( $args );
     439                if ( $requests ) {
     440                        $has_request = current( $requests );
     441                }
     442                return $has_request;
     443        }
     444
     445        /** Update ********************************************************************/
     446
     447        /**
     448         * Accept invitation, based on provided filter parameters.
     449         *
     450         * @since 5.0.0
     451         *
     452         * @see BP_Invitation::get() for a description of
     453         *      accepted update/where arguments.
     454         *
     455         * @param array $update_args Associative array of fields to update,
     456         *              and the values to update them to. Of the format
     457         *              array( 'user_id' => 4 )
     458         *
     459         * @return int|bool Number of rows updated on success, false on failure.
     460         */
     461         public function accept_invitation( $args = array() ) {
     462
     463                /*
     464                 * Some basic info is required to accept an invitation,
     465                 * because we'll need to mark all similar invitations and requests.
     466                 * The following, except the optional 'secondary_item_id', are required.
     467                 */
     468                $r = bp_parse_args( $args, array(
     469                        'user_id'           => 0,
     470                        'invitee_email'     => '',
     471                        'item_id'           => null,
     472                        'secondary_item_id' => null,
     473                        'invite_sent'       => 'sent',
     474                ), 'accept_invitation' );
     475                $r['class'] = $this->class_name;
     476
     477                if ( ! ( ( $r['user_id'] || $r['invitee_email'] ) && $r['class'] && $r['item_id'] ) ) {
     478                        return false;
     479                }
     480
     481                $success = $this->run_acceptance_action( 'invite', $r );
     482                if ( $success ) {
     483                        // Mark invitations & requests to this item for this user.
     484                        $this->mark_accepted( $r );
     485
     486                        // Allow plugins an opportunity to act on the change.
     487                        do_action( 'bp_invitations_accepted_invite', $r );
     488                }
     489                return $success;
     490        }
     491
     492        /**
     493         * Accept invitation, based on provided filter parameters.
     494         *
     495         * @since 5.0.0
     496         *
     497         * @see BP_Invitation::get() for a description of
     498         *      accepted update/where arguments.
     499         *
     500         * @param array $update_args Associative array of fields to update,
     501         *              and the values to update them to. Of the format
     502         *              array( 'user_id' => 4 )
     503         *
     504         * @return bool Number of rows updated on success, false on failure.
     505         */
     506         public function accept_request( $args = array() ) {
     507                /*
     508                 * Some basic info is required to accept an invitation,
     509                 * because we'll need to accept all similar invitations and requests.
     510                 * The following, except the optional 'secondary_item_id', are required.
     511                 */
     512                $r = bp_parse_args( $args, array(
     513                        'user_id'           => 0,
     514                        'item_id'           => null,
     515                        'secondary_item_id' => null,
     516                ), 'accept_request' );
     517                $r['class'] = $this->class_name;
     518
     519                if ( ! ( $r['user_id'] && $r['class'] && $r['item_id'] ) ) {
     520                        return false;
     521                }
     522
     523                $success = $this->run_acceptance_action( 'request', $r );
     524                if ( $success ) {
     525                        // Update/Delete all related invitations & requests to this item for this user.
     526                        $this->mark_accepted( $r );
     527
     528                        // Allow plugins an opportunity to act on the change.
     529                        do_action( 'bp_invitations_accepted_request', $r );
     530                }
     531                return $success;
     532        }
     533
     534        /**
     535         * Update invitation, based on provided filter parameters.
     536         *
     537         * @since 5.0.0
     538         *
     539         * @see BP_Invitation::get() for a description of
     540         *      accepted update/where arguments.
     541         *
     542         * @param array $update_args Associative array of fields to update,
     543         *              and the values to update them to. Of the format
     544         *              array( 'user_id' => 4 )
     545         * @param array $where_args Associative array of columns/values, to
     546         *              determine which invitations should be updated. Formatted as
     547         *              array( 'item_id' => 7 )
     548         * @return int|bool Number of rows updated on success, false on failure.
     549         */
     550        public function update_invitation( $update_args = array(), $where_args = array() ) {
     551                $update_args['class'] = $this->class_name;
     552                return BP_Invitation::update( $update_args, $where_args );
     553        }
     554
     555
     556        /**
     557         * This is where custom actions are added (in child classes)
     558         * to run when an invitation or request needs to be "sent."
     559         *
     560         * @since 5.0.0
     561         *
     562         * @param BP_Invitation $invitation The invitation to send.
     563         * @return bool True on success, false on failure.
     564         */
     565        abstract public function run_send_action( BP_Invitation $invitation );
     566
     567        /**
     568         * Mark invitations as sent that are found by user_id, inviter_id,
     569         * invitee_email, class name, optional item id,
     570         * optional secondary item id.
     571         *
     572         * @since 5.0.0
     573         *
     574         * @param array $args {
     575         *     Associative array of arguments. All arguments but $page and
     576         *     $per_page can be treated as filter values for get_where_sql()
     577         *     and get_query_clauses(). All items are optional.
     578         *     @type int|array    $user_id ID of user being queried. Can be an
     579         *                        array of user IDs.
     580         *     @type int|array    $inviter_id ID of user who created the
     581         *                        invitation. Can be an array of user IDs.
     582         *                        Special cases
     583         *     @type string|array $invitee_email Email address of invited users
     584         *                                    being queried. Can be an array of addresses.
     585         *     @type string|array $class Name of the class to
     586         *                        filter by. Can be an array of class names.
     587         *     @type int|array    $item_id ID of associated item. Can be an array
     588         *                        of multiple item IDs.
     589         *     @type int|array    $secondary_item_id ID of secondary associated
     590         *                        item. Can be an array of multiple IDs.
     591         * }
     592         */
     593        public function mark_sent( $args ) {
     594                $args['class'] = $this->class_name;
     595                return BP_Invitation::mark_sent_by_data( $args );
     596        }
     597
     598        /**
     599         * This is where custom actions are added (in child classes)
     600         * to run when an invitation or request is accepted.
     601         *
     602         * @since 5.0.0
     603         *
     604         * @param int $id The ID of the invitation to mark as sent.
     605         * @return bool True on success, false on failure.
     606         */
     607        abstract public function run_acceptance_action( $type = 'invite', $r  );
     608
     609        /**
     610         * Mark invitation as accepted by invitation ID.
     611         *
     612         * @since 5.0.0
     613         *
     614         * @param int $id The ID of the invitation to mark as sent.
     615         * @return bool True on success, false on failure.
     616         */
     617        public function mark_accepted_by_id( $id ) {
     618                return BP_Invitation::mark_accepted( $id );
     619        }
     620
     621        /**
     622         * Mark invitations as sent that are found by user_id, inviter_id,
     623         * invitee_email, class name, optional item id,
     624         * optional secondary item id.
     625         *
     626         * @since 5.0.0
     627         *
     628         * @see BP_Invitation::mark_accepted_by_data()
     629         *      for a description of arguments.
     630         */
     631        public function mark_accepted( $args ) {
     632                $args['class'] = $this->class_name;
     633                return BP_Invitation::mark_accepted_by_data( $args );
     634        }
     635
     636        /** Delete ********************************************************************/
     637
     638        /**
     639         * Delete an invitation or invitations by query data.
     640         *
     641         * @since 5.0.0
     642         *
     643         * @see BP_Invitation::delete for a description of arguments.
     644         * @return int|false Number of rows deleted on success, false on failure.
     645         */
     646        public function delete( $args ) {
     647                if ( empty( $args['type'] ) ) {
     648                        $args['type'] = 'invite';
     649                }
     650                $args['class'] = $this->class_name;
     651                return BP_Invitation::delete( $args );
     652        }
     653
     654        /**
     655         * Delete a request or requests by query data.
     656         *
     657         * @since 5.0.0
     658         *
     659         * @see BP_Invitation::delete for a description of arguments.
     660         *
     661         * @return int|false Number of rows deleted on success, false on failure.
     662         */
     663        public function delete_requests( $args ) {
     664                $args['type'] = 'request';
     665                return $this->delete( $args );
     666        }
     667
     668        /**
     669         * Delete all invitations by class.
     670         *
     671         * Used when clearing out invitations for an entire class. Possibly used
     672         * when deactivating a component related to a class that created invitations.
     673         *
     674         * @since 5.0.0
     675         *
     676         * @return int|false Number of rows deleted on success, false on failure.
     677         */
     678        public function delete_all() {
     679                return BP_Invitation::delete( array(
     680                        'class' => $this->class_name,
     681                ) );
     682        }
     683
     684        /**
     685         * This is where custom actions are added (in child classes)
     686         * to determine whether an invitation should be allowed.
     687         *
     688         * @since 5.0.0
     689         *
     690         * @param array $args The parameters describing the invitation.
     691         * @return bool True if allowed, false to end process.
     692         */
     693        public function allow_invitation( $args ) {
     694                return true;
     695        }
     696
     697        /**
     698         * This is where custom actions are added (in child classes)
     699         * to determine whether a request should be allowed.
     700         *
     701         * @since 5.0.0
     702         *
     703         * @param array $args The parameters describing the request.
     704         * @return bool True if allowed, false to end process.
     705         */
     706        public function allow_request( $args ) {
     707                return true;
     708        }
     709
     710}
  • new file src/bp-core/classes/class-bp-invitation.php

    diff --git a/src/bp-core/classes/class-bp-invitation.php b/src/bp-core/classes/class-bp-invitation.php
    new file mode 100644
    index 000000000..8c06238ef
    - +  
     1<?php
     2
     3/**
     4 * BuddyPress Invitation Class
     5 *
     6 * @package BuddyPress
     7 * @subpackage Invitations
     8 *
     9 * @since 5.0.0
     10 */
     11
     12// Exit if accessed directly.
     13defined( 'ABSPATH' ) || exit;
     14
     15/**
     16 * BuddyPress Invitations.
     17 *
     18 * Use this class to create, access, edit, or delete BuddyPress Invitations.
     19 *
     20 * @since 5.0.0
     21 */
     22class BP_Invitation {
     23
     24        /**
     25         * The invitation ID.
     26         *
     27         * @since 5.0.0
     28         * @access public
     29         * @var int
     30         */
     31        public $id;
     32
     33        /**
     34         * The ID of the invited user.
     35         *
     36         * @since 5.0.0
     37         * @access public
     38         * @var int
     39         */
     40        public $user_id;
     41
     42        /**
     43         * The ID of the user who created the invitation.
     44         *
     45         * @since 5.0.0
     46         * @access public
     47         * @var int
     48         */
     49        public $inviter_id;
     50
     51        /**
     52         * The email address of the invited user.
     53         * Used when extending an invitation to someone who does not belong to the site.
     54         *
     55         * @since 5.0.0
     56         * @access public
     57         * @var string
     58         */
     59        public $invitee_email;
     60
     61        /**
     62         * The name of the related class.
     63         *
     64         * @since 5.0.0
     65         * @access public
     66         * @var string
     67         */
     68        public $class;
     69
     70        /**
     71         * The ID associated with the invitation and component.
     72         * Example: the group ID if a group invitation
     73         *
     74         * @since 5.0.0
     75         * @access public
     76         * @var int
     77         */
     78        public $item_id;
     79
     80        /**
     81         * The secondary ID associated with the invitation and component.
     82         * Example: a taxonomy term ID if invited to a site's category-specific RSS feed
     83         *
     84         * @since 5.0.0
     85         * @access public
     86         * @var int
     87         */
     88        public $secondary_item_id = null;
     89
     90
     91        /**
     92         * Invite or request.
     93         *
     94         * @since 5.0.0
     95         * @access public
     96         * @var string
     97         */
     98        public $type;
     99
     100        /**
     101         * Extra information provided by the requester or inviter.
     102         *
     103         * @since 5.0.0
     104         * @access public
     105         * @var string
     106         */
     107        public $content;
     108
     109        /**
     110         * The date the invitation was last modified.
     111         *
     112         * @since 5.0.0
     113         * @access public
     114         * @var string
     115         */
     116        public $date_modified;
     117
     118        /**
     119         * Has the invitation been sent, or is it a draft invite?
     120         *
     121         * @since 5.0.0
     122         * @access public
     123         * @var bool
     124         */
     125        public $invite_sent;
     126
     127        /**
     128         * Has the invitation been accepted by the invitee?
     129         *
     130         * @since 5.0.0
     131         * @access public
     132         * @var bool
     133         */
     134        public $accepted;
     135
     136
     137        /** Public Methods ****************************************************/
     138
     139        /**
     140         * Constructor method.
     141         *
     142         * @since 5.0.0
     143         *
     144         * @param int $id Optional. Provide an ID to access an existing
     145         *        invitation item.
     146         */
     147        public function __construct( $id = 0 ) {
     148                if ( ! empty( $id ) ) {
     149                        $this->id = (int) $id;
     150                        $this->populate();
     151                }
     152        }
     153
     154        /**
     155         * Update or insert invitation details into the database.
     156         *
     157         * @since 5.0.0
     158         *
     159         * @global wpdb $wpdb WordPress database object.
     160         *
     161         * @return bool True on success, false on failure.
     162         */
     163        public function save() {
     164
     165                // Return value
     166                $retval = false;
     167
     168                // Default data and format
     169                $data = array(
     170                        'user_id'           => $this->user_id,
     171                        'inviter_id'        => $this->inviter_id,
     172                        'invitee_email'     => $this->invitee_email,
     173                        'class'             => $this->class,
     174                        'item_id'           => $this->item_id,
     175                        'secondary_item_id' => $this->secondary_item_id,
     176                        'type'              => $this->type,
     177                        'content'           => $this->content,
     178                        'date_modified'     => $this->date_modified,
     179                        'invite_sent'       => $this->invite_sent,
     180                        'accepted'          => $this->accepted,
     181                );
     182                $data_format = array( '%d', '%d', '%s', '%s', '%d', '%d', '%s', '%s', '%s', '%d', '%d' );
     183
     184                /**
     185                 * Fires before an invitation is saved.
     186                 *
     187                 * @since 5.0.0
     188                 *
     189                 * @param BP_Invitation object $this Characteristics of the invitation to be saved.
     190                 */
     191                do_action_ref_array( 'bp_invitation_before_save', array( &$this ) );
     192
     193                // Update
     194                if ( ! empty( $this->id ) ) {
     195                        $result = self::_update( $data, array( 'ID' => $this->id ), $data_format, array( '%d' ) );
     196                // Insert
     197                } else {
     198                        $result = self::_insert( $data, $data_format );
     199                }
     200
     201                // Set the invitation ID if successful
     202                if ( ! empty( $result ) && ! is_wp_error( $result ) ) {
     203                        global $wpdb;
     204
     205                        $this->id = $wpdb->insert_id;
     206                        $retval   = $wpdb->insert_id;
     207                }
     208
     209                /**
     210                 * Fires after an invitation is saved.
     211                 *
     212                 * @since 5.0.0
     213                 *
     214                 * @param BP_Invitation object $this Characteristics of the invitation just saved.
     215                 */
     216                do_action_ref_array( 'bp_invitation_after_save', array( &$this ) );
     217
     218                // Return the result
     219                return $retval;
     220        }
     221
     222        /**
     223         * Fetch data for an existing invitation from the database.
     224         *
     225         * @since 5.0.0
     226         *
     227         * @global BuddyPress $bp The one true BuddyPress instance.
     228         * @global wpdb $wpdb WordPress database object.
     229         */
     230        public function populate() {
     231                global $wpdb;
     232                $invites_table_name = BP_Invitation_Manager::get_table_name();
     233
     234                // Check cache for invitation data.
     235                $invitation = wp_cache_get( $this->id, 'bp_invitations' );
     236
     237                // Cache missed, so query the DB.
     238                if ( false === $invitation ) {
     239                        $invitation = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$invites_table_name} WHERE id = %d", $this->id ) );
     240                        wp_cache_set( $this->id, $invitation,'bp_invitations' );
     241                }
     242
     243                // No invitation found so set the ID and bail.
     244                if ( empty( $invitation ) || is_wp_error( $invitation ) ) {
     245                        $this->id = 0;
     246                        return;
     247                }
     248
     249                $this->user_id           = (int) $invitation->user_id;
     250                $this->inviter_id        = (int) $invitation->inviter_id;
     251                $this->invitee_email     = $invitation->invitee_email;
     252                $this->class             = $invitation->class;
     253                $this->item_id           = (int) $invitation->item_id;
     254                $this->secondary_item_id = (int) $invitation->secondary_item_id;
     255                $this->type              = $invitation->type;
     256                $this->content           = $invitation->content;
     257                $this->date_modified     = $invitation->date_modified;
     258                $this->invite_sent       = (int) $invitation->invite_sent;
     259                $this->accepted          = (int) $invitation->accepted;
     260
     261        }
     262
     263        /** Protected Static Methods ******************************************/
     264
     265        /**
     266         * Create an invitation entry.
     267         *
     268         * @since 5.0.0
     269         *
     270         * @param array $data {
     271         *     Array of invitation data, passed to {@link wpdb::insert()}.
     272         *         @type int $user_id ID of the invited user.
     273         *         @type int $inviter_id ID of the user who created the invitation.
     274         *         @type string $invitee_email Email address of the invited user.
     275         *         @type string $class Name of the related class.
     276         *         @type int item_id ID associated with the invitation and component.
     277         *         @type int secondary_item_id secondary ID associated with the
     278         *                       invitation and component.
     279         *         @type string content Extra information provided by the requester
     280         *                       or inviter.
     281         *         @type string date_modified Date the invitation was last modified.
     282         *         @type int invite_sent Has the invitation been sent, or is it a
     283         *                       draft invite?
     284         * }
     285         * @param array $data_format See {@link wpdb::insert()}.
     286         * @return int|false The number of rows inserted, or false on error.
     287         */
     288        protected static function _insert( $data = array(), $data_format = array() ) {
     289                global $wpdb;
     290                return $wpdb->insert( BP_Invitation_Manager::get_table_name(), $data, $data_format );
     291        }
     292
     293        /**
     294         * Update invitations.
     295         *
     296         * @since 5.0.0
     297         *
     298         * @see wpdb::update() for further description of paramater formats.
     299         *
     300         * @param array $data Array of invitation data to update, passed to
     301         *        {@link wpdb::update()}. Accepts any property of a
     302         *        BP_Invitation object.
     303         * @param array $where The WHERE params as passed to wpdb::update().
     304         *        Typically consists of array( 'ID' => $id ) to specify the ID
     305         *        of the item being updated. See {@link wpdb::update()}.
     306         * @param array $data_format See {@link wpdb::insert()}.
     307         * @param array $where_format See {@link wpdb::insert()}.
     308         * @return int|false The number of rows updated, or false on error.
     309         */
     310        protected static function _update( $data = array(), $where = array(), $data_format = array(), $where_format = array() ) {
     311                global $wpdb;
     312                return $wpdb->update( BP_Invitation_Manager::get_table_name(), $data, $where, $data_format, $where_format );
     313        }
     314
     315        /**
     316         * Delete invitations.
     317         *
     318         * @since 5.0.0
     319         *
     320         * @see wpdb::update() for further description of paramater formats.
     321         *
     322         * @param array $where Array of WHERE clauses to filter by, passed to
     323         *        {@link wpdb::delete()}. Accepts any property of a
     324         *        BP_Invitation object.
     325         * @param array $where_format See {@link wpdb::insert()}.
     326         * @return int|false The number of rows updated, or false on error.
     327         */
     328        protected static function _delete( $where = array(), $where_format = array() ) {
     329                global $wpdb;
     330                return $wpdb->delete( BP_Invitation_Manager::get_table_name(), $where, $where_format );
     331        }
     332
     333        /**
     334         * Assemble the WHERE clause of a get() SQL statement.
     335         *
     336         * Used by BP_Invitation::get() to create its WHERE
     337         * clause.
     338         *
     339         * @since 5.0.0
     340         *
     341         * @param array $args See {@link BP_Invitation::get()}
     342         *        for more details.
     343         * @return string WHERE clause.
     344         */
     345        protected static function get_where_sql( $args = array() ) {
     346                global $wpdb;
     347
     348                $where_conditions = array();
     349                $where            = '';
     350
     351                // id
     352                if ( ! empty( $args['id'] ) ) {
     353                        $id_in = implode( ',', wp_parse_id_list( $args['id'] ) );
     354                        $where_conditions['id'] = "id IN ({$id_in})";
     355                }
     356
     357                // user_id
     358                if ( ! empty( $args['user_id'] ) ) {
     359                        $user_id_in = implode( ',', wp_parse_id_list( $args['user_id'] ) );
     360                        $where_conditions['user_id'] = "user_id IN ({$user_id_in})";
     361                }
     362
     363                // inviter_id. 0 can be meaningful, in the case of requests.
     364                if ( ! empty( $args['inviter_id'] ) || 0 === $args['inviter_id'] ) {
     365                        $inviter_id_in = implode( ',', wp_parse_id_list( $args['inviter_id'] ) );
     366                        $where_conditions['inviter_id'] = "inviter_id IN ({$inviter_id_in})";
     367                }
     368
     369                // invitee_email
     370                if ( ! empty( $args['invitee_email'] ) ) {
     371                        if ( ! is_array( $args['invitee_email'] ) ) {
     372                                $invitee_emails = explode( ',', $args['invitee_email'] );
     373                        } else {
     374                                $invitee_emails = $args['invitee_email'];
     375                        }
     376
     377                        $email_clean = array();
     378                        foreach ( $invitee_emails as $email ) {
     379                                $email_clean[] = $wpdb->prepare( '%s', $email );
     380                        }
     381
     382                        $invitee_email_in = implode( ',', $email_clean );
     383                        $where_conditions['invitee_email'] = "invitee_email IN ({$invitee_email_in})";
     384                }
     385
     386                // class
     387                if ( ! empty( $args['class'] ) ) {
     388                        if ( ! is_array( $args['class'] ) ) {
     389                                $class_names = explode( ',', $args['class'] );
     390                        } else {
     391                                $class_names = $args['class'];
     392                        }
     393
     394                        $cn_clean = array();
     395                        foreach ( $class_names as $cn ) {
     396                                $cn_clean[] = $wpdb->prepare( '%s', $cn );
     397                        }
     398
     399                        $cn_in = implode( ',', $cn_clean );
     400                        $where_conditions['class'] = "class IN ({$cn_in})";
     401                }
     402
     403                // item_id
     404                if ( ! empty( $args['item_id'] ) ) {
     405                        $item_id_in = implode( ',', wp_parse_id_list( $args['item_id'] ) );
     406                        $where_conditions['item_id'] = "item_id IN ({$item_id_in})";
     407                }
     408
     409                // secondary_item_id
     410                if ( ! empty( $args['secondary_item_id'] ) ) {
     411                        $secondary_item_id_in = implode( ',', wp_parse_id_list( $args['secondary_item_id'] ) );
     412                        $where_conditions['secondary_item_id'] = "secondary_item_id IN ({$secondary_item_id_in})";
     413                }
     414
     415                // type
     416                if ( ! empty( $args['type'] ) && 'all' !== $args['type'] ) {
     417                        if ( 'invite' == $args['type'] || 'request' == $args['type'] ) {
     418                                $type_clean = $wpdb->prepare( '%s', $args['type'] );
     419                                $where_conditions['type'] = "type = {$type_clean}";
     420                        }
     421                }
     422
     423                // invite_sent
     424                // Only create a where statement if something less than "all" has been
     425                // specifically requested.
     426                if ( ! empty( $args['invite_sent'] ) && 'all' !== $args['invite_sent'] ) {
     427                        if ( $args['invite_sent'] == 'draft' ) {
     428                                $where_conditions['invite_sent'] = "invite_sent = 0";
     429                        } else if ( $args['invite_sent'] == 'sent' ) {
     430                                $where_conditions['invite_sent'] = "invite_sent = 1";
     431                        }
     432                }
     433
     434                // accepted
     435                if ( ! empty( $args['accepted'] ) && 'all' !== $args['accepted'] ) {
     436                        if ( $args['accepted'] == 'pending' ) {
     437                                $where_conditions['accepted'] = "accepted = 0";
     438                        } else if ( $args['accepted'] == 'accepted' ) {
     439                                $where_conditions['accepted'] = "accepted = 1";
     440                        }
     441                }
     442
     443                // search_terms
     444                if ( ! empty( $args['search_terms'] ) ) {
     445                        $search_terms_like = '%' . bp_esc_like( $args['search_terms'] ) . '%';
     446                        $where_conditions['search_terms'] = $wpdb->prepare( "( class LIKE %s )", $search_terms_like, $search_terms_like );
     447                }
     448
     449                // Custom WHERE
     450                if ( ! empty( $where_conditions ) ) {
     451                        $where = 'WHERE ' . implode( ' AND ', $where_conditions );
     452                }
     453
     454                return $where;
     455        }
     456
     457        /**
     458         * Assemble the ORDER BY clause of a get() SQL statement.
     459         *
     460         * Used by BP_Invitation::get() to create its ORDER BY
     461         * clause.
     462         *
     463         * @since 5.0.0
     464         *
     465         * @param array $args See {@link BP_Invitation::get()}
     466         *        for more details.
     467         * @return string ORDER BY clause.
     468         */
     469        protected static function get_order_by_sql( $args = array() ) {
     470
     471                // Setup local variable
     472                $conditions = array();
     473                $retval     = '';
     474
     475                // Order by
     476                if ( ! empty( $args['order_by'] ) ) {
     477                        $order_by               = implode( ', ', (array) $args['order_by'] );
     478                        $conditions['order_by'] = "{$order_by}";
     479                }
     480
     481                // Sort order direction
     482                if ( ! empty( $args['sort_order'] ) ) {
     483                        $sort_order               = bp_esc_sql_order( $args['sort_order'] );
     484                        $conditions['sort_order'] = "{$sort_order}";
     485                }
     486
     487                // Custom ORDER BY
     488                if ( ! empty( $conditions ) ) {
     489                        $retval = 'ORDER BY ' . implode( ' ', $conditions );
     490                }
     491
     492                return $retval;
     493        }
     494
     495        /**
     496         * Assemble the LIMIT clause of a get() SQL statement.
     497         *
     498         * Used by BP_Invitation::get() to create its LIMIT clause.
     499         *
     500         * @since 5.0.0
     501         *
     502         * @param array $args See {@link BP_Invitation::get()}
     503         *        for more details.
     504         * @return string LIMIT clause.
     505         */
     506        protected static function get_paged_sql( $args = array() ) {
     507                global $wpdb;
     508
     509                // Setup local variable
     510                $retval = '';
     511
     512                // Custom LIMIT
     513                if ( ! empty( $args['page'] ) && ! empty( $args['per_page'] ) ) {
     514                        $page     = absint( $args['page']     );
     515                        $per_page = absint( $args['per_page'] );
     516                        $offset   = $per_page * ( $page - 1 );
     517                        $retval   = $wpdb->prepare( "LIMIT %d, %d", $offset, $per_page );
     518                }
     519
     520                return $retval;
     521        }
     522
     523        /**
     524         * Assemble query clauses, based on arguments, to pass to $wpdb methods.
     525         *
     526         * The insert(), update(), and delete() methods of {@link wpdb} expect
     527         * arguments of the following forms:
     528         *
     529         * - associative arrays whose key/value pairs are column => value, to
     530         *   be used in WHERE, SET, or VALUES clauses
     531         * - arrays of "formats", which tell $wpdb->prepare() which type of
     532         *   value to expect when sanitizing (eg, array( '%s', '%d' ))
     533         *
     534         * This utility method can be used to assemble both kinds of params,
     535         * out of a single set of associative array arguments, such as:
     536         *
     537         *     $args = array(
     538         *         'user_id' => 4,
     539         *         'class'   => 'BP_Groups_Invitation_Manager',
     540         *     );
     541         *
     542         * This will be converted to:
     543         *
     544         *     array(
     545         *         'data' => array(
     546         *             'user_id' => 4,
     547         *             'class'   => 'BP_Groups_Invitation_Manager',
     548         *         ),
     549         *         'format' => array(
     550         *             '%d',
     551         *             '%s',
     552         *         ),
     553         *     )
     554         *
     555         * which can easily be passed as arguments to the $wpdb methods.
     556         *
     557         * @since 5.0.0
     558         *
     559         * @param $args Associative array of filter arguments.
     560         *        See {@BP_Invitation::get()} for a breakdown.
     561         * @return array Associative array of 'data' and 'format' args.
     562         */
     563        protected static function get_query_clauses( $args = array() ) {
     564                $where_clauses = array(
     565                        'data'   => array(),
     566                        'format' => array(),
     567                );
     568
     569                // id
     570                if ( ! empty( $args['id'] ) ) {
     571                        $where_clauses['data']['id'] = absint( $args['id'] );
     572                        $where_clauses['format'][] = '%d';
     573                }
     574
     575                // user_id
     576                if ( ! empty( $args['user_id'] ) ) {
     577                        $where_clauses['data']['user_id'] = absint( $args['user_id'] );
     578                        $where_clauses['format'][] = '%d';
     579                }
     580
     581                // inviter_id
     582                if ( ! empty( $args['inviter_id'] ) ) {
     583                        $where_clauses['data']['inviter_id'] = absint( $args['inviter_id'] );
     584                        $where_clauses['format'][] = '%d';
     585                }
     586
     587                // invitee_email
     588                if ( ! empty( $args['invitee_email'] ) ) {
     589                        $where_clauses['data']['invitee_email'] = $args['invitee_email'];
     590                        $where_clauses['format'][] = '%s';
     591                }
     592
     593                // class
     594                if ( ! empty( $args['class'] ) ) {
     595                        $where_clauses['data']['class'] = $args['class'];
     596                        $where_clauses['format'][] = '%s';
     597                }
     598
     599                // item_id
     600                if ( ! empty( $args['item_id'] ) ) {
     601                        $where_clauses['data']['item_id'] = absint( $args['item_id'] );
     602                        $where_clauses['format'][] = '%d';
     603                }
     604
     605                // secondary_item_id
     606                if ( ! empty( $args['secondary_item_id'] ) ) {
     607                        $where_clauses['data']['secondary_item_id'] = absint( $args['secondary_item_id'] );
     608                        $where_clauses['format'][] = '%d';
     609                }
     610
     611                // type
     612                if ( ! empty( $args['type'] ) && 'all' !== $args['type'] ) {
     613                        if ( 'invite' == $args['type'] || 'request' == $args['type'] ) {
     614                                $where_clauses['data']['type'] = $args['type'];
     615                                $where_clauses['format'][] = '%s';
     616                        }
     617                }
     618
     619                // invite_sent
     620                // Only create a where statement if something less than "all" has been
     621                // specifically requested.
     622                if ( isset( $args['invite_sent'] ) && 'all' !== $args['invite_sent'] ) {
     623                        if ( $args['invite_sent'] == 'draft' ) {
     624                                $where_clauses['data']['invite_sent'] = 0;
     625                                $where_clauses['format'][] = '%d';
     626                        } else if ( $args['invite_sent'] == 'sent' ) {
     627                                $where_clauses['data']['invite_sent'] = 1;
     628                                $where_clauses['format'][] = '%d';
     629                        }
     630                }
     631
     632                // accepted
     633                if ( ! empty( $args['accepted'] ) && 'all' !== $args['accepted'] ) {
     634                        if ( $args['accepted'] == 'pending' ) {
     635                                $where_clauses['data']['accepted'] = 0;
     636                                $where_clauses['format'][] = '%d';
     637                        } else if ( $args['accepted'] == 'accepted' ) {
     638                                $where_clauses['data']['accepted'] = 1;
     639                                $where_clauses['format'][] = '%d';
     640                        }
     641                }
     642
     643                return $where_clauses;
     644        }
     645
     646        /** Public Static Methods *********************************************/
     647
     648        /**
     649         * Get invitations, based on provided filter parameters.
     650         *
     651         * @since 5.0.0
     652         *
     653         * @param array $args {
     654         *     Associative array of arguments. All arguments but $page and
     655         *     $per_page can be treated as filter values for get_where_sql()
     656         *     and get_query_clauses(). All items are optional.
     657         *     @type int|array    $id                ID of invitation being updated.
     658         *                                           Can be an array of IDs.
     659         *     @type int|array    $user_id           ID of user being queried. Can be an
     660         *                                           Can be an array of IDs.
     661         *     @type int|array    $inviter_id        ID of user who created the
     662         *                                           invitation. Can be an array of IDs.
     663         *     @type string|array $invitee_email     Email address of invited users
     664         *                                                       being queried. Can be an array of
     665         *                                           addresses.
     666         *     @type string|array $class             Name of the class to filter by.
     667         *                                           Can be an array of class names.
     668         *     @type int|array    $item_id           ID of associated item.
     669         *                                           Can be an array of multiple item IDs.
     670         *     @type int|array    $secondary_item_id ID of secondary associated item.
     671         *                                           Can be an array of multiple IDs.
     672         *     @type string|array $type              Type of item. An "invite" is sent
     673         *                                           from one user to another.
     674         *                                           A "request" is submitted by a
     675         *                                           user and no inviter is required.
     676         *                                           'all' returns all. Default: 'all'.
     677         *     @type string       $invite_sent       Limit to draft, sent or all
     678         *                                           'draft' limits to unsent invites,
     679         *                                           'sent' returns only sent invites,
     680         *                                           'all' returns all. Default: 'all'.
     681         *     @type bool         $accepted          Limit to accepted or
     682         *                                           not-yet-accepted invitations.
     683         *                                           'accepted' returns accepted invites,
     684         *                                           'pending' returns pending invites,
     685         *                                           'all' returns all. Default: 'pending'
     686         *     @type string       $search_terms      Term to match against class field.
     687         *     @type string       $order_by          Database column to order by.
     688         *     @type string       $sort_order        Either 'ASC' or 'DESC'.
     689         *     @type string       $order_by          Field to order results by.
     690         *     @type string       $sort_order        ASC or DESC.
     691         *     @type int          $page              Number of the current page of results.
     692         *                                           Default: false (no pagination,
     693         *                                           all items).
     694         *     @type int          $per_page          Number of items to show per page.
     695         *                                           Default: false (no pagination,
     696         *                                           all items).
     697         *     @type string       $fields            Which fields to return. Specify 'item_ids' to fetch a list of Item_IDs.
     698         *                                           Specify 'ids' to fetch a list of Invitation IDs.
     699         *                                           Default: 'all' (return BP_Invitation objects).
     700         * }
     701         *
     702         * @return array BP_Invitation objects | IDs of found invit.
     703         */
     704        public static function get( $args = array() ) {
     705                global $wpdb;
     706                $invites_table_name = BP_Invitation_Manager::get_table_name();
     707
     708                // Parse the arguments
     709                $r  = bp_parse_args( $args, array(
     710                        'id'                => false,
     711                        'user_id'           => false,
     712                        'inviter_id'        => false,
     713                        'invitee_email'     => false,
     714                        'class'             => false,
     715                        'item_id'           => false,
     716                        'secondary_item_id' => false,
     717                        'type'              => 'all',
     718                        'invite_sent'       => 'all',
     719                        'accepted'          => 'pending',
     720                        'search_terms'      => '',
     721                        'order_by'          => false,
     722                        'sort_order'        => false,
     723                        'page'              => false,
     724                        'per_page'          => false,
     725                        'fields'            => 'all',
     726                ), 'bp_invitations_invitation_get' );
     727
     728                $sql = array(
     729                        'select'     => "SELECT",
     730                        'fields'     => '',
     731                        'from'       => "FROM {$invites_table_name} i",
     732                        'where'      => '',
     733                        'orderby'    => '',
     734                        'pagination' => '',
     735                );
     736
     737                if ( 'item_ids' === $r['fields'] ) {
     738                        $sql['fields'] = "DISTINCT i.item_id";
     739                } else if ( 'user_ids' === $r['fields'] ) {
     740                        $sql['fields'] = "DISTINCT i.user_id";
     741                } else {
     742                        $sql['fields'] = 'DISTINCT i.id';
     743                }
     744
     745                // WHERE
     746                $sql['where'] = self::get_where_sql( array(
     747                        'id'                => $r['id'],
     748                        'user_id'           => $r['user_id'],
     749                        'inviter_id'            => $r['inviter_id'],
     750                        'invitee_email'     => $r['invitee_email'],
     751                        'class'             => $r['class'],
     752                        'item_id'           => $r['item_id'],
     753                        'secondary_item_id' => $r['secondary_item_id'],
     754                        'type'              => $r['type'],
     755                        'invite_sent'       => $r['invite_sent'],
     756                        'accepted'          => $r['accepted'],
     757                        'search_terms'      => $r['search_terms'],
     758                ) );
     759
     760                // ORDER BY
     761                $sql['orderby'] = self::get_order_by_sql( array(
     762                        'order_by'   => $r['order_by'],
     763                        'sort_order' => $r['sort_order']
     764                ) );
     765
     766                // LIMIT %d, %d
     767                $sql['pagination'] = self::get_paged_sql( array(
     768                        'page'     => $r['page'],
     769                        'per_page' => $r['per_page'],
     770                ) );
     771
     772                $paged_invites_sql = "{$sql['select']} {$sql['fields']} {$sql['from']} {$sql['where']} {$sql['orderby']} {$sql['pagination']}";
     773
     774                /**
     775                 * Filters the pagination SQL statement.
     776                 *
     777                 * @since 5.0.0
     778                 *
     779                 * @param string $value Concatenated SQL statement.
     780                 * @param array  $sql   Array of SQL parts before concatenation.
     781                 * @param array  $r     Array of parsed arguments for the get method.
     782                 */
     783                $paged_invites_sql = apply_filters( 'bp_invitations_get_paged_invitations_sql', $paged_invites_sql, $sql, $r );
     784
     785                $cached = bp_core_get_incremented_cache( $paged_invites_sql, 'bp_invitations' );
     786                if ( false === $cached ) {
     787                        $paged_invite_ids = $wpdb->get_col( $paged_invites_sql );
     788                        bp_core_set_incremented_cache( $paged_invites_sql, 'bp_invitations', $paged_invite_ids );
     789                } else {
     790                        $paged_invite_ids = $cached;
     791                }
     792
     793                // Special return format cases.
     794                if ( 'ids' === $r['fields'] || 'item_ids' === $r['fields'] || 'user_ids' === $r['fields'] ) {
     795                        // We only want the field that was found.
     796                        return array_map( 'intval', $paged_invite_ids );
     797                }
     798
     799                $uncached_ids = bp_get_non_cached_ids( $paged_invite_ids, 'bp_invitations' );
     800                if ( $uncached_ids ) {
     801                        $ids_sql = implode( ',', array_map( 'intval', $uncached_ids ) );
     802                        $data_objects = $wpdb->get_results( "SELECT i.* FROM {$invites_table_name} i WHERE i.id IN ({$ids_sql})" );
     803                        foreach ( $data_objects as $data_object ) {
     804                                wp_cache_set( $data_object->id, $data_object, 'bp_invitations' );
     805                        }
     806                }
     807
     808                $paged_invites = array();
     809                foreach ( $paged_invite_ids as $paged_invite_id ) {
     810                        $paged_invites[] = new BP_Invitation( $paged_invite_id );
     811                }
     812
     813                return $paged_invites;
     814        }
     815
     816        /**
     817         * Get a count of total invitations matching a set of arguments.
     818         *
     819         * @since 5.0.0
     820         *
     821         * @see BP_Invitation::get() for a description of
     822         *      arguments.
     823         *
     824         * @param array $args See {@link BP_Invitation::get()}.
     825         * @return int Count of located items.
     826         */
     827        public static function get_total_count( $args ) {
     828                global $wpdb;
     829                $invites_table_name = BP_Invitation_Manager::get_table_name();
     830
     831                // Build the query
     832                $select_sql = "SELECT COUNT(*)";
     833                $from_sql   = "FROM {$invites_table_name}";
     834                $where_sql  = self::get_where_sql( $args );
     835                $sql        = "{$select_sql} {$from_sql} {$where_sql}";
     836
     837                // Return the queried results
     838                return $wpdb->get_var( $sql );
     839        }
     840
     841        /**
     842         * Update invitations.
     843         *
     844         * @since 5.0.0
     845         *
     846         * @see BP_Invitation::get() for a description of
     847         *      accepted update/where arguments.
     848         *
     849         * @param array $update_args Associative array of fields to update,
     850         *        and the values to update them to. Of the format
     851         *            array( 'user_id' => 4, 'class' => 'BP_Groups_Invitation_Manager', )
     852         * @param array $where_args Associative array of columns/values, to
     853         *        determine which rows should be updated. Of the format
     854         *            array( 'item_id' => 7, 'class' => 'BP_Groups_Invitation_Manager', )
     855         * @return int|bool Number of rows updated on success, false on failure.
     856         */
     857        public static function update( $update_args = array(), $where_args = array() ) {
     858                $update = self::get_query_clauses( $update_args );
     859                $where  = self::get_query_clauses( $where_args  );
     860
     861                /**
     862                 * Fires before an invitation is updated.
     863                 *
     864                 * @since 5.0.0
     865                 *
     866                 * @param array $where_args  Array of fields to update.
     867                 * @param array $update_args Array of new values.
     868                 */
     869                do_action( 'bp_invitation_before_update', $where_args, $update_args );
     870
     871                $retval = self::_update( $update['data'], $where['data'], $update['format'], $where['format'] );
     872
     873                return $retval;
     874        }
     875
     876        /**
     877         * Delete invitations.
     878         *
     879         * @since 5.0.0
     880         *
     881         * @see BP_Invitation::get() for a description of
     882         *      accepted where arguments.
     883         *
     884         * @param array $args Associative array of columns/values, to determine
     885         *        which rows should be deleted.  Of the format
     886         *            array( 'item_id' => 7, 'class' => 'BP_Groups_Invitation_Manager', )
     887         * @return int|bool Number of rows deleted on success, false on failure.
     888         */
     889        public static function delete( $args = array() ) {
     890                $where = self::get_query_clauses( $args );
     891
     892                /**
     893                 * Fires before an invitation is deleted.
     894                 *
     895                 * @since 5.0.0
     896                 *
     897                 * @param array $args Characteristics of the invitations to be deleted.
     898                 */
     899                do_action( 'bp_invitation_before_delete', $args );
     900
     901                $retval = self::_delete( $where['data'], $where['format'] );
     902
     903                /**
     904                 * Fires after an invitation is deleted.
     905                 *
     906                 * @since 5.0.0
     907                 *
     908                 * @param array $args Characteristics of the invitations just deleted.
     909                 */
     910                do_action( 'bp_invitation_after_delete', $args );
     911
     912                return $retval;
     913        }
     914
     915        /** Convenience methods ***********************************************/
     916
     917        /**
     918         * Delete a single invitation by ID.
     919         *
     920         * @since 5.0.0
     921         *
     922         * @see BP_Invitation::delete() for explanation of
     923         *      return value.
     924         *
     925         * @param int $id ID of the invitation item to be deleted.
     926         * @return bool True on success, false on failure.
     927         */
     928        public static function delete_by_id( $id ) {
     929                return self::delete( array(
     930                        'id' => $id,
     931                ) );
     932        }
     933
     934        /** Sent status ***********************************************************/
     935
     936        /**
     937         * Mark specific invitations as sent by invitation ID.
     938         *
     939         * @since 5.0.0
     940         *
     941         * @param int $id The ID of the invitation to mark as sent.
     942         */
     943        public static function mark_sent( $id = 0 ) {
     944
     945                if ( ! $id ) {
     946                        return false;
     947                }
     948
     949                // Values to be updated
     950                $update_args = array(
     951                        'invite_sent' => 'sent',
     952                );
     953
     954                // WHERE clauses
     955                $where_args = array(
     956                        'id' => $id,
     957                );
     958
     959                return self::update( $update_args, $where_args );
     960        }
     961
     962        /**
     963         * Mark invitations as sent that are found by user_id, inviter_id, item id, and optional
     964         * secondary item id, and class name.
     965         *
     966         * @since 5.0.0
     967         *
     968         * @param array $args See BP_Invitation::update().
     969         */
     970        public static function mark_sent_by_data( $args ) {
     971
     972                // Values to be updated
     973                $update_args = array(
     974                        'invite_sent' => 'sent',
     975                );
     976
     977                return self::update( $update_args, $args );
     978        }
     979
     980        /** Accepted status ***********************************************************/
     981
     982        /**
     983         * Mark specific invitations as accepted by invitation ID.
     984         *
     985         * @since 5.0.0
     986         *
     987         * @param int $id The ID of the invitation to mark as sent.
     988         */
     989        public static function mark_accepted( $id = 0 ) {
     990
     991                if ( ! $id ) {
     992                        return false;
     993                }
     994
     995                // Values to be updated
     996                $update_args = array(
     997                        'accepted' => 'accepted',
     998                );
     999
     1000                // WHERE clauses
     1001                $where_args = array(
     1002                        'id' => $id,
     1003                );
     1004
     1005                return self::update( $update_args, $where_args );
     1006        }
     1007
     1008        /**
     1009         * Mark invitations as accepted that are found by user_id, inviter_id,
     1010         * item id, and optional secondary item id, and class name.
     1011         *
     1012         * @since 5.0.0
     1013         *
     1014         * @param array $args See BP_Invitation::update().
     1015         */
     1016        public static function mark_accepted_by_data( $args ) {
     1017
     1018                // Values to be updated
     1019                $update_args = array(
     1020                        'accepted' => 'accepted',
     1021                );
     1022
     1023                return self::update( $update_args, $args );
     1024        }
     1025
     1026}
  • src/bp-groups/actions/leave-group.php

    diff --git a/src/bp-groups/actions/leave-group.php b/src/bp-groups/actions/leave-group.php
    index 860e9fc1d..1a3913a59 100644
    a b function groups_action_leave_group() { 
    5858        /** This filter is documented in bp-groups/bp-groups-actions.php */
    5959        bp_core_load_template( apply_filters( 'groups_template_group_home', 'groups/single/home' ) );
    6060}
    61 add_action( 'bp_actions', 'groups_action_leave_group' );
    62  No newline at end of file
     61add_action( 'bp_actions', 'groups_action_leave_group' );
     62
     63/**
     64 * Clean up requests/invites when a member leaves a group.
     65 *
     66 * @since 5.0.0
     67 */
     68function groups_action_clean_up_invites_requests( $user_id, $group_id ) {
     69        $invites_class = new BP_Groups_Invitation_Manager();
     70        // Remove invitations/requests where the deleted user is the receiver.
     71        $invites_class->delete( array(
     72                'user_id' => $user_id,
     73                'item_id' => $group_id,
     74                'type'    => 'all'
     75        ) );
     76        // Remove invitations where the deleted user is the sender.
     77        $invites_class->delete( array(
     78                'inviter_id' => $user_id,
     79                'item_id'    => $group_id,
     80        ) );
     81}
     82add_action( 'bp_groups_member_after_delete', 'groups_action_clean_up_invites_requests', 10, 2 );
  • src/bp-groups/bp-groups-functions.php

    diff --git a/src/bp-groups/bp-groups-functions.php b/src/bp-groups/bp-groups-functions.php
    index 43240122a..e6ac64465 100644
    a b function bp_get_user_groups( $user_id, $args = array() ) { 
    949949
    950950        $user_id = intval( $user_id );
    951951
     952        // @TODO-6210: This is tied to the groups membership table. How to include invites/requests from a separate table?
    952953        $membership_ids = wp_cache_get( $user_id, 'bp_groups_memberships_for_user' );
    953954        if ( false === $membership_ids ) {
    954955                $membership_ids = BP_Groups_Member::get_membership_ids_for_user( $user_id );
    function groups_is_user_banned( $user_id, $group_id ) { 
    12091210 * Check whether a user has an outstanding invitation to a group.
    12101211 *
    12111212 * @since 2.6.0
     1213 * @since 5.0.0 Added $type parameter.
    12121214 *
    1213  * @param int $user_id ID of the user.
    1214  * @param int $group_id ID of the group.
     1215 * @param int    $user_id  ID of the user.
     1216 * @param int    $group_id ID of the group.
     1217 * @param string $type     If 'sent', results are limited to those invitations
     1218 *                         that have actually been sent (non-draft).
     1219 *                         Possible values: 'sent', 'draft', or 'all' Default: 'sent'.
    12151220 * @return int|bool ID of the membership if the user is invited, otherwise false.
    12161221 */
    1217 function groups_is_user_invited( $user_id, $group_id ) {
    1218         $is_invited = false;
    1219 
    1220         $user_groups = bp_get_user_groups( $user_id, array(
    1221                 'invite_sent' => true,
    1222                 'is_confirmed' => false,
    1223         ) );
    1224 
    1225         if ( isset( $user_groups[ $group_id ] ) ) {
    1226                 $is_invited = $user_groups[ $group_id ]->id;
    1227         }
    1228 
    1229         return $is_invited;
     1222function groups_is_user_invited( $user_id, $group_id, $type = 'sent' ) {
     1223        return groups_check_has_invite_from_user( $user_id, $group_id, false, $type );
    12301224}
    12311225
    12321226/**
    function groups_is_user_invited( $user_id, $group_id ) { 
    12391233 * @return int|bool ID of the membership if the user is pending, otherwise false.
    12401234 */
    12411235function groups_is_user_pending( $user_id, $group_id ) {
    1242         $is_pending = false;
    1243 
    1244         $user_groups = bp_get_user_groups( $user_id, array(
    1245                 'invite_sent' => false,
    1246                 'is_confirmed' => false,
    1247         ) );
    1248 
    1249         if ( isset( $user_groups[ $group_id ] ) ) {
    1250                 $is_pending = $user_groups[ $group_id ]->id;
     1236        if ( empty( $user_id ) || empty( $group_id ) ) {
     1237                return false;
    12511238        }
    12521239
    1253         return $is_pending;
     1240        $args = array(
     1241                'user_id'     => $user_id,
     1242                'item_id'     => $group_id,
     1243        );
     1244        $invites_class = new BP_Groups_Invitation_Manager();
     1245
     1246        return $invites_class->request_exists( $args );
    12541247}
    12551248
    12561249/**
    function groups_post_update( $args = '' ) { 
    13621355/** Group Invitations *********************************************************/
    13631356
    13641357/**
    1365  * Get IDs of users with outstanding invites to a given group from a specified user.
     1358 * Get group objects for groups that a user is currently invited to.
    13661359 *
    13671360 * @since 1.0.0
    13681361 *
    1369  * @param int               $user_id ID of the inviting user.
     1362 * @param int               $user_id ID of the invited user.
    13701363 * @param int|bool          $limit   Limit to restrict to.
    13711364 * @param int|bool          $page    Optional. Page offset of results to return.
    13721365 * @param string|array|bool $exclude Array of comma-separated list of group IDs
    13731366 *                                   to exclude from results.
    1374  * @return array $value IDs of users who have been invited to the group by the
    1375  *                      user but have not yet accepted.
     1367 * @return array {
     1368 *     @type array $groups Array of groups returned by paginated query.
     1369 *     @type int   $total  Count of groups matching query.
     1370 * }
    13761371 */
    13771372function groups_get_invites_for_user( $user_id = 0, $limit = false, $page = false, $exclude = false ) {
    1378 
    1379         if ( empty( $user_id ) )
     1373        if ( empty( $user_id ) ) {
    13801374                $user_id = bp_loggedin_user_id();
     1375        }
     1376
     1377        $group_ids = groups_get_invited_to_group_ids( $user_id );
     1378
     1379        // Remove excluded groups.
     1380        if ( $exclude ) {
     1381                $group_ids = array_diff( $group_ids, wp_parse_id_list( $exclude ) );
     1382        }
    13811383
    1382         return BP_Groups_Member::get_invites( $user_id, $limit, $page, $exclude );
     1384        // Avoid passing an empty array.
     1385        if ( ! $group_ids ) {
     1386                $group_ids = array( 0 );
     1387        }
     1388
     1389        // Get a filtered list of groups.
     1390        $args = array(
     1391                'include'     => $group_ids,
     1392                'show_hidden' => true,
     1393                'per_page'    => $limit,
     1394                'page'        => $page,
     1395        );
     1396        $groups = groups_get_groups( $args );
     1397
     1398        return array( 'groups' => $groups['groups'], 'total' => groups_get_invite_count_for_user( $user_id ) );
    13831399}
    13841400
    13851401/**
    function groups_get_invite_count_for_user( $user_id = 0 ) { 
    13951411                $user_id = bp_loggedin_user_id();
    13961412        }
    13971413
    1398         return BP_Groups_Member::get_invite_count_for_user( $user_id );
     1414        return count( groups_get_invited_to_group_ids( $user_id ) );
     1415}
     1416
     1417/**
     1418 * Get an array of group IDs to which a user is invited.
     1419 *
     1420 * @since 5.0.0
     1421 *
     1422 * @param int $user_id The user ID.
     1423 *
     1424 * @return array Array of group IDs.
     1425 */
     1426 function groups_get_invited_to_group_ids( $user_id = 0 ) {
     1427        if ( empty( $user_id ) ) {
     1428                $user_id = bp_loggedin_user_id();
     1429        }
     1430
     1431        $group_ids = groups_get_invites( array(
     1432                'user_id'     => $user_id,
     1433                'invite_sent' => 'sent',
     1434                'fields'      => 'item_ids'
     1435        ) );
     1436
     1437        return array_unique( $group_ids );
    13991438}
    14001439
    14011440/**
    function groups_get_invite_count_for_user( $user_id = 0 ) { 
    14111450 *                                 ID of the logged-in user.
    14121451 *     @type string $date_modified Optional. Modified date for the invitation.
    14131452 *                                 Default: current date/time.
    1414  *     @type bool   $is_confirmed  Optional. Whether the invitation should be
    1415  *                                 marked confirmed. Default: false.
     1453 *     @type string $content       Optional. Message to invitee.
     1454 *     @type bool   $send_invite   Optional. Whether the invitation should be
     1455 *                                 sent now. Default: false.
    14161456 * }
    14171457 * @return bool True on success, false on failure.
    14181458 */
    14191459function groups_invite_user( $args = '' ) {
    14201460
    1421         $args = bp_parse_args( $args, array(
     1461        $r = bp_parse_args( $args, array(
    14221462                'user_id'       => false,
    14231463                'group_id'      => false,
    14241464                'inviter_id'    => bp_loggedin_user_id(),
    14251465                'date_modified' => bp_core_current_time(),
    1426                 'is_confirmed'  => 0
     1466                'content'       => '',
     1467                'send_invite'   => 0
    14271468        ), 'groups_invite_user' );
    1428         extract( $args, EXTR_SKIP );
    14291469
    1430         if ( ! $user_id || ! $group_id || ! $inviter_id ) {
    1431                 return false;
    1432         }
    1433 
    1434         // If the user has already requested membership, accept the request.
    1435         if ( $membership_id = groups_check_for_membership_request( $user_id, $group_id ) ) {
    1436                 groups_accept_membership_request( $membership_id, $user_id, $group_id );
    1437 
    1438         // Otherwise, create a new invitation.
    1439         } elseif ( ! groups_is_user_member( $user_id, $group_id ) && ! groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
    1440                 $invite                = new BP_Groups_Member;
    1441                 $invite->group_id      = $group_id;
    1442                 $invite->user_id       = $user_id;
    1443                 $invite->date_modified = $date_modified;
    1444                 $invite->inviter_id    = $inviter_id;
    1445                 $invite->is_confirmed  = $is_confirmed;
     1470        $inv_args = array(
     1471                'user_id'       => $r['user_id'],
     1472                'item_id'       => $r['group_id'],
     1473                'inviter_id'    => $r['inviter_id'],
     1474                'date_modified' => $r['date_modified'],
     1475                'content'       => $r['content'],
     1476                'send_invite'   => $r['send_invite']
     1477        );
    14461478
    1447                 if ( !$invite->save() )
    1448                         return false;
     1479        // Create the unsent invitataion.
     1480        $invites_class = new BP_Groups_Invitation_Manager();
     1481        $created       = $invites_class->add_invitation( $inv_args );
    14491482
    1450                 /**
    1451                 * Fires after the creation of a new group invite.
    1452                 *
    1453                 * @since 1.0.0
    1454                 *
    1455                  * @param array $args Array of parsed arguments for the group invite.
    1456                  */
    1457                 do_action( 'groups_invite_user', $args );
    1458         }
     1483        /**
     1484        * Fires after the creation of a new group invite.
     1485        *
     1486        * @since 1.0.0
     1487        *
     1488         * @param array    $r      Array of parsed arguments for the group invite.
     1489         * @param int|bool $created The ID of the invitation or false if it couldn't be created.
     1490         */
     1491        do_action( 'groups_invite_user', $r, $created );
    14591492
    1460         return true;
     1493        return $created;
    14611494}
    14621495
    14631496/**
    function groups_invite_user( $args = '' ) { 
    14691502 *
    14701503 * @param int $user_id  ID of the user.
    14711504 * @param int $group_id ID of the group.
     1505 * @param int $inviter_id ID of the inviter.
    14721506 * @return bool True on success, false on failure.
    14731507 */
    1474 function groups_uninvite_user( $user_id, $group_id ) {
    1475 
    1476         if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id ) )
     1508function groups_uninvite_user( $user_id, $group_id, $inviter_id = false ) {
     1509        if ( empty( $user_id ) || empty( $group_id ) ) {
    14771510                return false;
     1511        }
    14781512
    1479         /**
    1480          * Fires after uninviting a user from a group.
    1481          *
    1482          * @since 1.0.0
    1483          *
    1484          * @param int $group_id ID of the group being uninvited from.
    1485          * @param int $user_id  ID of the user being uninvited.
    1486          */
    1487         do_action( 'groups_uninvite_user', $group_id, $user_id );
     1513        $invites_class = new BP_Groups_Invitation_Manager();
     1514        $success       = $invites_class->delete( array(
     1515                'user_id'    => $user_id,
     1516                'item_id'    => $group_id,
     1517                'inviter_id' => $inviter_id,
     1518        ) );
    14881519
    1489         return true;
     1520        if ( $success ) {
     1521                /**
     1522                 * Fires after uninviting a user from a group.
     1523                 *
     1524                 * @since 1.0.0
     1525                 * @since 2.7.0 Added $inviter_id parameter
     1526                 *
     1527                 * @param int $group_id    ID of the group being uninvited from.
     1528                 * @param int $user_id     ID of the user being uninvited.
     1529                 * @param int $inviter_id  ID of the inviter.
     1530                 */
     1531                do_action( 'groups_uninvite_user', $group_id, $user_id, $inviter_id );
     1532        }
     1533
     1534        return $success;
    14901535}
    14911536
    14921537/**
    function groups_uninvite_user( $user_id, $group_id ) { 
    15011546 * @return bool True when the user is a member of the group, otherwise false.
    15021547 */
    15031548function groups_accept_invite( $user_id, $group_id ) {
     1549        $invites_class = new BP_Groups_Invitation_Manager();
     1550        $args = array(
     1551                'user_id'     => $user_id,
     1552                'item_id'     => $group_id,
     1553                'invite_sent' => 'sent',
     1554        );
     1555        // Get an inviter_id from the invitation.
     1556        $invites = groups_get_invites( $args );
     1557        $inviter_id = 0;
     1558        if ( $invites ) {
     1559                $inviter_id = current( $invites )->inviter_id;
     1560        }
    15041561
    1505         // If the user is already a member (because BP at one point allowed two invitations to
    1506         // slip through), delete all existing invitations/requests and return true.
    1507         if ( groups_is_user_member( $user_id, $group_id ) ) {
    1508                 if ( groups_check_user_has_invite( $user_id, $group_id ) ) {
    1509                         groups_delete_invite( $user_id, $group_id );
    1510                 }
    1511 
    1512                 if ( groups_check_for_membership_request( $user_id, $group_id ) ) {
    1513                         groups_delete_membership_request( null, $user_id, $group_id );
    1514                 }
    1515 
    1516                 return true;
    1517         }
    1518 
    1519         $member = new BP_Groups_Member( $user_id, $group_id );
    1520 
    1521         // Save the inviter ID so that we can pass it to the action below.
    1522         $inviter_id = $member->inviter_id;
    1523 
    1524         $member->accept_invite();
    1525 
    1526         if ( !$member->save() ) {
    1527                 return false;
    1528         }
    1529 
    1530         // Remove request to join.
    1531         if ( $member->check_for_membership_request( $user_id, $group_id ) ) {
    1532                 $member->delete_request( $user_id, $group_id );
    1533         }
    1534 
    1535         // Modify group meta.
    1536         groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
     1562        $invites_class->accept_invitation( $args );
    15371563
    15381564        /**
    15391565         * Fires after a user has accepted a group invite.
    function groups_accept_invite( $user_id, $group_id ) { 
    15541580 * Reject a group invitation.
    15551581 *
    15561582 * @since 1.0.0
     1583 * @since 5.0.0 The $inviter_id arg was added.
     1584 *
     1585 * @param int $user_id    ID of the user.
     1586 * @param int $group_id   ID of the group.
     1587 * @param int $inviter_id ID of the inviter.
    15571588 *
    1558  * @param int $user_id  ID of the user.
    1559  * @param int $group_id ID of the group.
    15601589 * @return bool True on success, false on failure.
    15611590 */
    1562 function groups_reject_invite( $user_id, $group_id ) {
    1563         if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id ) )
     1591function groups_reject_invite( $user_id, $group_id, $inviter_id = false ) {
     1592        if ( empty( $user_id ) || empty( $group_id ) ) {
    15641593                return false;
     1594        }
     1595
     1596        $invites_class = new BP_Groups_Invitation_Manager();
     1597        $success       = $invites_class->delete( array(
     1598                'user_id'    => $user_id,
     1599                'item_id'    => $group_id,
     1600                'inviter_id' => $inviter_id,
     1601        ) );
    15651602
    15661603        /**
    15671604         * Fires after a user rejects a group invitation.
    15681605         *
    15691606         * @since 1.0.0
     1607         * @since 5.0.0 The $inviter_id arg was added.
    15701608         *
    15711609         * @param int $user_id  ID of the user rejecting the invite.
    15721610         * @param int $group_id ID of the group being rejected.
     1611         * @param int $inviter_id ID of the inviter.
    15731612         */
    1574         do_action( 'groups_reject_invite', $user_id, $group_id );
     1613        do_action( 'groups_reject_invite', $user_id, $group_id, $inviter_id );
    15751614
    1576         return true;
     1615        return $success;
    15771616}
    15781617
    15791618/**
    15801619 * Delete a group invitation.
    15811620 *
    15821621 * @since 1.0.0
     1622 * @since 5.0.0 The $inviter_id arg was added.
    15831623 *
    15841624 * @param int $user_id  ID of the invited user.
    15851625 * @param int $group_id ID of the group.
     1626 * @param int $inviter_id ID of the inviter.
     1627 *
    15861628 * @return bool True on success, false on failure.
    15871629 */
    1588 function groups_delete_invite( $user_id, $group_id ) {
    1589         if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id ) )
     1630function groups_delete_invite( $user_id, $group_id, $inviter_id = false ) {
     1631        if ( empty( $user_id ) || empty( $group_id ) ) {
    15901632                return false;
     1633        }
     1634
     1635        $invites_class = new BP_Groups_Invitation_Manager();
     1636        $success       = $invites_class->delete( array(
     1637                'user_id'    => $user_id,
     1638                'item_id'    => $group_id,
     1639                'inviter_id' => $inviter_id,
     1640        ) );
    15911641
    15921642        /**
    15931643         * Fires after the deletion of a group invitation.
    15941644         *
    15951645         * @since 1.9.0
     1646         * @since 5.0.0 The $inviter_id arg was added.
    15961647         *
    15971648         * @param int $user_id  ID of the user whose invitation is being deleted.
    15981649         * @param int $group_id ID of the group whose invitation is being deleted.
     1650         * @param int $inviter_id ID of the inviter.
    15991651         */
    1600         do_action( 'groups_delete_invite', $user_id, $group_id );
     1652        do_action( 'groups_delete_invite', $user_id, $group_id, $inviter_id );
    16011653
    16021654        return true;
    16031655}
    16041656
    16051657/**
    1606  * Send all pending invites by a single user to a specific group.
     1658 * Send some or all pending invites by a single user to a specific group.
    16071659 *
    16081660 * @since 1.0.0
     1661 * @since 5.0.0 Parameters changed to associative array.
    16091662 *
    1610  * @param int $user_id  ID of the inviting user.
    1611  * @param int $group_id ID of the group.
     1663 * @param array $args {
     1664 *     An array of optional arguments.
     1665 *     @type int    $user_id       ID of the invited user.
     1666 *     @type string $invitee_email Email address of the invited user, if not a member of the site.
     1667 *     @type string $group_id      ID of the group or an array of group IDs.
     1668 *     @type string $inviter_id    ID of the user extending the invitation.
     1669 *     @type bool   $force_resend  Whether to resend the email & notification if one has already been sent.
     1670 * }
    16121671 */
    1613 function groups_send_invites( $user_id, $group_id ) {
     1672function groups_send_invites( $args = array() ) {
     1673        // Backward compatibility with old method of passing arguments.
     1674        if ( ! is_array( $args ) || func_num_args() > 1 ) {
     1675                _deprecated_argument( __METHOD__, '5.0.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
    16141676
    1615         if ( empty( $user_id ) )
    1616                 $user_id = bp_loggedin_user_id();
     1677                $old_args_keys = array(
     1678                        0 => 'inviter_id',
     1679                        1 => 'group_id',
     1680                );
    16171681
    1618         // Send friend invites.
    1619         $invited_users = groups_get_invites_for_group( $user_id, $group_id );
    1620         $group = groups_get_group( $group_id );
     1682                $args = bp_core_parse_args_array( $old_args_keys, func_get_args() );
     1683        }
    16211684
    1622         for ( $i = 0, $count = count( $invited_users ); $i < $count; ++$i ) {
    1623                 $member = new BP_Groups_Member( $invited_users[$i], $group_id );
     1685        $r = bp_parse_args( $args, array(
     1686                'user_id'       => false,
     1687                'invitee_email' => '',
     1688                'group_id'      => 0,
     1689                'inviter_id'    => bp_loggedin_user_id(),
     1690                'force_resend'  => false,
     1691        ), 'groups_send_invitation' );
    16241692
    1625                 // Skip if we've already sent an invite to this user.
    1626                 if ( $member->invite_sent ) {
    1627                         continue;
    1628                 }
     1693        /*
     1694         * We will generally only want to fetch unsent invitations.
     1695         * If force_resend is true, then we need to fetch both sent and draft invites.
     1696         */
     1697        if ( $r['force_resend'] ) {
     1698                $args['invite_sent'] = 'all';
     1699        } else {
     1700                $args['invite_sent'] = 'draft';
     1701        }
    16291702
    1630                 // Send the actual invite.
    1631                 groups_notification_group_invites( $group, $member, $user_id );
     1703        $args = array(
     1704                'user_id'       => $r['user_id'],
     1705                'invitee_email' => $r['invitee_email'],
     1706                'item_id'       => $r['group_id'],
     1707                'inviter_id'    => $r['inviter_id'],
     1708        );
     1709        $invites = groups_get_invites( $args );
    16321710
    1633                 $member->invite_sent = 1;
    1634                 $member->save();
     1711        $invited_users = array();
     1712
     1713        $invites_class = new BP_Groups_Invitation_Manager();
     1714        foreach ( $invites as $invite ) {
     1715                $invited_users[] = $invite->user_id;
     1716                $invites_class->send_invitation_by_id( $invite->id );
    16351717        }
    16361718
    16371719        /**
    function groups_send_invites( $user_id, $group_id ) { 
    16441726         * @param array $invited_users Array of users being invited to the group.
    16451727         * @param int   $user_id       ID of the inviting user.
    16461728         */
    1647         do_action( 'groups_send_invites', $group_id, $invited_users, $user_id );
     1729        do_action( 'groups_send_invites', $r['group_id'], $invited_users, $r['inviter_id'] );
    16481730}
    16491731
    16501732/**
    1651  * Get IDs of users with outstanding invites to a given group from a specified user.
     1733 * Get IDs of users with outstanding invites to a given group.
    16521734 *
    16531735 * @since 1.0.0
    16541736 * @since 2.9.0 Added $sent as a parameter.
    function groups_get_invites_for_group( $user_id, $group_id, $sent = null ) { 
    16661748        return BP_Groups_Group::get_invites( $user_id, $group_id, $sent );
    16671749}
    16681750
     1751/**
     1752 * Get invitations to a given group filtered by arguments.
     1753 *
     1754 * @since 5.0.0
     1755 *
     1756 * @param int   $group_id ID of the group.
     1757 * @param array $args     Invitation arguments.
     1758 *                        See BP_Invitation::get() for list.
     1759 *
     1760 * @return array $invites     Matching BP_Invitation objects.
     1761 */
     1762function groups_get_invites( $args = array() ) {
     1763        $invites_class = new BP_Groups_Invitation_Manager();
     1764        return $invites_class->get_invitations( $args );
     1765}
     1766
    16691767/**
    16701768 * Check to see whether a user has already been invited to a group.
    16711769 *
    function groups_get_invites_for_group( $user_id, $group_id, $sent = null ) { 
    16791777 * @param int    $group_id ID of potential group.
    16801778 * @param string $type     Optional. Use 'sent' to check for sent invites,
    16811779 *                         'all' to check for all. Default: 'sent'.
    1682  * @return int|bool ID of the membership if found, otherwise false.
     1780 * @return int|bool ID of the first found membership if found, otherwise false.
    16831781 */
    16841782function groups_check_user_has_invite( $user_id, $group_id, $type = 'sent' ) {
    1685         $invite = false;
     1783        return groups_check_has_invite_from_user( $user_id, $group_id, false, $type );
     1784}
     1785
     1786/**
     1787 * Check to see whether a user has already been invited to a group by a particular user.
     1788 *
     1789 * By default, the function checks for invitations that have been sent.
     1790 * Entering 'all' as the $type parameter will return unsent invitations as
     1791 * well (useful to make sure AJAX requests are not duplicated).
     1792 *
     1793 * @since 5.0.0
     1794 *
     1795 * @param int    $user_id    ID of potential group member.
     1796 * @param int    $group_id   ID of potential group.
     1797 * @param string $inviter_id Optional. Use 'sent' to check for sent invites,
     1798 *                           'all' to check for all. Default: 'sent'.
     1799 * @param string $type       Optional. Specify a user ID to limit to only invited from that user.
     1800 *                           Default: 'false'.
     1801 * @return int|bool ID of the first found membership if found, otherwise false.
     1802 */
     1803 function groups_check_has_invite_from_user( $user_id, $group_id, $inviter_id = false, $type = 'sent' ) {
     1804        if ( empty( $user_id ) || empty( $group_id ) ) {
     1805                return false;
     1806        }
    16861807
    16871808        $args = array(
    1688                 'is_confirmed' => false,
    1689                 'is_banned'    => null,
    1690                 'is_admin'     => null,
    1691                 'is_mod'       => null,
     1809                'user_id'     => $user_id,
     1810                'item_id'     => $group_id,
     1811                'invite_sent' => 'sent',
    16921812        );
    1693 
    1694         if ( 'sent' === $type ) {
    1695                 $args['invite_sent'] = true;
     1813        if ( $inviter_id ) {
     1814                $args['inviter_id'] = $inviter_id;
    16961815        }
    1697 
    1698         $user_groups = bp_get_user_groups( $user_id, $args );
    1699 
    1700         if ( isset( $user_groups[ $group_id ] ) && 0 !== $user_groups[ $group_id ]->inviter_id ) {
    1701                 $invite = $user_groups[ $group_id ]->id;
     1816        if ( $type === 'draft' || $type === 'all' ) {
     1817                $args['invite_sent'] = $type;
    17021818        }
    17031819
    1704         return $invite;
     1820        $invites_class = new BP_Groups_Invitation_Manager();
     1821
     1822        return $invites_class->invitation_exists( $args );
    17051823}
    17061824
    17071825/**
    function groups_remove_member( $user_id, $group_id ) { 
    18781996 *
    18791997 * @since 1.0.0
    18801998 *
    1881  * @param int $requesting_user_id ID of the user requesting membership.
    1882  * @param int $group_id           ID of the group.
     1999 * @param array|string $args {
     2000 *     Array of arguments.
     2001 *     @type int    $user_id       ID of the user being invited.
     2002 *     @type int    $group_id      ID of the group to which the user is being invited.
     2003 *     @type string $content       Optional. Message to invitee.
     2004 *     @type string $date_modified Optional. Modified date for the invitation.
     2005 *                                 Default: current date/time.
     2006 * }
    18832007 * @return bool True on success, false on failure.
    18842008 */
    1885 function groups_send_membership_request( $requesting_user_id, $group_id ) {
    1886 
    1887         // Prevent duplicate requests.
    1888         if ( groups_check_for_membership_request( $requesting_user_id, $group_id ) )
    1889                 return false;
     2009function groups_send_membership_request( $args = array() ) {
     2010        // Backward compatibility with old method of passing arguments.
     2011        if ( ! is_array( $args ) || func_num_args() > 1 ) {
     2012                _deprecated_argument( __METHOD__, '5.0.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
    18902013
    1891         // Check if the user is already a member or is banned.
    1892         if ( groups_is_user_member( $requesting_user_id, $group_id ) || groups_is_user_banned( $requesting_user_id, $group_id ) )
    1893                 return false;
     2014                $old_args_keys = array(
     2015                        0 => 'user_id',
     2016                        1 => 'group_id',
     2017                );
    18942018
    1895         // Check if the user is already invited - if so, simply accept invite.
    1896         if ( groups_check_user_has_invite( $requesting_user_id, $group_id ) ) {
    1897                 groups_accept_invite( $requesting_user_id, $group_id );
    1898                 return true;
     2019                $args = bp_core_parse_args_array( $old_args_keys, func_get_args() );
    18992020        }
    19002021
    1901         $requesting_user                = new BP_Groups_Member;
    1902         $requesting_user->group_id      = $group_id;
    1903         $requesting_user->user_id       = $requesting_user_id;
    1904         $requesting_user->inviter_id    = 0;
    1905         $requesting_user->is_admin      = 0;
    1906         $requesting_user->user_title    = '';
    1907         $requesting_user->date_modified = bp_core_current_time();
    1908         $requesting_user->is_confirmed  = 0;
    1909         $requesting_user->comments      = isset( $_POST['group-request-membership-comments'] ) ? $_POST['group-request-membership-comments'] : '';
     2022        $r = bp_parse_args( $args, array(
     2023                'user_id'       => false,
     2024                'group_id'      => false,
     2025                'content'       => '',
     2026                'date_modified' => bp_core_current_time(),
     2027        ), 'groups_invite_user' );
    19102028
    1911         if ( $requesting_user->save() ) {
    1912                 $admins = groups_get_group_admins( $group_id );
     2029        $inv_args = array(
     2030                'user_id'       => $r['user_id'],
     2031                'item_id'       => $r['group_id'],
     2032                'content'       => $r['content'],
     2033                'date_modified' => $r['date_modified'],
     2034        );
     2035
     2036        $invites_class = new BP_Groups_Invitation_Manager();
     2037        $request_id = $invites_class->add_request( $inv_args );
    19132038
    1914                 // Saved okay, now send the email notification.
    1915                 for ( $i = 0, $count = count( $admins ); $i < $count; ++$i )
    1916                         groups_notification_new_membership_request( $requesting_user_id, $admins[$i]->user_id, $group_id, $requesting_user->id );
     2039        // If a new request was created, send the emails.
     2040        if ( $request_id && is_int( $request_id ) ) {
     2041                $invites_class->send_request_notification_by_id( $request_id );
     2042                $admins = groups_get_group_admins( $r['group_id'] );
    19172043
    19182044                /**
    19192045                 * Fires after the creation of a new membership request.
    function groups_send_membership_request( $requesting_user_id, $group_id ) { 
    19232049                 * @param int   $requesting_user_id  ID of the user requesting membership.
    19242050                 * @param array $admins              Array of group admins.
    19252051                 * @param int   $group_id            ID of the group being requested to.
    1926                  * @param int   $requesting_user->id ID of the membership.
     2052                 * @param int   $request_id          ID of the request.
    19272053                 */
    1928                 do_action( 'groups_membership_requested', $requesting_user_id, $admins, $group_id, $requesting_user->id );
     2054                do_action( 'groups_membership_requested', $r['user_id'], $admins, $r['group_id'], $request_id );
    19292055
    1930                 return true;
     2056                return $request_id;
    19312057        }
    19322058
    19332059        return false;
    function groups_send_membership_request( $requesting_user_id, $group_id ) { 
    19372063 * Accept a pending group membership request.
    19382064 *
    19392065 * @since 1.0.0
     2066 * @since 5.0.0 Deprecated $membership_id argument.
    19402067 *
    1941  * @param int $membership_id ID of the membership object.
    1942  * @param int $user_id       Optional. ID of the user who requested membership.
     2068 * @param int $membership_id Deprecated 5.0.0.
     2069 * @param int $user_id       Required. ID of the user who requested membership.
    19432070 *                           Provide this value along with $group_id to override
    19442071 *                           $membership_id.
    1945  * @param int $group_id      Optional. ID of the group to which membership is being
     2072 * @param int $group_id      Required. ID of the group to which membership is being
    19462073 *                           requested. Provide this value along with $user_id to
    19472074 *                           override $membership_id.
    19482075 * @return bool True on success, false on failure.
    19492076 */
    19502077function groups_accept_membership_request( $membership_id, $user_id = 0, $group_id = 0 ) {
    19512078
    1952         if ( !empty( $user_id ) && !empty( $group_id ) ) {
    1953                 $membership = new BP_Groups_Member( $user_id, $group_id );
    1954         } else {
    1955                 $membership = new BP_Groups_Member( false, false, $membership_id );
     2079        if ( ! empty( $membership_id ) ) {
     2080                _deprecated_argument( __METHOD__, '5.0.0', sprintf( __( 'Argument `membership_id` passed to %1$s  is deprecated. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
    19562081        }
    19572082
    1958         $membership->accept_request();
    1959 
    1960         if ( !$membership->save() ) {
     2083        if ( ! $user_id || ! $group_id ) {
    19612084                return false;
    19622085        }
    19632086
    1964         // Check if the user has an outstanding invite, if so delete it.
    1965         if ( groups_check_user_has_invite( $membership->user_id, $membership->group_id ) ) {
    1966                 groups_delete_invite( $membership->user_id, $membership->group_id );
    1967         }
     2087        $invites_class = new BP_Groups_Invitation_Manager();
     2088        $args = array(
     2089                'user_id' => $user_id,
     2090                'item_id' => $group_id,
     2091        );
     2092        $invites_class->accept_request( $args );
    19682093
    19692094        /**
    19702095         * Fires after a group membership request has been accepted.
    function groups_accept_membership_request( $membership_id, $user_id = 0, $group_ 
    19752100         * @param int  $group_id ID of the group that was accepted membership to.
    19762101         * @param bool $value    If membership was accepted.
    19772102         */
    1978         do_action( 'groups_membership_accepted', $membership->user_id, $membership->group_id, true );
     2103        do_action( 'groups_membership_accepted', $user_id, $group_id, true );
    19792104
    19802105        return true;
    19812106}
    function groups_accept_membership_request( $membership_id, $user_id = 0, $group_ 
    19852110 *
    19862111 * @since 1.0.0
    19872112 *
    1988  * @param int $membership_id ID of the membership object.
     2113 * @param int $membership_id Deprecated 5.0.0.
    19892114 * @param int $user_id       Optional. ID of the user who requested membership.
    19902115 *                           Provide this value along with $group_id to override
    19912116 *                           $membership_id.
    function groups_accept_membership_request( $membership_id, $user_id = 0, $group_ 
    19952120 * @return bool True on success, false on failure.
    19962121 */
    19972122function groups_reject_membership_request( $membership_id, $user_id = 0, $group_id = 0 ) {
    1998         if ( !$membership = groups_delete_membership_request( $membership_id, $user_id, $group_id ) ) {
     2123
     2124        if ( ! empty( $membership_id ) ){
     2125                _deprecated_argument( __METHOD__, '5.0.0', sprintf( __( 'Argument `membership_id` passed to %1$s  is deprecated. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
     2126        }
     2127
     2128        if ( ! groups_delete_membership_request( false, $user_id, $group_id ) ) {
    19992129                return false;
    20002130        }
    20012131
    function groups_reject_membership_request( $membership_id, $user_id = 0, $group_ 
    20082138         * @param int  $group_id ID of the group that was rejected membership to.
    20092139         * @param bool $value    If membership was accepted.
    20102140         */
    2011         do_action( 'groups_membership_rejected', $membership->user_id, $membership->group_id, false );
     2141        do_action( 'groups_membership_rejected', $user_id, $group_id, false );
    20122142
    20132143        return true;
    20142144}
    function groups_reject_membership_request( $membership_id, $user_id = 0, $group_ 
    20182148 *
    20192149 * @since 1.2.0
    20202150 *
    2021  * @param int $membership_id ID of the membership object.
     2151 * @param int $membership_id Deprecated 5.0.0.
    20222152 * @param int $user_id       Optional. ID of the user who requested membership.
    20232153 *                           Provide this value along with $group_id to override
    20242154 *                           $membership_id.
    function groups_reject_membership_request( $membership_id, $user_id = 0, $group_ 
    20282158 * @return false|BP_Groups_Member True on success, false on failure.
    20292159 */
    20302160function groups_delete_membership_request( $membership_id, $user_id = 0, $group_id = 0 ) {
    2031         if ( !empty( $user_id ) && !empty( $group_id ) )
    2032                 $membership = new BP_Groups_Member( $user_id, $group_id );
    2033         else
    2034                 $membership = new BP_Groups_Member( false, false, $membership_id );
     2161        if ( ! empty( $membership_id ) ){
     2162                _deprecated_argument( __METHOD__, '5.0.0', sprintf( __( 'Argument `membership_id` passed to %1$s  is deprecated. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
     2163        }
    20352164
    2036         if ( ! BP_Groups_Member::delete_request( $membership->user_id, $membership->group_id ) )
     2165        if ( empty( $user_id ) || empty( $group_id ) ) {
    20372166                return false;
     2167        }
     2168
     2169        $invites_class = new BP_Groups_Invitation_Manager();
     2170        $success       = $invites_class->delete_requests( array(
     2171                'user_id' => $user_id,
     2172                'item_id' => $group_id
     2173        ) );
    20382174
    2039         return $membership;
     2175        return $success;
     2176}
     2177
     2178/**
     2179 * Get group membership requests filtered by arguments.
     2180 *
     2181 * @since 5.0.0
     2182 *
     2183 * @param int   $group_id ID of the group.
     2184 * @param array $args     Invitation arguments.
     2185 *                        See BP_Invitation::get() for list.
     2186 *
     2187 * @return array $requests Matching BP_Invitation objects.
     2188 */
     2189function groups_get_requests( $args = array() ) {
     2190        $invites_class = new BP_Groups_Invitation_Manager();
     2191        return $invites_class->get_requests( $args );
    20402192}
    20412193
    20422194/**
    function groups_delete_membership_request( $membership_id, $user_id = 0, $group_ 
    20462198 *
    20472199 * @param int $user_id  ID of the user.
    20482200 * @param int $group_id ID of the group.
    2049  * @return int|bool ID of the membership if found, otherwise false.
     2201 * @return int|bool ID of the request if found, otherwise false.
    20502202 */
    20512203function groups_check_for_membership_request( $user_id, $group_id ) {
    2052         $request = false;
     2204        if ( empty( $user_id ) || empty( $group_id ) ) {
     2205                return false;
     2206        }
    20532207
    2054         $user_groups = bp_get_user_groups( $user_id, array(
    2055                 'is_confirmed' => false,
    2056                 'is_banned'    => false,
    2057                 'is_admin'     => null,
    2058                 'is_mod'       => null
     2208        $args = array(
     2209                'user_id' => $user_id,
     2210                'item_id' => $group_id,
     2211        );
     2212        $invites_class = new BP_Groups_Invitation_Manager();
     2213
     2214        return $invites_class->request_exists( $args );
     2215}
     2216
     2217 /**
     2218  * Get an array of group IDs to which a user has requested membership.
     2219  *
     2220  * @since 5.0.0
     2221  *
     2222  * @param int $user_id The user ID.
     2223  *
     2224  * @return array Array of group IDs.
     2225  */
     2226 function groups_get_membership_requested_group_ids( $user_id = 0 ) {
     2227        if ( ! $user_id ) {
     2228                $user_id = bp_loggedin_user_id();
     2229        }
     2230
     2231        $group_ids     = groups_get_requests( array(
     2232                'user_id' => $user_id,
     2233                'fields'  => 'item_ids'
    20592234        ) );
    20602235
    2061         if ( isset( $user_groups[ $group_id ] ) && 0 === $user_groups[ $group_id ]->inviter_id ) {
    2062                 $request = $user_groups[ $group_id ]->id;
    2063         }
     2236        return $group_ids;
     2237}
     2238
     2239 /**
     2240  * Get an array of group IDs to which a user has requested membership.
     2241  *
     2242  * @since 5.0.0
     2243  *
     2244  * @param int $user_id The user ID.
     2245  *
     2246  * @return array Array of group IDs.
     2247  */
     2248 function groups_get_membership_requested_user_ids( $group_id = 0 ) {
     2249        if ( ! $group_id ) {
     2250                $group_id = bp_get_current_group_id();
     2251        }
     2252
     2253        $requests      = groups_get_requests( array(
     2254                'item_id' => $group_id,
     2255                'fields'  => 'user_ids'
     2256        ) );
    20642257
    2065         return $request;
     2258        //@TODO-6210: What about those who make a request by email only (not yet site members)?
     2259        return $requests;
    20662260}
    20672261
    20682262/**
    function groups_check_for_membership_request( $user_id, $group_id ) { 
    20732267 * @param int $group_id ID of the group.
    20742268 * @return bool True on success, false on failure.
    20752269 */
    2076 function groups_accept_all_pending_membership_requests( $group_id ) {
    2077         $user_ids = BP_Groups_Member::get_all_membership_request_user_ids( $group_id );
     2270function groups_accept_all_pending_membership_requests( $group_id = 0 ) {
     2271        if ( ! $group_id ) {
     2272                $group_id = bp_get_current_group_id();
     2273        }
    20782274
    2079         if ( !$user_ids )
     2275        $user_ids = groups_get_membership_requested_user_ids( $group_id );
     2276
     2277        if ( ! $user_ids ) {
    20802278                return false;
     2279        }
    20812280
    2082         foreach ( (array) $user_ids as $user_id )
     2281        foreach ( (array) $user_ids as $user_id ) {
    20832282                groups_accept_membership_request( false, $user_id, $group_id );
     2283        }
    20842284
    20852285        /**
    20862286         * Fires after the acceptance of all pending membership requests to a group.
    function bp_groups_pending_requests_personal_data_exporter( $email_address, $pag 
    27562956                );
    27572957        }
    27582958
    2759         $requests = BP_Groups_Member::get_user_memberships( $user->ID, array(
    2760                 'type'     => 'pending_request',
     2959        $requests = groups_get_requests( array(
     2960                'user_id'  => $user->ID,
    27612961                'page'     => $page,
    27622962                'per_page' => $number,
    27632963        ) );
    27642964
    27652965        foreach ( $requests as $request ) {
    2766                 $group = groups_get_group( $request->group_id );
     2966                $group = groups_get_group( $request->item_id );
    27672967
    27682968                $item_data = array(
    27692969                        array(
    function bp_groups_pending_sent_invitations_personal_data_exporter( $email_addre 
    28223022                );
    28233023        }
    28243024
    2825         $invitations = BP_Groups_Member::get_user_memberships( $user->ID, array(
    2826                 'type'     => 'pending_sent_invitation',
    2827                 'page'     => $page,
    2828                 'per_page' => $number,
     3025        $invitations = groups_get_invites( array(
     3026                'inviter_id'  => $user->ID,
     3027                'page'        => $page,
     3028                'per_page'    => $number,
    28293029        ) );
    28303030
    28313031        foreach ( $invitations as $invitation ) {
    2832                 $group = groups_get_group( $invitation->group_id );
     3032                $group = groups_get_group( $invitation->item_id );
    28333033
    28343034                $item_data = array(
    28353035                        array(
    function bp_groups_pending_received_invitations_personal_data_exporter( $email_a 
    28923092                );
    28933093        }
    28943094
    2895         $invitations = BP_Groups_Member::get_user_memberships( $user->ID, array(
    2896                 'type'     => 'pending_received_invitation',
     3095        $invitations = groups_get_invites( array(
     3096                'user_id'  => $user->ID,
    28973097                'page'     => $page,
    28983098                'per_page' => $number,
    28993099        ) );
    29003100
    29013101        foreach ( $invitations as $invitation ) {
    2902                 $group = groups_get_group( $invitation->group_id );
     3102                $group = groups_get_group( $invitation->item_id );
    29033103
    29043104                $item_data = array(
    29053105                        array(
  • src/bp-groups/bp-groups-notifications.php

    diff --git a/src/bp-groups/bp-groups-notifications.php b/src/bp-groups/bp-groups-notifications.php
    index b94850fb5..481c70770 100644
    a b function groups_notification_new_membership_request( $requesting_user_id = 0, $a 
    143143                'notification_type' => 'groups-membership-request',
    144144        );
    145145
     146        $request_message = '';
     147        $requests = groups_get_requests( $args = array(
     148                'user_id'    => $requesting_user_id,
     149                'item_id'    => $group_id,
     150        ) );
     151        if ( $requests ) {
     152                $request_message = current( $requests )->content;
     153        }
     154
    146155        $group = groups_get_group( $group_id );
    147156        $args  = array(
    148157                'tokens' => array(
    function groups_notification_new_membership_request( $requesting_user_id = 0, $a 
    151160                        'group.name'           => $group->name,
    152161                        'group.id'             => $group_id,
    153162                        'group-requests.url'   => esc_url( bp_get_group_permalink( $group ) . 'admin/membership-requests' ),
    154                         'membership.id'        => $membership_id,
    155163                        'profile.url'          => esc_url( bp_core_get_user_domain( $requesting_user_id ) ),
    156164                        'requesting-user.id'   => $requesting_user_id,
    157165                        'requesting-user.name' => bp_core_get_user_displayname( $requesting_user_id ),
     166                        'request.message'      => $request_message,
    158167                        'unsubscribe'          => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    159168                ),
    160169        );
    add_action( 'groups_promoted_member', 'groups_notification_promoted_member', 10, 
    289298 *
    290299 * @since 1.0.0
    291300 *
    292  * @param BP_Groups_Group  $group           Group object.
    293  * @param BP_Groups_Member $member          Member object.
    294  * @param int              $inviter_user_id ID of the user who sent the invite.
     301 * @param BP_Groups_Group      $group           Group object.
     302 * @param BP_Groups_Member|int $member          Member object or invited_user_id.
     303 * @param int                  $inviter_user_id ID of the user who sent the invite.
    295304 */
    296305function groups_notification_group_invites( &$group, &$member, $inviter_user_id ) {
    297306
    298         // Bail if member has already been invited.
    299         if ( ! empty( $member->invite_sent ) ) {
    300                 return;
    301         }
    302 
    303307        // @todo $inviter_ud may be used for caching, test without it
    304308        $inviter_ud      = bp_core_get_core_userdata( $inviter_user_id );
    305         $invited_user_id = $member->user_id;
     309
     310        if ( $member instanceof BP_Groups_Member ) {
     311                $invited_user_id = $member->user_id;
     312        } else if ( is_int( $member ) ) {
     313                $invited_user_id = $member;
     314        }
    306315
    307316        // Trigger a BuddyPress Notification.
    308317        if ( bp_is_active( 'notifications' ) ) {
    function groups_notification_group_invites( &$group, &$member, $inviter_user_id 
    326335                'notification_type' => 'groups-invitation',
    327336        );
    328337
     338        $invite_message = '';
     339        $invitations = groups_get_invites( $args = array(
     340                'user_id'    => $invited_user_id,
     341                'item_id'    => $group->id,
     342                'inviter_id' => $inviter_user_id,
     343        ) );
     344        if ( $invitations ) {
     345                $invite_message = current( $invitations )->content;
     346        }
     347
    329348        $args         = array(
    330349                'tokens' => array(
    331                         'group'        => $group,
    332                         'group.url'    => bp_get_group_permalink( $group ),
    333                         'group.name'   => $group->name,
    334                         'inviter.name' => bp_core_get_userlink( $inviter_user_id, true, false, true ),
    335                         'inviter.url'  => bp_core_get_user_domain( $inviter_user_id ),
    336                         'inviter.id'   => $inviter_user_id,
    337                         'invites.url'  => esc_url( $invited_link . '/invites/' ),
    338                         'unsubscribe'  => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
     350                        'group'          => $group,
     351                        'group.url'      => bp_get_group_permalink( $group ),
     352                        'group.name'     => $group->name,
     353                        'inviter.name'   => bp_core_get_userlink( $inviter_user_id, true, false, true ),
     354                        'inviter.url'    => bp_core_get_user_domain( $inviter_user_id ),
     355                        'inviter.id'     => $inviter_user_id,
     356                        'invites.url'    => esc_url( $invited_link . '/invites/' ),
     357                        'invite.message' => $invite_message,
     358                        'unsubscribe'    => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    339359                ),
    340360        );
     361
    341362        bp_send_email( 'groups-invitation', (int) $invited_user_id, $args );
    342363}
    343364
  • src/bp-groups/bp-groups-template.php

    diff --git a/src/bp-groups/bp-groups-template.php b/src/bp-groups/bp-groups-template.php
    index c5c5a0465..e65da6621 100644
    a b function bp_group_request_reject_link() { 
    54305430        function bp_get_group_request_reject_link() {
    54315431                global $requests_template;
    54325432
     5433                $link = add_query_arg( array(
     5434                        '_wpnonce' => wp_create_nonce( 'groups_reject_membership_request' ),
     5435                        'user_id'  => $requests_template->request->user_id,
     5436                        'action'   => 'reject'
     5437                ), trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . 'admin/membership-requests/' );
     5438
    54335439                /**
    54345440                 * Filters the URL to use to reject a membership request.
    54355441                 *
    function bp_group_request_reject_link() { 
    54375443                 *
    54385444                 * @param string $value URL to use to reject a membership request.
    54395445                 */
    5440                 return apply_filters( 'bp_get_group_request_reject_link', wp_nonce_url( trailingslashit( bp_get_group_permalink( groups_get_current_group() ) . 'admin/membership-requests/reject/' . $requests_template->request->membership_id ), 'groups_reject_membership_request' ) );
     5446                return apply_filters( 'bp_get_group_request_reject_link', $link );
    54415447        }
    54425448
    54435449/**
    function bp_group_request_accept_link() { 
    54545460        function bp_get_group_request_accept_link() {
    54555461                global $requests_template;
    54565462
     5463                $link = add_query_arg( array(
     5464                        '_wpnonce' => wp_create_nonce( 'groups_accept_membership_request' ),
     5465                        'user_id'  => $requests_template->request->user_id,
     5466                        'action'   => 'accept'
     5467                ), trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . 'admin/membership-requests/' );
     5468
    54575469                /**
    54585470                 * Filters the URL to use to accept a membership request.
    54595471                 *
    function bp_group_request_accept_link() { 
    54615473                 *
    54625474                 * @param string $value URL to use to accept a membership request.
    54635475                 */
    5464                 return apply_filters( 'bp_get_group_request_accept_link', wp_nonce_url( trailingslashit( bp_get_group_permalink( groups_get_current_group() ) . 'admin/membership-requests/accept/' . $requests_template->request->membership_id ), 'groups_accept_membership_request' ) );
     5476                return apply_filters( 'bp_get_group_request_accept_link', $link );
    54655477        }
    54665478
    54675479/**
  • src/bp-groups/classes/class-bp-group-member-query.php

    diff --git a/src/bp-groups/classes/class-bp-group-member-query.php b/src/bp-groups/classes/class-bp-group-member-query.php
    index d872810e3..859075921 100644
    a b class BP_Group_Member_Query extends BP_User_Query { 
    231231                $sql['orderby'] = "ORDER BY date_modified";
    232232                $sql['order']   = 'first_joined' === $this->query_vars['type'] ? 'ASC' : 'DESC';
    233233
    234                 $this->group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']}" );
     234                $group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']}" );
     235
     236                $invited_member_ids = array();
     237
     238                // If appropriate, fetch invitations and add them to the results.
     239                if ( ! $is_confirmed || ! is_null( $this->query_vars['invite_sent'] ) || ! is_null( $this->query_vars['inviter_id'] ) ) {
     240                        $invite_args = array(
     241                                'item_id' => $this->query_vars['group_id'],
     242                                'fields'  => 'user_ids',
     243                                'type'    => 'all',
     244                        );
     245
     246                        if ( ! is_null( $this->query_vars['invite_sent'] ) ) {
     247                                $invite_args['invite_sent'] = ! empty( $this->query_vars['invite_sent'] ) ? 'sent' : 'draft';
     248                        }
     249
     250                        // If inviter_id.
     251                        if ( ! is_null( $this->query_vars['inviter_id'] ) ) {
     252                                $inviter_id = $this->query_vars['inviter_id'];
     253
     254                                // Empty: inviter_id = 0. (pass false, 0, or empty array).
     255                                if ( empty( $inviter_id ) ) {
     256                                        $invite_args['type'] = 'request';
     257
     258                                /*
     259                                * The string 'any' matches any non-zero value (inviter_id != 0).
     260                                * These are invitations, not requests.
     261                                */
     262                                } elseif ( 'any' === $inviter_id ) {
     263                                        $invite_args['type'] = 'invite';
     264
     265                                // Assume that a list of inviter IDs has been passed.
     266                                } else {
     267                                        $invite_args['type'] = 'invite';
     268                                        // Parse and sanitize.
     269                                        $inviter_ids = wp_parse_id_list( $inviter_id );
     270                                        if ( ! empty( $inviter_ids ) ) {
     271                                                $invite_args['inviter_id'] = $inviter_ids;
     272                                        }
     273                                }
     274                        }
     275
     276                        /*
     277                         * If first_joined is the "type" of query, sort the oldest
     278                         * requests and invitations to the top.
     279                         */
     280                        if ( 'first_joined' === $this->query_vars['type'] ) {
     281                                $invite_args['order_by']   = 'date_modified';
     282                                $invite_args['sort_order'] = 'ASC';
     283                        }
     284
     285                        $invited_member_ids = groups_get_invites( $invite_args );
     286                }
     287
     288                $this->group_member_ids = array_merge( $group_member_ids, $invited_member_ids );
    235289
    236290                /**
    237291                 * Filters the member IDs for the current group member query.
    class BP_Group_Member_Query extends BP_User_Query { 
    330384                        }
    331385                }
    332386
     387                // Add accurate invitation info from the invitations table.
     388                $invites = groups_get_invites( array(
     389                        'user_id' => $user_ids_sql,
     390                        'item_id' => $this->query_vars['group_id'],
     391                        'type'    => 'all',
     392                ) );
     393                foreach ( $invites as $invite ) {
     394                        if ( isset( $this->results[ $invite->user_id ] ) ) {
     395                                $this->results[ $invite->user_id ]->comments      = $invite->content;
     396                                $this->results[ $invite->user_id ]->is_confirmed  = 0;
     397                                $this->results[ $invite->user_id ]->invitation_id = $invite->id;
     398                                $this->results[ $invite->user_id ]->invite_sent   = (int) $invite->invite_sent;
     399                                $this->results[ $invite->user_id ]->inviter_id    = $invite->inviter_id;
     400
     401                                // Backfill properties that are not being set above.
     402                                if ( ! isset( $this->results[ $invite->user_id ]->user_id ) ) {
     403                                        $this->results[ $invite->user_id ]->user_id = $invite->user_id;
     404                                }
     405                                if ( ! isset( $this->results[ $invite->user_id ]->is_admin ) ) {
     406                                        $this->results[ $invite->user_id ]->is_admin = 0;
     407                                }
     408                                if ( ! isset( $this->results[ $invite->user_id ]->is_mod ) ) {
     409                                        $this->results[ $invite->user_id ]->is_mod = 0;
     410                                }
     411                                if ( ! isset( $this->results[ $invite->user_id ]->is_banned ) ) {
     412                                        $this->results[ $invite->user_id ]->is_banned = 0;
     413                                }
     414                                if ( ! isset( $this->results[ $invite->user_id ]->date_modified ) ) {
     415                                        $this->results[ $invite->user_id ]->date_modified = $invite->date_modified;
     416                                }
     417                                if ( ! isset( $this->results[ $invite->user_id ]->user_title ) ) {
     418                                        $this->results[ $invite->user_id ]->user_title = '';
     419                                }
     420                                if ( ! isset( $this->results[ $invite->user_id ]->membership_id ) ) {
     421                                        $this->results[ $invite->user_id ]->membership_id = 0;
     422                                }
     423                        }
     424                }
     425
    333426                // Don't filter other BP_User_Query objects on the same page.
    334427                remove_action( 'bp_user_query_populate_extras', array( $this, 'populate_group_member_extras' ), 10 );
    335428        }
  • src/bp-groups/classes/class-bp-groups-group.php

    diff --git a/src/bp-groups/classes/class-bp-groups-group.php b/src/bp-groups/classes/class-bp-groups-group.php
    index 5c40c011b..8469129a5 100644
    a b class BP_Groups_Group { 
    771771         *                  yet accepted.
    772772         */
    773773        public static function get_invites( $user_id, $group_id, $sent = null ) {
    774                 global $wpdb;
    775 
    776                 $bp  = buddypress();
    777                 $sql = $wpdb->prepare( "SELECT user_id FROM {$bp->groups->table_name_members} WHERE group_id = %d and is_confirmed = 0 AND inviter_id = %d", $group_id, $user_id );
    778 
    779                 // Query for a specific invite sent status.
    780                 if ( ! is_null( $sent ) ) {
    781                         $sql .= $wpdb->prepare( ' AND invite_sent = %d', $sent );
     774                if ( 0 === $sent ) {
     775                        $sent_arg = 'draft';
     776                } else if ( 1 === $sent ) {
     777                        $sent_arg = 'sent';
     778                } else {
     779                        $sent_arg = 'all';
    782780                }
    783781
    784                 return $wpdb->get_col( $sql );
     782                return groups_get_invites( array(
     783                        'item_id'     => $group_id,
     784                        'inviter_id'  => $user_id,
     785                        'invite_sent' => $sent_arg,
     786                        'fields'      => 'user_ids',
     787                ) );
    785788        }
    786789
    787790        /**
    class BP_Groups_Group { 
    959962         * }
    960963         */
    961964        public static function get_membership_requests( $group_id, $limit = null, $page = null ) {
    962                 global $wpdb;
    963 
    964                 if ( !empty( $limit ) && !empty( $page ) ) {
    965                         $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
     965                $args = array(
     966                        'item_id' => $group_id
     967                );
     968                if ( $limit ) {
     969                        $args['per_page'] = $limit;
    966970                }
     971                if ( $page ) {
     972                        $args['page'] = $page;
     973                }
    967974
    968                 $bp = buddypress();
    969 
    970                 $paged_requests = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->groups->table_name_members} WHERE group_id = %d AND is_confirmed = 0 AND inviter_id = 0{$pag_sql}", $group_id ) );
    971                 $total_requests = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$bp->groups->table_name_members} WHERE group_id = %d AND is_confirmed = 0 AND inviter_id = 0", $group_id ) );
     975                $requests = groups_get_requests( $args );
     976                $total    = count( groups_get_membership_requested_user_ids( $group_id ) );
    972977
    973                 return array( 'requests' => $paged_requests, 'total' => $total_requests );
     978                return array( 'requests' => $requests, 'total' => $total );
    974979        }
    975980
    976981        /**
    class BP_Groups_Group { 
    16351640         *                  failure.
    16361641         */
    16371642        public static function delete_all_invites( $group_id ) {
    1638                 global $wpdb;
     1643                if ( empty( $group_id ) ) {
     1644                        return false;
     1645                }
    16391646
    1640                 $bp = buddypress();
     1647                $invites_class = new BP_Groups_Invitation_Manager();
    16411648
    1642                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->groups->table_name_members} WHERE group_id = %d AND invite_sent = 1", $group_id ) );
     1649                return $invites_class->delete( array(
     1650                        'item_id' => $group_id,
     1651                ) );
    16431652        }
    16441653
    16451654        /**
  • new file src/bp-groups/classes/class-bp-groups-invitation-manager.php

    diff --git a/src/bp-groups/classes/class-bp-groups-invitation-manager.php b/src/bp-groups/classes/class-bp-groups-invitation-manager.php
    new file mode 100644
    index 000000000..84e528f18
    - +  
     1<?php
     2/**
     3 * Group invitations class.
     4 *
     5 * @package BuddyPress
     6 * @subpackage Core
     7 * @since 5.0.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * Group invitations class.
     15 *
     16 * An extension of the core Invitations class that adapts the
     17 * core logic to accommodate group invitation behavior.
     18 *
     19 * @since 5.0.0
     20 */
     21class BP_Groups_Invitation_Manager extends BP_Invitation_Manager {
     22        /**
     23         * Construct parameters.
     24         *
     25         * @since 3.1.0
     26         *
     27         * @param array|string $args {
     28
     29         * }
     30         */
     31        public function __construct( $args = '' ) {
     32                parent::__construct();
     33        }
     34
     35        /**
     36         * This is where custom actions are added to run when notifications of an
     37         * invitation or request need to be generated & sent.
     38         *
     39         * @since 2.7.0
     40         *
     41         * @param int $id The ID of the invitation to mark as sent.
     42         * @return bool True on success, false on failure.
     43         */
     44        public function run_send_action( BP_Invitation $invitation ) {
     45                // Notify group admins of the pending request
     46                if ( 'request' === $invitation->type ) {
     47                        $admins = groups_get_group_admins( $invitation->item_id );
     48
     49                        foreach ( $admins as $admin ) {
     50                                groups_notification_new_membership_request( $invitation->user_id, $admin->user_id, $invitation->item_id, $invitation->id );
     51                        }
     52                        return true;
     53
     54                // Notify the invitee of the invitation.
     55                } else {
     56                        $group = groups_get_group( $invitation->item_id );
     57                        groups_notification_group_invites( $group, $invitation->user_id, $invitation->inviter_id );
     58                        return true;
     59                }
     60        }
     61
     62        /**
     63         * This is where custom actions are added to run when an invitation
     64         * or request is accepted.
     65         *
     66         * @since 2.7.0
     67         *
     68         * @param int $id The ID of the invitation to mark as sent.
     69         * @return bool True on success, false on failure.
     70         */
     71        public function run_acceptance_action( $type = 'invite', $r  ) {
     72                // If the user is already a member (because BP at one point allowed two invitations to
     73                // slip through), return early.
     74                if ( groups_is_user_member( $r['user_id'], $r['item_id'] ) ) {
     75                        return true;
     76                }
     77
     78                // Create the new membership
     79                $member = new BP_Groups_Member( $r['user_id'], $r['item_id'] );
     80
     81                if ( 'request' === $type ) {
     82                        $member->accept_request();
     83                } else {
     84                        $member->accept_invite();
     85                }
     86
     87                if ( ! $member->save() ) {
     88                        return false;
     89                }
     90
     91                // Modify group meta.
     92                groups_update_groupmeta( $r['item_id'], 'last_activity', bp_core_current_time() );
     93
     94                return true;
     95        }
     96
     97        /**
     98         * With group invitations, we don't need to keep the old record, so we delete rather than
     99         * mark invitations as "accepted."
     100         *
     101         * @since 2.7.0
     102         *
     103         * @see BP_Invitation::mark_accepted_by_data()
     104         *      for a description of arguments.
     105         */
     106        public function mark_accepted( $args ) {
     107                // Delete all existing invitations/requests to this group for this user.
     108                $this->delete( array(
     109                        'user_id' => $args['user_id'],
     110                        'item_id' => $args['item_id'],
     111                        'type'    => 'all'
     112                ) );
     113        }
     114
     115        /**
     116         * Should this invitation be created?
     117         *
     118         * @since 5.0.0
     119         */
     120        public function allow_invitation( $args ) {
     121                // Does the inviter have this capability?
     122                if ( ! bp_user_can( $args['inviter_id'], 'groups_send_invitation', array( 'group_id' => $args['item_id'] ) ) ) {
     123                        return false;
     124                }
     125
     126                // Is the invited user eligible to receive an invitation?
     127                if ( ! bp_user_can( $args['user_id'], 'groups_receive_invitation', array( 'group_id' => $args['item_id'] ) ) ) {
     128                        return false;
     129                }
     130
     131                // Prevent duplicated invitations.
     132                if ( groups_check_has_invite_from_user( $args['user_id'], $args['item_id'], $args['inviter_id'], 'all' ) ) {
     133                        return false;
     134                }
     135
     136                return true;
     137        }
     138
     139        /**
     140         * Should this request be created?
     141         *
     142         * @since 5.0.0
     143         */
     144        public function allow_request( $args ) {
     145                // Does the requester have this capability? (Also checks for duplicates.)
     146                if ( ! bp_user_can( $args['user_id'], 'groups_request_membership', array( 'group_id' => $args['item_id'] ) ) ) {
     147                        return false;
     148                }
     149
     150                return true;
     151        }
     152}
  • src/bp-groups/classes/class-bp-groups-member.php

    diff --git a/src/bp-groups/classes/class-bp-groups-member.php b/src/bp-groups/classes/class-bp-groups-member.php
    index 66f833022..dc54b9466 100644
    a b class BP_Groups_Member { 
    767767        }
    768768
    769769        /**
    770          * Get a user's outstanding group invitations.
     770         * Get group objects for groups that a user is currently invited to.
    771771         *
    772772         * @since 1.6.0
    773773         *
    class BP_Groups_Member { 
    784784         * }
    785785         */
    786786        public static function get_invites( $user_id, $limit = false, $page = false, $exclude = false ) {
    787                 global $wpdb;
    788 
    789                 $pag_sql = ( !empty( $limit ) && !empty( $page ) ) ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ) : '';
    790 
    791                 if ( !empty( $exclude ) ) {
    792                         $exclude     = implode( ',', wp_parse_id_list( $exclude ) );
    793                         $exclude_sql = " AND g.id NOT IN ({$exclude})";
    794                 } else {
    795                         $exclude_sql = '';
    796                 }
    797 
    798                 $bp = buddypress();
    799 
    800                 $paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d {$exclude_sql} ORDER BY m.date_modified ASC {$pag_sql}", $user_id ) );
    801 
    802                 return array( 'groups' => $paged_groups, 'total' => self::get_invite_count_for_user( $user_id ) );
     787                return groups_get_invites_for_user( $user_id, $limit, $page, $exclude );
    803788        }
    804789
    805790        /**
    class BP_Groups_Member { 
    811796         * @return int
    812797         */
    813798        public static function get_invite_count_for_user( $user_id = 0 ) {
    814                 global $wpdb;
    815 
    816                 $bp = buddypress();
    817 
    818                 $count = wp_cache_get( $user_id, 'bp_group_invite_count' );
    819 
    820                 if ( false === $count ) {
    821                         $count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d", $user_id ) );
    822                         wp_cache_set( $user_id, $count, 'bp_group_invite_count' );
    823                 }
    824 
    825                 return $count;
     799                return groups_get_invite_count_for_user( $user_id );
    826800        }
    827801
    828802        /**
    class BP_Groups_Member { 
    859833                        'where'  => '',
    860834                        'limits' => '',
    861835                );
    862 
     836//@TODO 6210.
    863837                switch ( $r['type'] ) {
    864                         case 'pending_request' :
    865                                 $sql['where'] = $wpdb->prepare( "user_id = %d AND is_confirmed = 0 AND inviter_id = 0", $user_id );
    866                         break;
    867 
    868                         case 'pending_received_invitation' :
    869                                 $sql['where'] = $wpdb->prepare( "user_id = %d AND is_confirmed = 0 AND inviter_id != 0", $user_id );
    870                         break;
    871 
    872                         case 'pending_sent_invitation' :
    873                                 $sql['where'] = $wpdb->prepare( "inviter_id = %d AND is_confirmed = 0", $user_id );
    874                         break;
    875 
    876838                        case 'membership' :
    877839                        default :
    878840                                $sql['where'] = $wpdb->prepare( "user_id = %d AND is_confirmed = 1", $user_id );
    class BP_Groups_Member { 
    912874         * @return int|null The ID of the invitation if found; null if not found.
    913875         */
    914876        public static function check_has_invite( $user_id, $group_id, $type = 'sent' ) {
    915                 global $wpdb;
    916 
    917                 if ( empty( $user_id ) )
    918                         return false;
    919 
    920                 $bp  = buddypress();
    921                 $sql = "SELECT id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id != 0";
    922 
    923                 if ( 'sent' == $type )
    924                         $sql .= " AND invite_sent = 1";
    925 
    926                 $query = $wpdb->get_var( $wpdb->prepare( $sql, $user_id, $group_id ) );
    927 
    928                 return is_numeric( $query ) ? (int) $query : $query;
     877                return groups_is_user_invited( $user_id, $group_id, $type );
    929878        }
    930879
    931880        /**
    class BP_Groups_Member { 
    937886         *
    938887         * @param  int $user_id  ID of the user.
    939888         * @param  int $group_id ID of the group.
     889         * @param  int $inviter_id ID of the inviter. Specify if you want to delete
     890         *                         a specific invite. Leave false if you want to
     891         *                         delete all invites to this group.
    940892         * @return int Number of records deleted.
    941893         */
    942         public static function delete_invite( $user_id, $group_id ) {
    943                 global $wpdb;
    944 
    945                 if ( empty( $user_id ) ) {
    946                         return false;
    947                 }
    948 
     894        public static function delete_invite( $user_id, $group_id, $inviter_id = false ) {
    949895                /**
    950896                 * Fires before a group invitation is deleted.
    951897                 *
    952898                 * @since 2.6.0
     899                 * @since 5.0.0 Added $inviter_id
    953900                 *
    954901                 * @param int $user_id  ID of the user.
    955902                 * @param int $group_id ID of the group.
     903                 * @param  int $inviter_id ID of the inviter.
    956904                 */
    957                 do_action( 'bp_groups_member_before_delete_invite', $user_id, $group_id );
    958 
    959                 $table_name = buddypress()->groups->table_name_members;
    960 
    961                 $sql = "DELETE FROM {$table_name}
    962                                 WHERE user_id = %d
    963                                         AND group_id = %d
    964                                         AND is_confirmed = 0
    965                                         AND inviter_id != 0";
    966 
    967                 $prepared = $wpdb->prepare( $sql, $user_id, $group_id );
     905                do_action( 'bp_groups_member_before_delete_invite', $user_id, $group_id, $inviter_id );
    968906
    969                 return $wpdb->query( $prepared );
     907                return groups_delete_invite( $user_id, $group_id, $inviter_id );
    970908        }
    971909
    972910        /**
    class BP_Groups_Member { 
    979917         * @return int Number of records deleted.
    980918         */
    981919        public static function delete_request( $user_id, $group_id ) {
    982                 global $wpdb;
    983 
    984                 if ( empty( $user_id ) )
    985                         return false;
    986 
    987                 $bp = buddypress();
    988 
    989                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id = 0 AND invite_sent = 0", $user_id, $group_id ) );
     920                return groups_delete_membership_request( false, $user_id, $group_id );
    990921        }
    991922
    992923        /**
    class BP_Groups_Member { 
    11041035         * @return int Database ID of the membership if found; int 0 on failure.
    11051036         */
    11061037        public static function check_for_membership_request( $user_id, $group_id ) {
    1107                 global $wpdb;
    1108 
    1109                 if ( empty( $user_id ) )
    1110                         return false;
    1111 
    1112                 $bp = buddypress();
    1113 
    1114                 return $wpdb->query( $wpdb->prepare( "SELECT id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND is_banned = 0 AND inviter_id = 0", $user_id, $group_id ) );
     1038                return groups_is_user_pending( $user_id, $group_id );
    11151039        }
    11161040
    11171041        /**
    class BP_Groups_Member { 
    12921216         * @return array IDs of users with outstanding membership requests.
    12931217         */
    12941218        public static function get_all_membership_request_user_ids( $group_id ) {
    1295                 global $wpdb;
    1296 
    1297                 $bp = buddypress();
    1298 
    1299                 return array_map( 'intval', $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$bp->groups->table_name_members} WHERE group_id = %d AND is_confirmed = 0 AND inviter_id = 0", $group_id ) ) );
     1219                return groups_get_membership_requested_user_ids( $group_id );
    13001220        }
    13011221
    13021222        /**
  • src/bp-groups/screens/single/admin/membership-requests.php

    diff --git a/src/bp-groups/screens/single/admin/membership-requests.php b/src/bp-groups/screens/single/admin/membership-requests.php
    index ca12c2cc0..2b99f4f03 100644
    a b function groups_screen_group_admin_requests() { 
    2323                return false;
    2424        }
    2525
    26         $request_action = (string) bp_action_variable( 1 );
    27         $membership_id  = (int) bp_action_variable( 2 );
     26        $request_action = isset( $_GET['action'] ) ? $_GET['action'] : false;
     27        $user_id        = isset( $_GET['user_id'] ) ? (int) $_GET['user_id'] : false;
     28        $group_id       = bp_get_current_group_id();
    2829
    29         if ( !empty( $request_action ) && !empty( $membership_id ) ) {
    30                 if ( 'accept' == $request_action && is_numeric( $membership_id ) ) {
     30        if ( $request_action && $user_id && $group_id ) {
     31                if ( 'accept' === $request_action ) {
    3132
    3233                        // Check the nonce first.
    33                         if ( !check_admin_referer( 'groups_accept_membership_request' ) )
     34                        if ( ! check_admin_referer( 'groups_accept_membership_request' ) ) {
    3435                                return false;
     36                        }
    3537
    3638                        // Accept the membership request.
    37                         if ( !groups_accept_membership_request( $membership_id ) )
     39                        if ( ! groups_accept_membership_request( false, $user_id, $group_id ) ) {
    3840                                bp_core_add_message( __( 'There was an error accepting the membership request. Please try again.', 'buddypress' ), 'error' );
    39                         else
     41                        } else {
    4042                                bp_core_add_message( __( 'Group membership request accepted', 'buddypress' ) );
     43                        }
    4144
    42                 } elseif ( 'reject' == $request_action && is_numeric( $membership_id ) ) {
     45                } elseif ( 'reject' === $request_action ) {
    4346                        /* Check the nonce first. */
    44                         if ( !check_admin_referer( 'groups_reject_membership_request' ) )
     47                        if ( ! check_admin_referer( 'groups_reject_membership_request' ) ) {
    4548                                return false;
     49                        }
    4650
    4751                        // Reject the membership request.
    48                         if ( !groups_reject_membership_request( $membership_id ) )
     52                        if ( ! groups_reject_membership_request( false, $user_id, $group_id ) ) {
    4953                                bp_core_add_message( __( 'There was an error rejecting the membership request. Please try again.', 'buddypress' ), 'error' );
    50                         else
     54                        } else {
    5155                                bp_core_add_message( __( 'Group membership request rejected', 'buddypress' ) );
     56                        }
    5257                }
    5358
     59                // Was the member added to the group?
     60                $membership_id = groups_is_user_member( $user_id, $group_id );
     61
    5462                /**
    5563                 * Fires before the redirect if a group membership request has been handled.
    5664                 *
    function groups_screen_group_admin_requests() { 
    5866                 *
    5967                 * @param int    $id             ID of the group that was edited.
    6068                 * @param string $request_action Membership request action being performed.
    61                  * @param int    $membership_id  The key of the action_variables array that you want.
     69                 * @param int    $membership_id  The membership ID of the new user; false if rejected.
     70                 * @param int    $user_id        The ID of the requesting user.
     71                 * @param int    $group_id       The ID of the requested group.
    6272                 */
    63                 do_action( 'groups_group_request_managed', $bp->groups->current_group->id, $request_action, $membership_id );
     73                do_action( 'groups_group_request_managed', $bp->groups->current_group->id, $request_action, $membership_id, $user_id, $group_id );
    6474                bp_core_redirect( bp_get_group_permalink( groups_get_current_group() ) . 'admin/membership-requests/' );
    6575        }
    6676
    function groups_screen_group_admin_requests() { 
    8292         */
    8393        bp_core_load_template( apply_filters( 'groups_template_group_admin_requests', 'groups/single/home' ) );
    8494}
    85 add_action( 'bp_screens', 'groups_screen_group_admin_requests' );
    86  No newline at end of file
     95add_action( 'bp_screens', 'groups_screen_group_admin_requests' );
  • src/class-buddypress.php

    diff --git a/src/class-buddypress.php b/src/class-buddypress.php
    index 21bfd2224..b22f64fd9 100644
    a b class BuddyPress { 
    487487                require( $this->plugin_dir . 'bp-core/bp-core-moderation.php'       );
    488488                require( $this->plugin_dir . 'bp-core/bp-core-loader.php'           );
    489489                require( $this->plugin_dir . 'bp-core/bp-core-customizer-email.php' );
     490                require( $this->plugin_dir . 'bp-core/bp-core-invitations-cache.php' );
    490491
    491492                // Maybe load deprecated functionality (this double negative is proof positive!)
    492493                if ( ! bp_get_option( '_bp_ignore_deprecated_code', ! $this->load_deprecated ) ) {
    class BuddyPress { 
    568569                        'BP_Walker_Category_Checklist' => 'core',
    569570                        'BP_Walker_Nav_Menu_Checklist' => 'core',
    570571                        'BP_Walker_Nav_Menu'           => 'core',
     572                        'BP_Invitation_Manager'        => 'core',
     573                        'BP_Invitation'                => 'core',
    571574
    572575                        'BP_Core_Friends_Widget' => 'friends',
    573576
  • new file tests/phpunit/assets/invitations-extensions.php

    diff --git a/tests/phpunit/assets/invitations-extensions.php b/tests/phpunit/assets/invitations-extensions.php
    new file mode 100644
    index 000000000..4815cc7ce
    - +  
     1<?php
     2/**
     3 * The following implementations of BP_Attachment act as dummy plugins
     4 * for our unit tests
     5 */
     6class BPTest_Invitation_Manager_Extension extends BP_Invitation_Manager {
     7        public function __construct( $args = array() ) {
     8                parent::__construct( $args );
     9        }
     10
     11        public function run_send_action( BP_Invitation $invitation ) {
     12                return true;
     13        }
     14
     15        public function run_acceptance_action( $type = 'invite', $r  ) {
     16                return true;
     17        }
     18}
  • new file tests/phpunit/testcases/core/invitations.php

    diff --git a/tests/phpunit/testcases/core/invitations.php b/tests/phpunit/testcases/core/invitations.php
    new file mode 100644
    index 000000000..ba20d63c4
    - +  
     1<?php
     2
     3include_once BP_TESTS_DIR . 'assets/invitations-extensions.php';
     4
     5/**
     6 * @group core
     7 * @group invitations
     8 */
     9 class BP_Tests_Invitations extends BP_UnitTestCase {
     10                public function test_bp_invitations_add_invitation_vanilla() {
     11                $old_current_user = get_current_user_id();
     12
     13                $u1 = $this->factory->user->create();
     14                $u2 = $this->factory->user->create();
     15                $u3 = $this->factory->user->create();
     16                $this->set_current_user( $u1 );
     17
     18                $invites_class = new BPTest_Invitation_Manager_Extension();
     19
     20                // Create a couple of invitations.
     21                $invite_args = array(
     22                        'user_id'           => $u3,
     23                        'inviter_id'            => $u1,
     24                        'item_id'           => 1,
     25                        'send_invite'       => 'sent',
     26                );
     27                $i1 = $invites_class->add_invitation( $invite_args );
     28                $invite_args['inviter_id'] = $u2;
     29                $i2 = $invites_class->add_invitation( $invite_args );
     30
     31                $get_invites = array(
     32                        'user_id'        => $u3,
     33                        'fields'         => 'ids',
     34                );
     35                $invites = $invites_class->get_invitations( $get_invites );
     36                $this->assertEqualSets( array( $i1, $i2 ), $invites );
     37
     38                $this->set_current_user( $old_current_user );
     39        }
     40
     41        public function test_bp_invitations_add_invitation_avoid_duplicates() {
     42                $old_current_user = get_current_user_id();
     43
     44                $u1 = $this->factory->user->create();
     45                $u2 = $this->factory->user->create();
     46                $this->set_current_user( $u1 );
     47
     48                $invites_class = new BPTest_Invitation_Manager_Extension();
     49
     50                // Create an invitation.
     51                $invite_args = array(
     52                        'user_id'           => $u2,
     53                        'inviter_id'            => $u1,
     54                        'item_id'           => 1,
     55                        'send_invite'       => 'sent',
     56                );
     57                $i1 = $invites_class->add_invitation( $invite_args );
     58                // Attempt to create a duplicate.
     59                $this->assertFalse( $invites_class->add_invitation( $invite_args ) );
     60
     61                $this->set_current_user( $old_current_user );
     62        }
     63
     64        public function test_bp_invitations_add_invitation_invite_plus_request_should_accept() {
     65                $old_current_user = get_current_user_id();
     66
     67                $u1 = $this->factory->user->create();
     68                $u2 = $this->factory->user->create();
     69                $u3 = $this->factory->user->create();
     70                $this->set_current_user( $u1 );
     71
     72                $invites_class = new BPTest_Invitation_Manager_Extension();
     73
     74                // Create an invitation.
     75                $invite_args = array(
     76                        'user_id'           => $u3,
     77                        'inviter_id'            => $u1,
     78                        'item_id'           => 1,
     79                        'send_invite'       => 'sent',
     80                );
     81                $i1 = $invites_class->add_invitation( $invite_args );
     82
     83                // Create a request.
     84                $request_args = array(
     85                        'user_id'           => $u3,
     86                        'item_id'           => 1,
     87                );
     88                $r1 = $invites_class->add_request( $request_args );
     89
     90                $get_invites = array(
     91                        'user_id'          => $u3,
     92                        'accepted'         => 'accepted'
     93                );
     94                $invites = $invites_class->get_invitations( $get_invites );
     95                $this->assertEqualSets( array( $i1 ), wp_list_pluck( $invites, 'id' ) );
     96
     97                $this->set_current_user( $old_current_user );
     98        }
     99
     100        public function test_bp_invitations_add_invitation_unsent_invite_plus_request_should_not_accept() {
     101                $old_current_user = get_current_user_id();
     102
     103                $u1 = $this->factory->user->create();
     104                $u2 = $this->factory->user->create();
     105                $u3 = $this->factory->user->create();
     106                $this->set_current_user( $u1 );
     107
     108                $invites_class = new BPTest_Invitation_Manager_Extension();
     109
     110                // Create an invitation.
     111                $invite_args = array(
     112                        'user_id'           => $u3,
     113                        'inviter_id'            => $u1,
     114                        'item_id'           => 1,
     115                        'send_invite'       => 0,
     116                );
     117                $i1 = $invites_class->add_invitation( $invite_args );
     118
     119                // Create a request.
     120                $request_args = array(
     121                        'user_id'           => $u3,
     122                        'item_id'           => 1,
     123                );
     124                $r1 = $invites_class->add_request( $request_args );
     125
     126                $get_invites = array(
     127                        'user_id'          => $u3,
     128                        'accepted'         => 'accepted'
     129                );
     130                $invites = $invites_class->get_invitations( $get_invites );
     131                $this->assertEqualSets( array(), wp_list_pluck( $invites, 'id' ) );
     132
     133                $this->set_current_user( $old_current_user );
     134        }
     135
     136        public function test_bp_invitations_add_invitation_unsent_invite_plus_request_then_send_invite_should_accept() {
     137                $old_current_user = get_current_user_id();
     138
     139                $u1 = $this->factory->user->create();
     140                $u2 = $this->factory->user->create();
     141                $u3 = $this->factory->user->create();
     142                $this->set_current_user( $u1 );
     143
     144                $invites_class = new BPTest_Invitation_Manager_Extension();
     145
     146                // Create an invitation.
     147                $invite_args = array(
     148                        'user_id'           => $u3,
     149                        'inviter_id'            => $u1,
     150                        'item_id'           => 1,
     151                        'send_invite'       => 0,
     152                );
     153                $i1 = $invites_class->add_invitation( $invite_args );
     154
     155                // Create a request.
     156                $request_args = array(
     157                        'user_id'           => $u3,
     158                        'item_id'           => 1,
     159                );
     160                $r1 = $invites_class->add_request( $request_args );
     161
     162                $invites_class->send_invitation_by_id( $i1 );
     163
     164                // Check that both the request and invitation are marked 'accepted'.
     165                $get_invites = array(
     166                        'user_id'          => $u3,
     167                        'type'             => 'all',
     168                        'accepted'         => 'accepted',
     169                        'fields'           => 'ids'
     170                );
     171                $invites = $invites_class->get_invitations( $get_invites );
     172                $this->assertEqualSets( array( $i1, $r1 ), $invites );
     173
     174                $this->set_current_user( $old_current_user );
     175        }
     176
     177        public function test_bp_invitations_add_request_vanilla() {
     178                $old_current_user = get_current_user_id();
     179
     180                $u1 = $this->factory->user->create();
     181                $this->set_current_user( $u1 );
     182
     183                $invites_class = new BPTest_Invitation_Manager_Extension();
     184
     185                // Create a couple of requests.
     186                $request_args = array(
     187                        'user_id'           => $u1,
     188                        'item_id'           => 7,
     189                );
     190                $r1 = $invites_class->add_request( $request_args );
     191                $request_args['item_id'] = 4;
     192                $r2 = $invites_class->add_request( $request_args );
     193
     194                $get_requests = array(
     195                        'user_id'           => $u1,
     196                        'fields'            => 'ids'
     197                );
     198                $requests = $invites_class->get_requests( $get_requests );
     199                $this->assertEqualSets( array( $r1, $r2 ), $requests );
     200
     201                $this->set_current_user( $old_current_user );
     202        }
     203
     204        public function test_bp_invitations_add_request_avoid_duplicates() {
     205                $old_current_user = get_current_user_id();
     206
     207                $invites_class = new BPTest_Invitation_Manager_Extension();
     208
     209                $u1 = $this->factory->user->create();
     210                $this->set_current_user( $u1 );
     211
     212                // Create a couple of requests.
     213                $request_args = array(
     214                        'user_id'           => $u1,
     215                        'item_id'           => 7,
     216                );
     217                $r1 = $invites_class->add_request( $request_args );
     218                // Attempt to create a duplicate.
     219                $this->assertFalse( $invites_class->add_request( $request_args ) );
     220
     221                $this->set_current_user( $old_current_user );
     222        }
     223
     224        public function test_bp_invitations_add_request_request_plus_sent_invite_should_accept() {
     225                $old_current_user = get_current_user_id();
     226
     227                $u1 = $this->factory->user->create();
     228                $u2 = $this->factory->user->create();
     229                $this->set_current_user( $u1 );
     230
     231                $invites_class = new BPTest_Invitation_Manager_Extension();
     232
     233                // Create a request.
     234                $request_args = array(
     235                        'user_id'           => $u2,
     236                        'item_id'           => 1,
     237                );
     238                $r1 = $invites_class->add_request( $request_args );
     239
     240                // Create an invitation.
     241                $invite_args = array(
     242                        'user_id'           => $u2,
     243                        'inviter_id'            => $u1,
     244                        'item_id'           => 1,
     245                        'send_invite'       => 1,
     246                );
     247                $i1 = $invites_class->add_invitation( $invite_args );
     248
     249                // Check that both the request and invitation are marked 'accepted'.
     250                $get_invites = array(
     251                        'user_id'          => $u2,
     252                        'type'             => 'all',
     253                        'accepted'         => 'accepted',
     254                        'fields'           => 'ids'
     255                );
     256                $invites = $invites_class->get_invitations( $get_invites );
     257                $this->assertEqualSets( array( $r1, $i1 ), $invites );
     258
     259                $this->set_current_user( $old_current_user );
     260        }
     261
     262}
  • tests/phpunit/testcases/groups/class-bp-groups-group.php

    diff --git a/tests/phpunit/testcases/groups/class-bp-groups-group.php b/tests/phpunit/testcases/groups/class-bp-groups-group.php
    index a76d4e72c..f03a4c801 100644
    a b class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase { 
    13721372         */
    13731373        public function test_get_group_extras_invited() {
    13741374                $u = self::factory()->user->create();
    1375                 $g = self::factory()->group->create();
     1375                $u2 = self::factory()->user->create();
     1376                $g = self::factory()->group->create( array( 'creator_id' => $u2, 'status' => 'private' ) );
    13761377
    1377                 $invite                = new BP_Groups_Member;
    1378                 $invite->group_id      = $g;
    1379                 $invite->user_id       = $u;
    1380                 $invite->date_modified = bp_core_current_time();
    1381                 $invite->invite_sent   = true;
    1382                 $invite->is_confirmed  = false;
    1383                 $invite->save();
     1378                // Outstanding invitations should be left intact.
     1379                groups_invite_user( array(
     1380                        'user_id' => $u,
     1381                        'group_id' => $g,
     1382                        'inviter_id' => $u2,
     1383                        'send_invite' => 1,
     1384                ) );
    13841385
    13851386                $paged_groups = array();
    13861387                $paged_groups[] = new stdClass;
    class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase { 
    14111412         */
    14121413        public function test_get_group_extras_pending() {
    14131414                $u = self::factory()->user->create();
    1414                 $g = self::factory()->group->create();
     1415                $g = self::factory()->group->create( array( 'status' => 'private' ) );
    14151416
    1416                 $invite                = new BP_Groups_Member;
    1417                 $invite->group_id      = $g;
    1418                 $invite->user_id       = $u;
    1419                 $invite->date_modified = bp_core_current_time();
    1420                 $invite->invite_sent   = false;
    1421                 $invite->is_confirmed  = false;
    1422                 $invite->save();
     1417                // Create membership request
     1418                groups_send_membership_request( array(
     1419                        'user_id'       => $u,
     1420                        'group_id'      => $g,
     1421                ) );
    14231422
    14241423                $paged_groups = array();
    14251424                $paged_groups[] = new stdClass;
  • tests/phpunit/testcases/groups/class-bp-groups-member.php

    diff --git a/tests/phpunit/testcases/groups/class-bp-groups-member.php b/tests/phpunit/testcases/groups/class-bp-groups-member.php
    index b052f81fe..480c2ae0f 100644
    a b class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    2020                array_map( 'groups_delete_group', self::$group_ids );
    2121        }
    2222
    23         public static function invite_user_to_group( $user_id, $group_id, $inviter_id ) {
    24                 $invite                = new BP_Groups_Member;
    25                 $invite->group_id      = $group_id;
    26                 $invite->user_id       = $user_id;
    27                 $invite->date_modified = bp_core_current_time();
    28                 $invite->inviter_id    = $inviter_id;
    29                 $invite->is_confirmed  = 0;
    30                 $invite->invite_sent   = 1;
    31 
    32                 $invite->save();
    33                 return $invite->id;
    34         }
    35 
    36         public static function create_group_membership_request( $user_id, $group_id ) {
    37                 $request                = new BP_Groups_Member;
    38                 $request->group_id      = $group_id;
    39                 $request->user_id       = $user_id;
    40                 $request->date_modified = bp_core_current_time();
    41                 $request->inviter_id    = 0;
    42                 $request->is_confirmed  = 0;
    43 
    44                 $request->save();
    45                 return $request->id;
    46         }
    47 
    4823        public function test_get_recently_joined_with_filter() {
    4924                $g1 = self::factory()->group->create( array(
    5025                        'name' => 'Tab',
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    133108        }
    134109
    135110        public function test_get_invites_with_exclude() {
     111                $u1 = self::factory()->user->create();
     112                $u2 = self::factory()->user->create();
    136113                $g1 = self::factory()->group->create( array(
    137                         'name' => 'RC Cola',
     114                        'status' => 'private',
     115                        'creator_id' => $u1
    138116                ) );
    139117                $g2 = self::factory()->group->create( array(
    140                         'name' => 'Pepsi',
     118                        'status' => 'private',
     119                        'creator_id' => $u1
    141120                ) );
    142121
    143                 $u1 = self::factory()->user->create();
    144                 $u2 = self::factory()->user->create();
    145                 self::add_user_to_group( $u1, $g1 );
    146                 self::add_user_to_group( $u1, $g2 );
    147                 self::invite_user_to_group( $u2, $g1, $u1 );
    148                 self::invite_user_to_group( $u2, $g2, $u1 );
     122                groups_invite_user( array(
     123                        'user_id' => $u2,
     124                        'group_id' => $g1,
     125                        'inviter_id' => $u1,
     126                        'send_invite' => 1,
     127                ) );
     128                groups_invite_user( array(
     129                        'user_id' => $u2,
     130                        'group_id' => $g2,
     131                        'inviter_id' => $u1,
     132                        'send_invite' => 1,
     133                ) );
    149134
    150135                $groups = BP_Groups_Member::get_invites( $u2, false, false, array( 'awesome', $g1 ) );
    151136
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    282267                ) );
    283268
    284269                // Membership requests should be removed.
    285                 self::create_group_membership_request( $u1, $g );
     270                groups_send_membership_request( array(
     271                        'user_id' => $u1,
     272                        'group_id' => $g
     273                ) );
     274
    286275                groups_reject_membership_request( null, $u1, $g );
    287276                $u1_has_request = groups_check_for_membership_request( $u1, $g );
    288277                $this->assertEquals( 0, $u1_has_request );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    325314                ) );
    326315
    327316                // Outstanding invitations should be left intact.
    328                 self::invite_user_to_group( $u2, $g, $u1 );
     317                groups_invite_user( array(
     318                        'user_id' => $u2,
     319                        'group_id' => $g,
     320                        'inviter_id' => $u1,
     321                        'send_invite' => 1,
     322                ) );
    329323                groups_reject_membership_request( null, $u2, $g );
    330324                $u2_has_invite = groups_check_user_has_invite( $u2, $g );
    331325                $this->assertTrue( is_numeric( $u2_has_invite ) && $u2_has_invite > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    343337                ) );
    344338
    345339                // Membership requests should be removed.
    346                 self::create_group_membership_request( $u1, $g );
     340                groups_send_membership_request( array(
     341                        'user_id' => $u1,
     342                        'group_id' => $g
     343                ) );
    347344                groups_delete_membership_request( null, $u1, $g );
    348345                $u1_has_request = groups_check_for_membership_request( $u1, $g );
    349346                $this->assertEquals( 0, $u1_has_request );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    386383                ) );
    387384
    388385                // Outstanding invitations should be left intact.
    389                 self::invite_user_to_group( $u2, $g, $u1 );
     386                groups_invite_user( array(
     387                        'user_id' => $u2,
     388                        'group_id' => $g,
     389                        'inviter_id' => $u1,
     390                        'send_invite' => 1,
     391                ) );
     392
    390393                groups_delete_membership_request( null, $u2, $g );
    391394                $u2_has_invite = groups_check_user_has_invite( $u2, $g );
    392395                $this->assertTrue( is_numeric( $u2_has_invite ) && $u2_has_invite > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    410413                ) );
    411414
    412415                // The invitation should be removed.
    413                 self::invite_user_to_group( $u2, $g, $u1 );
     416                groups_invite_user( array(
     417                        'user_id' => $u2,
     418                        'group_id' => $g,
     419                        'inviter_id' => $u1,
     420                        'send_invite' => 1,
     421                ) );
     422
    414423                groups_reject_invite( $u2, $g );
    415424                $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' );
    416425                $this->assertEquals( 0, $u2_has_invite );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    450459                ) );
    451460
    452461                // Membership requests should be left intact.
    453                 self::create_group_membership_request( $u1, $g );
     462                groups_send_membership_request( array(
     463                        'user_id' => $u1,
     464                        'group_id' => $g
     465                ) );
    454466                groups_reject_invite( $u1, $g );
    455467                $u1_has_request = groups_check_for_membership_request( $u1, $g );
    456468                $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    474486                ) );
    475487
    476488                // The invitation should be removed.
    477                 self::invite_user_to_group( $u2, $g, $u1 );
     489                groups_invite_user( array(
     490                        'user_id' => $u2,
     491                        'group_id' => $g,
     492                        'inviter_id' => $u1,
     493                        'send_invite' => 1,
     494                ) );
     495
    478496                groups_delete_invite( $u2, $g );
    479497                $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' );
    480498                $this->assertEquals( 0, $u2_has_invite );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    547565                ) );
    548566
    549567                // Membership requests should be left intact.
    550                 self::create_group_membership_request( $u1, $g );
     568                groups_send_membership_request( array(
     569                        'user_id' => $u1,
     570                        'group_id' => $g
     571                ) );
    551572                groups_delete_invite( $u1, $g );
    552573                $u1_has_request = groups_check_for_membership_request( $u1, $g );
    553574                $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    571592                ) );
    572593
    573594                // The invitation should be removed.
    574                 self::invite_user_to_group( $u2, $g, $u1 );
     595                groups_invite_user( array(
     596                        'user_id' => $u2,
     597                        'group_id' => $g,
     598                        'inviter_id' => $u1,
     599                        'send_invite' => 1,
     600                ) );
    575601                groups_uninvite_user( $u2, $g );
    576602                $u2_has_invite = groups_check_user_has_invite( $u2, $g, 'all' );
    577603                $this->assertEquals( 0, $u2_has_invite );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    612638                ) );
    613639
    614640                // Membership requests should be left intact.
    615                 self::create_group_membership_request( $u1, $g );
     641                groups_send_membership_request( array(
     642                        'user_id' => $u1,
     643                        'group_id' => $g
     644                ) );
    616645                groups_uninvite_user( $u1, $g );
    617646                $u1_has_request = groups_check_for_membership_request( $u1, $g );
    618647                $this->assertTrue( is_numeric( $u1_has_request ) && $u1_has_request > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    672701                $m1 = new BP_Groups_Member( $u1, $g );
    673702                $m1->promote( 'admin' );
    674703
    675                 self::invite_user_to_group( $u2, $g, $u1 );
    676 
     704                groups_invite_user( array(
     705                        'user_id' => $u2,
     706                        'group_id' => $g,
     707                        'inviter_id' => $u1,
     708                        'send_invite' => 1,
     709                ) );
    677710                groups_join_group( $g, $u2 );
    678711                // Upon joining the group, outstanding invitations should be cleaned up.
    679712                $this->assertEquals( null, groups_check_user_has_invite( $u2, $g, 'any' ) );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    686719        public function test_groups_join_group_cleanup_requests() {
    687720                $u1 = self::factory()->user->create();
    688721                $g = self::factory()->group->create();
    689                 self::create_group_membership_request( $u1, $g );
     722
     723                groups_send_membership_request( array(
     724                        'user_id' => $u1,
     725                        'group_id' => $g
     726                ) );
    690727
    691728                groups_join_group( $g, $u1 );
    692729                // Upon joining the group, outstanding requests should be cleaned up.
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    825862        public function test_groups_get_invites_for_user() {
    826863                $u1 = self::factory()->user->create();
    827864                $u2 = self::factory()->user->create();
    828                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    829                 $g2 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    830                 $g3 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    831 
    832                 self::invite_user_to_group( $u2, $g1, $u1 );
    833                 self::invite_user_to_group( $u2, $g2, $u1 );
    834                 self::invite_user_to_group( $u2, $g3, $u1 );
     865                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     866                $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     867                $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    835868
     869                groups_invite_user( array(
     870                        'user_id' => $u2,
     871                        'group_id' => $g1,
     872                        'inviter_id' => $u1,
     873                        'send_invite' => 1,
     874                ) );
     875                groups_invite_user( array(
     876                        'user_id' => $u2,
     877                        'group_id' => $g2,
     878                        'inviter_id' => $u1,
     879                        'send_invite' => 1,
     880                ) );
     881                groups_invite_user( array(
     882                        'user_id' => $u2,
     883                        'group_id' => $g3,
     884                        'inviter_id' => $u1,
     885                        'send_invite' => 1,
     886                ) );
    836887                $groups = groups_get_invites_for_user( $u2 );
    837888
    838889                $this->assertEqualSets( array( $g1, $g2, $g3 ), wp_list_pluck( $groups['groups'], 'id' ) );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    848899
    849900                $u1 = self::factory()->user->create();
    850901                $u2 = self::factory()->user->create();
    851                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    852                 $g2 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    853                 $g3 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     902                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     903                $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     904                $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    854905
    855                 self::invite_user_to_group( $u2, $g1, $u1 );
    856                 self::invite_user_to_group( $u2, $g2, $u1 );
    857                 self::invite_user_to_group( $u2, $g3, $u1 );
     906                groups_invite_user( array(
     907                        'user_id' => $u2,
     908                        'group_id' => $g1,
     909                        'inviter_id' => $u1,
     910                        'send_invite' => 1,
     911                ) );
     912                groups_invite_user( array(
     913                        'user_id' => $u2,
     914                        'group_id' => $g2,
     915                        'inviter_id' => $u1,
     916                        'send_invite' => 1,
     917                ) );
     918                groups_invite_user( array(
     919                        'user_id' => $u2,
     920                        'group_id' => $g3,
     921                        'inviter_id' => $u1,
     922                        'send_invite' => 1,
     923                ) );
    858924
    859925                $this->set_current_user( $u2 );
    860926                $groups = groups_get_invites_for_user();
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    871937        public function test_groups_get_invites_for_user_with_exclude() {
    872938                $u1 = self::factory()->user->create();
    873939                $u2 = self::factory()->user->create();
    874                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    875                 $g2 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    876                 $g3 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     940                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     941                $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     942                $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    877943
    878                 self::invite_user_to_group( $u2, $g1, $u1 );
    879                 self::invite_user_to_group( $u2, $g2, $u1 );
    880                 self::invite_user_to_group( $u2, $g3, $u1 );
     944                groups_invite_user( array(
     945                        'user_id' => $u2,
     946                        'group_id' => $g1,
     947                        'inviter_id' => $u1,
     948                        'send_invite' => 1,
     949                ) );
     950                groups_invite_user( array(
     951                        'user_id' => $u2,
     952                        'group_id' => $g2,
     953                        'inviter_id' => $u1,
     954                        'send_invite' => 1,
     955                ) );
     956                groups_invite_user( array(
     957                        'user_id' => $u2,
     958                        'group_id' => $g3,
     959                        'inviter_id' => $u1,
     960                        'send_invite' => 1,
     961                ) );
    881962
    882963                $groups = groups_get_invites_for_user( $u2, false, false, array( $g2 ) );
    883964                $this->assertEqualSets( array( $g1, $g3 ), wp_list_pluck( $groups['groups'], 'id' ) );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    891972        public function test_groups_get_invite_count_for_user() {
    892973                $u1 = self::factory()->user->create();
    893974                $u2 = self::factory()->user->create();
    894                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    895                 $g2 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    896                 $g3 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     975                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     976                $g2 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     977                $g3 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    897978
    898                 self::invite_user_to_group( $u2, $g1, $u1 );
    899                 self::invite_user_to_group( $u2, $g2, $u1 );
    900                 self::invite_user_to_group( $u2, $g3, $u1 );
     979                groups_invite_user( array(
     980                        'user_id' => $u2,
     981                        'group_id' => $g1,
     982                        'inviter_id' => $u1,
     983                        'send_invite' => 1,
     984                ) );
     985                groups_invite_user( array(
     986                        'user_id' => $u2,
     987                        'group_id' => $g2,
     988                        'inviter_id' => $u1,
     989                        'send_invite' => 1,
     990                ) );
     991                groups_invite_user( array(
     992                        'user_id' => $u2,
     993                        'group_id' => $g3,
     994                        'inviter_id' => $u1,
     995                        'send_invite' => 1,
     996                ) );
    901997
    902998                $this->assertEquals( 3, groups_get_invite_count_for_user( $u2 ) );
    903999        }
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9101006        public function test_groups_get_invite_count_for_user_ignore_drafts() {
    9111007                $u1 = self::factory()->user->create();
    9121008                $u2 = self::factory()->user->create();
    913                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1009                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    9141010
    9151011                // Create draft invitation.
    9161012                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9331029        public function test_groups_invite_user() {
    9341030                $u1 = self::factory()->user->create();
    9351031                $u2 = self::factory()->user->create();
    936                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1032                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    9371033
    9381034                // Create draft invitation
    9391035                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9571053        public function test_groups_send_invites() {
    9581054                $u1 = self::factory()->user->create();
    9591055                $u2 = self::factory()->user->create();
    960                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1056                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    9611057
    9621058                // Create draft invitation
    9631059                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9691065                ) );
    9701066
    9711067                // Send the invitation
    972                 groups_send_invites( $u1, $g1 );
     1068                groups_send_invites( array(
     1069                        'group_id'   => $g1,
     1070                        'inviter_id' => $u1,
     1071                ) );
    9731072
    9741073                // Check that the invitation has been sent.
    9751074                $sent = groups_check_user_has_invite( $u2, $g1, $type = 'sent' );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9771076        }
    9781077
    9791078        /**
    980          * @group groups_accept_invite
     1079         * @group groups_send_invites
    9811080         * @group group_invitations
    9821081         * @group group_membership
     1082         * @expectedDeprecated groups_send_invites
    9831083         */
    984         public function test_groups_accept_invite() {
     1084        public function test_groups_send_invites_deprecated_args() {
    9851085                $u1 = self::factory()->user->create();
    9861086                $u2 = self::factory()->user->create();
    987                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1087                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    9881088
    9891089                // Create draft invitation
    9901090                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    9981098                // Send the invitation
    9991099                groups_send_invites( $u1, $g1 );
    10001100
     1101                // Check that the invitation has been sent.
     1102                $sent = groups_check_user_has_invite( $u2, $g1, $type = 'sent' );
     1103                $this->assertTrue( is_numeric( $sent ) && $sent > 0 );
     1104        }
     1105
     1106        /**
     1107         * @group groups_accept_invite
     1108         * @group group_invitations
     1109         * @group group_membership
     1110         */
     1111        public function test_groups_accept_invite() {
     1112                $u1 = self::factory()->user->create();
     1113                $u2 = self::factory()->user->create();
     1114                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     1115
     1116                // Create draft invitation
     1117                groups_invite_user( array(
     1118                        'user_id'       => $u2,
     1119                        'group_id'      => $g1,
     1120                        'inviter_id'    => $u1,
     1121                        'date_modified' => bp_core_current_time(),
     1122                        'is_confirmed'  => 0,
     1123                        'send_invite'   => 1
     1124                ) );
     1125
    10011126                // Accept the invitation
    10021127                groups_accept_invite( $u2, $g1 );
    10031128
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    10171142        public function test_groups_accept_invite_removes_membership_requests() {
    10181143                $u1 = self::factory()->user->create();
    10191144                $u2 = self::factory()->user->create();
    1020                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1145                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    10211146
    10221147                // Create draft invitation
    10231148                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    10291154                ) );
    10301155
    10311156                // Create membership request
    1032                 groups_send_membership_request( $u2, $g1 );
     1157                $request_id = groups_send_membership_request( array(
     1158                        'user_id'       => $u2,
     1159                        'group_id'      => $g1,
     1160                ) );
     1161
    10331162                $request = groups_check_for_membership_request( $u2, $g1 );
     1163
    10341164                $this->assertTrue( is_numeric( $request ) && $request > 0 );
    10351165
    10361166                // Send the invitation
    1037                 groups_send_invites( $u1, $g1 );
     1167                groups_send_invites( array(
     1168                        'group_id'   => $g1,
     1169                        'inviter_id' => $u1,
     1170                ) );
    10381171
    10391172                // Accept the invitation
    10401173                groups_accept_invite( $u2, $g1 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    10521185        public function test_groups_sent_invite_plus_request_equals_member() {
    10531186                $u1 = self::factory()->user->create();
    10541187                $u2 = self::factory()->user->create();
    1055                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1188                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    10561189
    10571190                // Create draft invitation
    10581191                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    10601193                        'group_id'      => $g1,
    10611194                        'inviter_id'    => $u1,
    10621195                        'date_modified' => bp_core_current_time(),
    1063                         'is_confirmed'  => 0
     1196                        'is_confirmed'  => 0,
     1197                        'send_invite'   => 1
    10641198                ) );
    10651199
    1066                 // Send the invitation
    1067                 groups_send_invites( $u1, $g1 );
    1068 
    10691200                // Create membership request
    1070                 groups_send_membership_request( $u2, $g1 );
     1201                groups_send_membership_request( array(
     1202                        'user_id' => $u2,
     1203                        'group_id' => $g1
     1204                ) );
    10711205
    10721206                // User should now be a group member
    10731207                $member = groups_is_user_member( $u2, $g1 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    10831217                $u1 = self::factory()->user->create();
    10841218                $u2 = self::factory()->user->create();
    10851219                $u3 = self::factory()->user->create();
    1086                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1220                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    10871221
    1088                 self::invite_user_to_group( $u2, $g1, $u1 );
    1089                 self::invite_user_to_group( $u3, $g1, $u1 );
     1222                groups_invite_user( array(
     1223                        'user_id' => $u2,
     1224                        'group_id' => $g1,
     1225                        'inviter_id' => $u1,
     1226                        'send_invite' => 1,
     1227                ) );
     1228                groups_invite_user( array(
     1229                        'user_id' => $u3,
     1230                        'group_id' => $g1,
     1231                        'inviter_id' => $u1,
     1232                        'send_invite' => 1,
     1233                ) );
    10901234
    10911235                groups_delete_all_group_invites( $g1 );
    10921236
    10931237                // Get group invitations of any type, from any user in the group.
    1094                 $invitees = new BP_Group_Member_Query( array(
     1238
     1239                $invitees = groups_get_invites( array(
    10951240                        'group_id'     => $g1,
    1096                         'is_confirmed' => 0,
    1097                         'invite_sent'  => null,
    1098                         'inviter_id'   => 'any',
     1241                        'invite_sent'  => 'all',
    10991242                ) );
    11001243
    1101                 $this->assertTrue( empty( $invitees->results ) );
     1244                $this->assertTrue( empty( $invitees ) );
    11021245        }
    11031246
    11041247        /**
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    11291272         */
    11301273        public function test_groups_send_invites_fail_on_empty_user_id() {
    11311274                $u1 = self::factory()->user->create();
    1132                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1275                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    11331276
    11341277                // Create draft invitation with empty inviter_id
    11351278                $invite_created = groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    11511294        public function test_groups_send_invites_fail_on_empty_inviter_id() {
    11521295                $u1 = self::factory()->user->create();
    11531296                $u2 = self::factory()->user->create();
    1154                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1297                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    11551298
    11561299                // Create draft invitation with empty inviter_id
    11571300                $invite_created = groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    11741317        public function test_groups_get_invites_for_group_with_sent_parameter() {
    11751318                $u1 = self::factory()->user->create();
    11761319                $u2 = self::factory()->user->create();
    1177                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1320                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    11781321
    11791322                // Create draft invitation
    11801323                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    11821325                        'group_id'      => $g1,
    11831326                        'inviter_id'    => $u1,
    11841327                        'date_modified' => bp_core_current_time(),
    1185                         'is_confirmed'  => 0
     1328                        'is_confirmed'  => 0,
     1329                        'send_invite'   => 1
    11861330                ) );
    11871331
    1188                 // Send the invitation; this will set the 'invite_sent' value to 1.
    1189                 groups_send_invites( $u1, $g1 );
    1190 
    11911332                // Default groups_get_invites_for_group() call
    11921333                $i = groups_get_invites_for_group( $u1, $g1 );
    11931334                $this->assertEqualSets( array( $u2 ), $i );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12081349         */
    12091350        public function test_groups_send_membership_request() {
    12101351                $u1 = self::factory()->user->create();
    1211                 $g1 = self::factory()->group->create();
     1352                $g1 = self::factory()->group->create( array( 'status' => 'private' ) );
     1353
     1354                // Create membership request
     1355                groups_send_membership_request( array(
     1356                        'user_id' => $u1,
     1357                        'group_id' => $g1
     1358                ) );
     1359
     1360                $request = groups_check_for_membership_request( $u1, $g1 );
     1361                $this->assertTrue( is_numeric( $request ) && $request > 0 );
     1362        }
     1363
     1364        /**
     1365         * @group groups_send_membership_request
     1366         * @group group_membership_requests
     1367         * @group group_membership
     1368         * @expectedDeprecated groups_send_membership_request
     1369         */
     1370        public function test_groups_send_membership_request_deprecated_args() {
     1371                $u1 = self::factory()->user->create();
     1372                $g1 = self::factory()->group->create( array( 'status' => 'private' ) );
    12121373
    12131374                // Create membership request
    12141375                groups_send_membership_request( $u1, $g1 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12241385         */
    12251386        public function test_groups_accept_membership_request_by_membership_id() {
    12261387                $u1 = self::factory()->user->create();
    1227                 $g1 = self::factory()->group->create();
     1388                $g1 = self::factory()->group->create( array( 'status' => 'private' ) );
    12281389
    12291390                // Create membership request
    1230                 groups_send_membership_request( $u1, $g1 );
     1391                groups_send_membership_request( array(
     1392                        'user_id' => $u1,
     1393                        'group_id' => $g1
     1394                ) );
    12311395
    12321396                // Get group invitations of any type, from any user in the group.
    12331397                $member = new BP_Groups_Member( $u1, $g1 );
    12341398
    1235                 groups_accept_membership_request( $member->id );
     1399                groups_accept_membership_request( false, $u1, $g1 );
    12361400
    12371401                // User should now be a group member.
    12381402                $member = groups_is_user_member( $u1, $g1 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12471411         */
    12481412        public function test_groups_accept_membership_request_by_user_id_group_id() {
    12491413                $u1 = self::factory()->user->create();
    1250                 $g1 = self::factory()->group->create();
     1414                $g1 = self::factory()->group->create( array( 'status' => 'private' ) );
    12511415
    12521416                // Create membership request
    1253                 groups_send_membership_request( $u1, $g1 );
     1417                groups_send_membership_request( array(
     1418                        'user_id' => $u1,
     1419                        'group_id' => $g1
     1420                ) );
    12541421
    12551422                groups_accept_membership_request( null, $u1, $g1 );
    12561423
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12681435        public function test_groups_membership_request_plus_invite_equals_member() {
    12691436                $u1 = self::factory()->user->create();
    12701437                $u2 = self::factory()->user->create();
    1271                 $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     1438                $g1 = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    12721439
    12731440                // Create membership request
    1274                 groups_send_membership_request( $u2, $g1 );
     1441                groups_send_membership_request( array(
     1442                        'user_id' => $u2,
     1443                        'group_id' => $g1
     1444                ) );
    12751445
    12761446                // Create draft invitation
    12771447                groups_invite_user( array(
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12791449                        'group_id'      => $g1,
    12801450                        'inviter_id'    => $u1,
    12811451                        'date_modified' => bp_core_current_time(),
    1282                         'is_confirmed'  => 0
     1452                        'is_confirmed'  => 0,
     1453                        'send_invite'   => 1
    12831454                ) );
    12841455
    1285                 // Send the invitation
    1286                 groups_send_invites( $u1, $g1 );
    1287 
    12881456                // User should now be a group member
    12891457                $member = groups_is_user_member( $u2, $g1 );
    12901458                $this->assertTrue( is_numeric( $member ) && $member > 0 );
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    12991467                $u1 = self::factory()->user->create();
    13001468                $u2 = self::factory()->user->create();
    13011469                $u3 = self::factory()->user->create();
    1302                 $g1 = self::factory()->group->create();
     1470                $g1 = self::factory()->group->create( array( 'status' => 'private' ) );
    13031471
    13041472                // Create membership request
    1305                 groups_send_membership_request( $u1, $g1 );
    1306                 groups_send_membership_request( $u2, $g1 );
    1307                 groups_send_membership_request( $u3, $g1 );
     1473                groups_send_membership_request( array(
     1474                        'user_id' => $u1,
     1475                        'group_id' => $g1
     1476                ) );
     1477                groups_send_membership_request( array(
     1478                        'user_id' => $u2,
     1479                        'group_id' => $g1
     1480                ) );
     1481                groups_send_membership_request( array(
     1482                        'user_id' => $u3,
     1483                        'group_id' => $g1
     1484                ) );
    13081485
    13091486                groups_accept_all_pending_membership_requests( $g1 );
    13101487
    class BP_Tests_BP_Groups_Member_TestCases extends BP_UnitTestCase { 
    14021579                $this->assertSame( self::$group_ids[0], $memberships[0]->group_id );
    14031580        }
    14041581
    1405         /**
    1406          * @ticket BP7859
    1407          */
    1408         public function test_get_user_memberships_type_pending_request() {
    1409                 groups_join_group( self::$group_ids[0], self::$user_ids[0] );
    1410                 groups_send_membership_request( self::$user_ids[0], self::$group_ids[1] );
    1411 
    1412                 $memberships = BP_Groups_Member::get_user_memberships( self::$user_ids[0], array(
    1413                         'type' => 'pending_request',
    1414                 ) );
    1415 
    1416                 $this->assertCount( 1, $memberships );
    1417                 $this->assertSame( self::$group_ids[1], $memberships[0]->group_id );
    1418         }
    1419 
    1420         /**
    1421          * @ticket BP7859
    1422          */
    1423         public function test_get_user_memberships_type_pending_received_invitation() {
    1424                 groups_join_group( self::$group_ids[0], self::$user_ids[0] );
    1425                 groups_invite_user( array(
    1426                         'user_id'    => self::$user_ids[0],
    1427                         'group_id'   => self::$group_ids[1],
    1428                         'inviter_id' => self::$user_ids[1],
    1429                 ) );
    1430 
    1431                 $memberships = BP_Groups_Member::get_user_memberships( self::$user_ids[0], array(
    1432                         'type' => 'pending_received_invitation',
    1433                 ) );
    1434 
    1435                 $this->assertCount( 1, $memberships );
    1436                 $this->assertSame( self::$group_ids[1], $memberships[0]->group_id );
    1437         }
    1438 
    1439         /**
    1440          * @ticket BP7859
    1441          */
    1442         public function test_get_user_memberships_type_pending_sent_invitation() {
    1443                 groups_join_group( self::$group_ids[0], self::$user_ids[0] );
    1444                 groups_invite_user( array(
    1445                         'user_id'    => self::$user_ids[1],
    1446                         'group_id'   => self::$group_ids[1],
    1447                         'inviter_id' => self::$user_ids[0],
    1448                 ) );
    1449 
    1450                 $memberships = BP_Groups_Member::get_user_memberships( self::$user_ids[0], array(
    1451                         'type' => 'pending_sent_invitation',
    1452                 ) );
    1453 
    1454                 $this->assertCount( 1, $memberships );
    1455                 $this->assertSame( self::$group_ids[1], $memberships[0]->group_id );
    1456         }
    1457 
    14581582        /**
    14591583         * @ticket BP7476
    14601584         */
  • tests/phpunit/testcases/groups/functions.php

    diff --git a/tests/phpunit/testcases/groups/functions.php b/tests/phpunit/testcases/groups/functions.php
    index c4a24592a..ee04ef6a0 100644
    a b class BP_Tests_Groups_Functions extends BP_UnitTestCase { 
    1212                self::$user_ids  = $factory->user->create_many( 3 );
    1313                self::$group_ids = $factory->group->create_many( 2, array(
    1414                        'creator_id' => self::$user_ids[2],
     15                        'status'     => 'private'
    1516                ) );
    1617        }
    1718
    class BP_Tests_Groups_Functions extends BP_UnitTestCase { 
    138139                $this->set_current_user( $u2 );
    139140
    140141                $g = self::factory()->group->create();
    141                 groups_send_membership_request( $u1, $g );
     142                groups_send_membership_request( array(
     143                        'user_id'       => $u1,
     144                        'group_id'      => $g,
     145                ) );
    142146
    143147                groups_accept_membership_request( 0, $u1, $g );
    144148
    class BP_Tests_Groups_Functions extends BP_UnitTestCase { 
    262266                $u2 = self::factory()->user->create();
    263267                $g = self::factory()->group->create( array( 'creator_id' => $u1 ) );
    264268
    265                 groups_send_membership_request( $u2, $g );
     269                groups_send_membership_request( array(
     270                        'user_id'       => $u2,
     271                        'group_id'      => $g,
     272                ) );
    266273                groups_accept_membership_request( 0, $u2, $g );
    267274
    268275                $this->assertEquals( 2, groups_get_groupmeta( $g, 'total_member_count' ) );
    Bar!'; 
    632639        public function test_get_invite_count_for_user() {
    633640                $u1 = self::factory()->user->create();
    634641                $u2 = self::factory()->user->create();
    635                 $g = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     642                $g = self::factory()->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
    636643
    637644                // create invitation
    638645                groups_invite_user( array(
    639646                        'user_id'    => $u2,
    640647                        'group_id'   => $g,
    641648                        'inviter_id' => $u1,
     649                        'send_invite' => 1
    642650                ) );
    643651
    644                 // send the invite
    645                 // this function is imperative to set the 'invite_sent' flag in the DB
    646                 // why is this separated from groups_invite_user()?
    647                 // @see groups_screen_group_invite()
    648                 groups_send_invites( $u1, $g );
    649 
    650652                // assert invite count
    651653                $this->assertEquals( 1, groups_get_invite_count_for_user( $u2 ) );
    652654
    Bar!'; 
    890892         * @ticket BP7698
    891893         */
    892894        public function test_bp_groups_pending_requests_personal_data_exporter() {
    893                 groups_send_membership_request( self::$user_ids[0], self::$group_ids[0] );
     895                groups_send_membership_request( array(
     896                        'user_id'       => self::$user_ids[0],
     897                        'group_id'      => self::$group_ids[0],
     898                ) );
    894899
    895900                $test_user = new WP_User( self::$user_ids[0] );
    896901
  • tests/phpunit/testcases/groups/functions/bpGetUserGroups.php

    diff --git a/tests/phpunit/testcases/groups/functions/bpGetUserGroups.php b/tests/phpunit/testcases/groups/functions/bpGetUserGroups.php
    index acf28c6b1..ccdb888ba 100644
    a b class BP_Tests_Groups_Functions_BpGetUserGroups extends BP_UnitTestCase { 
    541541                $server_name = isset( $_SERVER['SERVER_NAME'] ) ? $_SERVER['SERVER_NAME'] : null;
    542542                $_SERVER['SERVER_NAME'] = '';
    543543
    544                 groups_send_membership_request( self::$user, self::$groups[2] );
     544                groups_send_membership_request( array(
     545                        'user_id'       => self::$user,
     546                        'group_id'      => self::$groups[2],
     547                ) );
    545548
    546549                // Populate cache.
    547550                $g1 = bp_get_user_groups( self::$user );
    548551
    549552                $m = new BP_Groups_Member( self::$user, self::$groups[2] );
    550553
    551                 groups_accept_membership_request( $m->id, self::$user, self::$groups[2] );
     554                groups_accept_membership_request( false, self::$user, self::$groups[2] );
    552555
    553556                // For `wp_mail()`.
    554557                if ( is_null( $server_name ) ) {
  • tests/phpunit/testcases/groups/functions/groupsIsUser.php

    diff --git a/tests/phpunit/testcases/groups/functions/groupsIsUser.php b/tests/phpunit/testcases/groups/functions/groupsIsUser.php
    index f7d6dd356..ef35382c9 100644
    a b class BP_Tests_Groups_Functions_GroupsIsUser extends BP_UnitTestCase { 
    2121                ) );
    2222                self::$groups = $f->group->create_many( 3, array(
    2323                        'creator_id' => self::$admin_user,
     24                        'status'     => 'private'
    2425                ) );
    2526
    2627                $now = time();
    class BP_Tests_Groups_Functions_GroupsIsUser extends BP_UnitTestCase { 
    173174                $i = groups_invite_user( array(
    174175                        'user_id' => self::$user,
    175176                        'group_id' => self::$groups[1],
    176                         'inviter_id' => 123,
     177                        'inviter_id' => self::$admin_user,
     178                        'send_invite' => 1,
    177179                ) );
    178180
    179                 // Send invite.
    180                 $m = new BP_Groups_Member( self::$user, self::$groups[1] );
    181                 $m->invite_sent = 1;
    182                 $m->save();
    183 
    184181                $this->assertNotEmpty( groups_is_user_invited( self::$user, self::$groups[1] ) );
    185182        }
    186183
    187         public function test_groups_is_user_pending_should_return_false_for_pending_member() {
     184        public function test_groups_is_user_pending_should_return_false_for_invited_member() {
    188185                groups_invite_user( array(
    189186                        'user_id' => self::$user,
    190187                        'group_id' => self::$groups[1],
    191                         'inviter_id' => 123,
     188                        'send_invite' => 1
    192189                ) );
    193190
    194                 // Send invite.
    195                 $m = new BP_Groups_Member( self::$user, self::$groups[1] );
    196                 $m->invite_sent = 1;
    197                 $m->save();
    198 
    199191                $this->assertEquals( false, groups_is_user_pending( self::$user, self::$groups[1] ) );
    200192        }
    201193
    class BP_Tests_Groups_Functions_GroupsIsUser extends BP_UnitTestCase { 
    204196        }
    205197
    206198        public function test_groups_is_user_pending_should_return_true_for_pending_member() {
    207 
    208                 $m                = new BP_Groups_Member;
    209                 $m->group_id      = self::$groups[1];
    210                 $m->user_id       = self::$user;
    211                 $m->inviter_id    = 0;
    212                 $m->is_admin      = 0;
    213                 $m->user_title    = '';
    214                 $m->date_modified = bp_core_current_time();
    215                 $m->is_confirmed  = 0;
    216                 $m->comments      = 'request';
    217                 $m->save();
     199                groups_send_membership_request( array(
     200                        'user_id' => self::$user,
     201                        'group_id' => self::$groups[1],
     202                ) );
    218203
    219204                $this->assertNotEmpty( groups_is_user_pending( self::$user, self::$groups[1] ) );
    220205        }
  • tests/phpunit/testcases/groups/template/bpGroupStatusMessage.php

    diff --git a/tests/phpunit/testcases/groups/template/bpGroupStatusMessage.php b/tests/phpunit/testcases/groups/template/bpGroupStatusMessage.php
    index b6d5e1173..bcc1ff3eb 100644
    a b class BP_Tests_Groups_Template_BpGroupStatusMessage extends BP_UnitTestCase { 
    9898
    9999                $this->set_current_user( $u );
    100100
    101                 groups_send_membership_request( $u, $g );
     101                groups_send_membership_request( array(
     102                        'user_id'  => $u,
     103                        'group_id' => $g
     104                ) );
    102105
    103106                if ( bp_has_groups( array( 'include' => array( $g ) ) ) ) {
    104107                        while ( bp_groups() ) {
    class BP_Tests_Groups_Template_BpGroupStatusMessage extends BP_UnitTestCase { 
    141144                $GLOBALS['groups_template'] = new stdClass;
    142145                $GLOBALS['groups_template']->group = groups_get_group( $groups[0] );
    143146
    144                 groups_send_membership_request( $u, $groups[1] );
     147                groups_send_membership_request( array(
     148                        'user_id' => $u,
     149                        'group_id' => $groups[1]
     150                ) );
    145151
    146152                $group1 = groups_get_group( array(
    147153                        'group_id' => $groups[1],
  • tests/phpunit/testcases/groups/user_can.php

    diff --git a/tests/phpunit/testcases/groups/user_can.php b/tests/phpunit/testcases/groups/user_can.php
    index 01b4bd254..fee0706f4 100644
    a b class BP_Tests_Groups_User_Can_Filter extends BP_UnitTestCase { 
    108108                        'status'      => 'private'
    109109                ) );
    110110                $u1 = $this->factory->user->create();
    111                 groups_send_membership_request( $u1, $g1 );
     111                groups_send_membership_request( array(
     112                        'user_id' => $u1,
     113                        'group_id' => $g1
     114                ) );
    112115
    113116                $this->assertFalse( bp_user_can( $u1, 'groups_request_membership', array( 'group_id' => $g1 ) ) );
    114117        }