Add caching layer and database helper

- Add CacheHelper for file-based caching with TTL support
- Add Database helper for centralized connection management
- Update WorkflowModel to cache status transitions (10 min TTL)
- Update UserPreferencesModel to cache user prefs (5 min TTL)
- Update manage_workflows.php to clear cache on changes
- Update get_users.php to use Database helper (example migration)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 10:53:26 -05:00
parent 1101558fca
commit d2a8c73e2c
6 changed files with 504 additions and 91 deletions

View File

@@ -1,35 +1,41 @@
<?php
/**
* UserPreferencesModel
* Handles user-specific preferences and settings
* Handles user-specific preferences and settings with caching
*/
require_once dirname(__DIR__) . '/helpers/CacheHelper.php';
class UserPreferencesModel {
private $conn;
private static $CACHE_PREFIX = 'user_prefs';
private static $CACHE_TTL = 300; // 5 minutes
public function __construct($conn) {
$this->conn = $conn;
}
/**
* Get all preferences for a user
* 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($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();
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'];
}
return $prefs;
$prefs = [];
while ($row = $result->fetch_assoc()) {
$prefs[$row['preference_key']] = $row['preference_value'];
}
$stmt->close();
return $prefs;
}, self::$CACHE_TTL);
}
/**
@@ -45,7 +51,15 @@ class UserPreferencesModel {
ON DUPLICATE KEY UPDATE preference_value = VALUES(preference_value)";
$stmt = $this->conn->prepare($sql);
$stmt->bind_param("iss", $userId, $key, $value);
return $stmt->execute();
$result = $stmt->execute();
$stmt->close();
// Invalidate cache for this user
if ($result) {
CacheHelper::delete(self::$CACHE_PREFIX, $userId);
}
return $result;
}
/**
@@ -56,17 +70,8 @@ class UserPreferencesModel {
* @return mixed Preference value or default
*/
public function getPreference($userId, $key, $default = null) {
$sql = "SELECT preference_value FROM user_preferences
WHERE user_id = ? AND preference_key = ?";
$stmt = $this->conn->prepare($sql);
$stmt->bind_param("is", $userId, $key);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
return $row['preference_value'];
}
return $default;
$prefs = $this->getUserPreferences($userId);
return $prefs[$key] ?? $default;
}
/**
@@ -80,7 +85,15 @@ class UserPreferencesModel {
WHERE user_id = ? AND preference_key = ?";
$stmt = $this->conn->prepare($sql);
$stmt->bind_param("is", $userId, $key);
return $stmt->execute();
$result = $stmt->execute();
$stmt->close();
// Invalidate cache for this user
if ($result) {
CacheHelper::delete(self::$CACHE_PREFIX, $userId);
}
return $result;
}
/**
@@ -92,7 +105,21 @@ class UserPreferencesModel {
$sql = "DELETE FROM user_preferences WHERE user_id = ?";
$stmt = $this->conn->prepare($sql);
$stmt->bind_param("i", $userId);
return $stmt->execute();
$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() {
CacheHelper::delete(self::$CACHE_PREFIX);
}
}
?>