136 lines
3.9 KiB
PHP
136 lines
3.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* UserPreferencesModel
|
|
* Handles user-specific preferences and settings with caching
|
|
*/
|
|
|
|
require_once dirname(__DIR__) . '/helpers/CacheHelper.php';
|
|
|
|
class UserPreferencesModel
|
|
{
|
|
private mysqli $conn;
|
|
private static string $CACHE_PREFIX = 'user_prefs';
|
|
private static int $CACHE_TTL = 300; // 5 minutes
|
|
|
|
public function __construct(mysqli $conn)
|
|
{
|
|
$this->conn = $conn;
|
|
}
|
|
|
|
/**
|
|
* Get all preferences for a user (with caching)
|
|
* @param int $userId User ID
|
|
* @return array Associative array of preference_key => preference_value
|
|
*/
|
|
public function getUserPreferences(int $userId): array
|
|
{
|
|
return CacheHelper::remember(self::$CACHE_PREFIX, $userId, function () use ($userId) {
|
|
$sql = "SELECT preference_key, preference_value
|
|
FROM user_preferences
|
|
WHERE user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("i", $userId);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
$prefs = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$prefs[$row['preference_key']] = $row['preference_value'];
|
|
}
|
|
$stmt->close();
|
|
return $prefs;
|
|
}, self::$CACHE_TTL);
|
|
}
|
|
|
|
/**
|
|
* Set or update a preference for a user
|
|
* @param int $userId User ID
|
|
* @param string $key Preference key
|
|
* @param string $value Preference value
|
|
* @return bool Success status
|
|
*/
|
|
public function setPreference(int $userId, string $key, string $value): bool
|
|
{
|
|
$sql = "INSERT INTO user_preferences (user_id, preference_key, preference_value)
|
|
VALUES (?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE preference_value = VALUES(preference_value)";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("iss", $userId, $key, $value);
|
|
$result = $stmt->execute();
|
|
$stmt->close();
|
|
|
|
// Invalidate cache for this user
|
|
if ($result) {
|
|
CacheHelper::delete(self::$CACHE_PREFIX, $userId);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get a single preference value for a user
|
|
* @param int $userId User ID
|
|
* @param string $key Preference key
|
|
* @param mixed $default Default value if preference doesn't exist
|
|
* @return mixed Preference value or default
|
|
*/
|
|
public function getPreference(int $userId, string $key, $default = null)
|
|
{
|
|
$prefs = $this->getUserPreferences($userId);
|
|
return $prefs[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* Delete a preference for a user
|
|
* @param int $userId User ID
|
|
* @param string $key Preference key
|
|
* @return bool Success status
|
|
*/
|
|
public function deletePreference(int $userId, string $key): bool
|
|
{
|
|
$sql = "DELETE FROM user_preferences
|
|
WHERE user_id = ? AND preference_key = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("is", $userId, $key);
|
|
$result = $stmt->execute();
|
|
$stmt->close();
|
|
|
|
// Invalidate cache for this user
|
|
if ($result) {
|
|
CacheHelper::delete(self::$CACHE_PREFIX, $userId);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Delete all preferences for a user
|
|
* @param int $userId User ID
|
|
* @return bool Success status
|
|
*/
|
|
public function deleteAllPreferences(int $userId): bool
|
|
{
|
|
$sql = "DELETE FROM user_preferences WHERE user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("i", $userId);
|
|
$result = $stmt->execute();
|
|
$stmt->close();
|
|
|
|
// Invalidate cache for this user
|
|
if ($result) {
|
|
CacheHelper::delete(self::$CACHE_PREFIX, $userId);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Clear all user preferences cache
|
|
*/
|
|
public static function clearCache(): void
|
|
{
|
|
CacheHelper::delete(self::$CACHE_PREFIX);
|
|
}
|
|
}
|