diff --git a/admin.php b/admin.php index 0145d2a..0eddd5d 100644 --- a/admin.php +++ b/admin.php @@ -368,9 +368,10 @@ function bpges_install_queued_items_table() { type varchar(75) NOT NULL, date_recorded datetime NOT NULL default '0000-00-00 00:00:00', KEY user_id (user_id), - KEY group_id (user_id), + KEY group_id (group_id), KEY activity_id (activity_id), - KEY user_group_type_date (user_id,type,date_recorded) + KEY user_group_type_date (user_id,type,date_recorded), + UNIQUE KEY user_group_activity_type (user_id,group_id,activity_id,type) ) {$charset_collate};"; dbDelta( $sql ); diff --git a/classes/class-bpges-queued-item.php b/classes/class-bpges-queued-item.php index 030ef82..bad930d 100644 --- a/classes/class-bpges-queued-item.php +++ b/classes/class-bpges-queued-item.php @@ -60,7 +60,7 @@ public static function bulk_insert( $data ) { $table_name = self::get_table_name(); $values_sql = implode( ', ', $values ); - $sql = "INSERT INTO {$table_name} (user_id, group_id, activity_id, type, date_recorded) VALUES {$values_sql}"; + $sql = "INSERT IGNORE INTO {$table_name} (user_id, group_id, activity_id, type, date_recorded) VALUES {$values_sql}"; return $wpdb->query( $sql ); } diff --git a/tests/testcases/subscription.php b/tests/testcases/subscription.php index 8e4ab7d..60f9f85 100644 --- a/tests/testcases/subscription.php +++ b/tests/testcases/subscription.php @@ -57,4 +57,34 @@ public function test_digest_record_activity() { $this->assertSame( $expected, $queue ); } + + public function test_record_duplicate_activity_should_not_be_allowed() { + $activity_id = 123; + + $activity = array( + 'user_id' => self::$user_ids[0], + 'group_id' => self::$group_ids[0], + 'activity_id' => $activity_id, + 'type' => 'immediate', + 'date_recorded' => date( 'Y-m-d H:i:s', time() - 3600 ), + ); + + // Add the item to the queue. + $add = array( $activity ); + BPGES_Queued_Item::bulk_insert( $add ); + + // Add the same item to the queue with a slightly different date. + $activity['date_recorded'] = date( 'Y-m-d H:i:s' ); + $add = array( $activity ); + BPGES_Queued_Item::bulk_insert( $add ); + + // Fetch queued items for our group. + $sub = new BPGES_Queued_Item_Query( array( + 'group_id' => self::$group_ids[0], + ) ); + $sub = $sub->get_results(); + + // Assert that only 1 item was added to the queued items DB table. + $this->assertSame( 1, count( $sub ) ); + } }