defineTable(); } private function defineTable():void { $table = CustomTable::for('notifications_preferences'); $table->setColumns([ 'id' => 'bigint(20) unsigned NOT NULL AUTO_INCREMENT', 'user_id' => "{$table->getUserIDType()} NOT NULL", 'item_id' => 'bigint(20) NOT NULL', 'item_type' => 'varchar(50) NOT NULL', 'frequency' => "ENUM('never', 'daily', 'weekly', 'monthly') DEFAULT 'never'", 'last_sent' => 'datetime DEFAULT NULL', 'created_at' => 'datetime DEFAULT CURRENT_TIMESTAMP', 'updated_at' => 'datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' ]); $table->setKeys([ ['key' => 'PRIMARY', 'value' => '(`id`)'], ['key' => 'UNIQUE', 'value' => '`user_type` (`user_id`, `item_id`)'], '`user_frequency` (`user_id`, `frequency`)', '`frequency_lookup` (`frequency`, `last_sent`)' ]); $base = BASE; $table->setConstraints([ "CONSTRAINT `{$base}notification_pref_user` FOREIGN KEY (`user_id`) REFERENCES `{$table->getUserTable()}` (`ID`) ON DELETE CASCADE" ]); $table->defineTable(); $this->preferences = $table; } public function getUsersByFrequency(string $frequency):array { if (!in_array($frequency, ['never', 'daily', 'weekly', 'monthly'])) { return []; } return array_unique($this->preferences->pluck('user_id', ['frequency' => $frequency])); } public function getUserSubscriptions(int $userID, string $frequency):array { if (!in_array($frequency, ['never', 'daily', 'weekly', 'monthly'])) { return []; } return $this->preferences->getMany([ 'user_id' => $userID, 'frequency' => $frequency ]); } public function addUserPreference(int $userID, int $item_id, string $item_type, string $frequency):bool { if (!in_array($frequency, ['never', 'daily', 'weekly', 'monthly'])) { return false; } $user = get_userdata($userID); if (!$user || is_wp_error($user)) { return false; } $registrar = Registrar::getInstance($item_type); if (!$registrar) { return false; } $type = $registrar->getType(); switch ($type) { case 'term': $term = get_term($item_id, $registrar->getBased()); if (!$term || is_wp_error($term)) { return false; } break; case 'user': $user = get_userdata($item_id); if (!$user || is_wp_error($user)) { return false; } break; } return $this->preferences->findOrCreate( [ 'user_id' => $userID, 'item_id' => $item_id, 'item_type' => $item_type ], [ 'frequency' => $frequency ] ); } public function deleteUserPreference(int $userID, int $item_id, string $item_type):bool { $hasRecord = $this->preferences->get(['user_id' => $userID, 'item_id' => $item_id, 'item_type' => $item_type]); if (!$hasRecord) { return false; } return $this->preferences->delete([ 'user_id' => $userID, 'item_id' => $item_id, 'item_type' => $item_type ]); } }