Skip to:
Content

BuddyPress.org

Ticket #6445: 6445.01.patch

File 6445.01.patch, 4.9 KB (added by r-a-y, 5 years ago)
  • src/bp-notifications/bp-notifications-cache.php

     
    6363        }
    6464}
    6565add_action( 'bp_notification_before_delete', 'bp_notifications_clear_all_for_user_cache_before_delete' );
     66
     67/**
     68 * Invalidates 'all_for_user_' cache when updating.
     69 *
     70 * @since BuddyPress (2.4.0)
     71 *
     72 * @param array $update_args See BP_Notifications_Notification::update() for description.
     73 * @param array $where_args  See BP_Notifications_Notification::update() for description.
     74 */
     75function bp_notification_clear_all_for_user_cache_before_update( $update_args, $where_args ) {
     76        // grab the user ID
     77        $user_id = 0;
     78
     79        if ( ! empty( $where_args['user_id'] ) ) {
     80                $user_id = (int) $where_args['user_id'];
     81
     82        } elseif ( ! empty( $where_args['id'] ) ) {
     83                $notification = bp_notifications_get_notification( (int) $where_args['id'] );
     84                $user_id = $notification->user_id;
     85        }
     86
     87        if ( ! empty( $user_id ) ) {
     88                wp_cache_delete( 'all_for_user_' . $user_id, 'bp_notifications' );
     89        }
     90}
     91add_action( 'bp_notification_before_update', 'bp_notification_clear_all_for_user_cache_before_update', 10, 2 );
  • src/bp-notifications/classes/class-bp-notifications-notification.php

     
    830830                $update = self::get_query_clauses( $update_args );
    831831                $where  = self::get_query_clauses( $where_args  );
    832832
    833                 // make sure we delete the notification cache for the user on update
    834                 if ( ! empty( $where_args['user_id'] ) ) {
    835                         wp_cache_delete( 'all_for_user_' . $where_args['user_id'], 'bp_notifications' );
    836                 }
     833                /**
     834                 * Fires before the update of a notification item.
     835                 *
     836                 * @since BuddyPress (2.4.0)
     837                 *
     838                 * @param array $update_args See BP_Notifications_Notification::update().
     839                 * @param array $where_args  See BP_Notifications_Notification::update().
     840                 */
     841                do_action( 'bp_notification_before_update', $update_args, $where_args );
    837842
    838843                return self::_update( $update['data'], $where['data'], $update['format'], $where['format'] );
    839844        }
  • tests/phpunit/testcases/notifications/functions.php

     
    44 * @group notifications
    55 */
    66class BP_Tests_Notifications_Functions extends BP_UnitTestCase {
     7        /**
     8         * @group cache
     9         */
    710        public function test_cache_invalidation_all_for_user_on_save() {
    811                $u = $this->factory->user->create();
    912                $n1 = $this->factory->notification->create( array(
     
    3235                $this->assertFalse( wp_cache_get( 'all_for_user_' . $u, 'bp_notifications' ) );
    3336        }
    3437
     38        /**
     39         * @group cache
     40         */
    3541        public function test_cache_invalidation_all_for_user_on_delete() {
    3642                $u = $this->factory->user->create();
    3743                $n1 = $this->factory->notification->create( array(
     
    5662        }
    5763
    5864        /**
     65         * @group cache
     66         */
     67        public function test_cache_invalidation_all_for_user_on_update_user_id() {
     68                $u = $this->factory->user->create();
     69                $n1 = $this->factory->notification->create( array(
     70                        'component_name' => 'groups',
     71                        'user_id' => $u,
     72                ) );
     73                $n2 = $this->factory->notification->create( array(
     74                        'component_name' => 'messages',
     75                        'user_id' => $u,
     76                ) );
     77
     78                // prime cache
     79                $count = bp_notifications_get_unread_notification_count( $u );
     80
     81                // just to be sure...
     82                $this->assertEquals( 2, $count, 'Cache count should be 2 before invalidation.' );
     83
     84                // mark all notifications by user as read
     85                BP_Notifications_Notification::update(
     86                        array( 'is_new'  => false ),
     87                        array( 'user_id' => $u )
     88                );
     89
     90                $this->assertFalse( wp_cache_get( 'all_for_user_' . $u, 'bp_notifications' ) );
     91        }
     92
     93        /**
     94         * @group cache
     95         */
     96        public function test_cache_invalidation_all_for_user_on_update_id() {
     97                $u = $this->factory->user->create();
     98                $n1 = $this->factory->notification->create( array(
     99                        'component_name' => 'groups',
     100                        'user_id' => $u,
     101                ) );
     102                $n2 = $this->factory->notification->create( array(
     103                        'component_name' => 'messages',
     104                        'user_id' => $u,
     105                ) );
     106
     107                // prime cache
     108                $count = bp_notifications_get_unread_notification_count( $u );
     109
     110                // just to be sure...
     111                $this->assertEquals( 2, $count, 'Cache count should be 2 before invalidation.' );
     112
     113                // mark one notification as read
     114                BP_Notifications_Notification::update(
     115                        array( 'is_new' => false ),
     116                        array( 'id' => $n1 )
     117                );
     118
     119                $this->assertFalse( wp_cache_get( 'all_for_user_' . $u, 'bp_notifications' ) );
     120        }
     121
     122        /**
    59123         * @group bp_notifications_add_notification
    60124         */
    61125        public function test_bp_notifications_add_notification_no_dupes() {