<?php
|
namespace JVBase\managers\Notifications;
|
|
use JVBase\managers\CustomTable;
|
use JVBase\registrar\Registrar;
|
|
if (!defined('ABSPATH')) {
|
exit; // Exit if accessed directly
|
}
|
/**
|
* Preferences
|
* Manages preferences for a user's favourites
|
**/
|
class Preferences
|
{
|
protected CustomTable $preferences;
|
public function __construct()
|
{
|
$this->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
|
]);
|
}
|
}
|