190 lines
6.1 KiB
PHP
190 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* SavedFiltersModel
|
|
* Handles saving, loading, and managing user's custom search filters
|
|
*/
|
|
class SavedFiltersModel {
|
|
private $conn;
|
|
|
|
public function __construct($conn) {
|
|
$this->conn = $conn;
|
|
}
|
|
|
|
/**
|
|
* Get all saved filters for a user
|
|
*/
|
|
public function getUserFilters($userId) {
|
|
$sql = "SELECT filter_id, filter_name, filter_criteria, is_default, created_at, updated_at
|
|
FROM saved_filters
|
|
WHERE user_id = ?
|
|
ORDER BY is_default DESC, filter_name ASC";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("i", $userId);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
$filters = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$row['filter_criteria'] = json_decode($row['filter_criteria'], true);
|
|
$filters[] = $row;
|
|
}
|
|
return $filters;
|
|
}
|
|
|
|
/**
|
|
* Get a specific saved filter
|
|
*/
|
|
public function getFilter($filterId, $userId) {
|
|
$sql = "SELECT filter_id, filter_name, filter_criteria, is_default
|
|
FROM saved_filters
|
|
WHERE filter_id = ? AND user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("ii", $filterId, $userId);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
if ($row = $result->fetch_assoc()) {
|
|
$row['filter_criteria'] = json_decode($row['filter_criteria'], true);
|
|
return $row;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Save a new filter
|
|
*/
|
|
public function saveFilter($userId, $filterName, $filterCriteria, $isDefault = false) {
|
|
// If this is set as default, unset all other defaults for this user
|
|
if ($isDefault) {
|
|
$this->clearDefaultFilters($userId);
|
|
}
|
|
|
|
$sql = "INSERT INTO saved_filters (user_id, filter_name, filter_criteria, is_default)
|
|
VALUES (?, ?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE
|
|
filter_criteria = VALUES(filter_criteria),
|
|
is_default = VALUES(is_default),
|
|
updated_at = CURRENT_TIMESTAMP";
|
|
|
|
$stmt = $this->conn->prepare($sql);
|
|
$criteriaJson = json_encode($filterCriteria);
|
|
$stmt->bind_param("issi", $userId, $filterName, $criteriaJson, $isDefault);
|
|
|
|
if ($stmt->execute()) {
|
|
return [
|
|
'success' => true,
|
|
'filter_id' => $stmt->insert_id ?: $this->getFilterIdByName($userId, $filterName)
|
|
];
|
|
}
|
|
return ['success' => false, 'error' => $this->conn->error];
|
|
}
|
|
|
|
/**
|
|
* Update an existing filter
|
|
*/
|
|
public function updateFilter($filterId, $userId, $filterName, $filterCriteria, $isDefault = false) {
|
|
// Verify ownership
|
|
$existing = $this->getFilter($filterId, $userId);
|
|
if (!$existing) {
|
|
return ['success' => false, 'error' => 'Filter not found'];
|
|
}
|
|
|
|
// If this is set as default, unset all other defaults for this user
|
|
if ($isDefault) {
|
|
$this->clearDefaultFilters($userId);
|
|
}
|
|
|
|
$sql = "UPDATE saved_filters
|
|
SET filter_name = ?, filter_criteria = ?, is_default = ?, updated_at = CURRENT_TIMESTAMP
|
|
WHERE filter_id = ? AND user_id = ?";
|
|
|
|
$stmt = $this->conn->prepare($sql);
|
|
$criteriaJson = json_encode($filterCriteria);
|
|
$stmt->bind_param("ssiii", $filterName, $criteriaJson, $isDefault, $filterId, $userId);
|
|
|
|
if ($stmt->execute()) {
|
|
return ['success' => true];
|
|
}
|
|
return ['success' => false, 'error' => $this->conn->error];
|
|
}
|
|
|
|
/**
|
|
* Delete a saved filter
|
|
*/
|
|
public function deleteFilter($filterId, $userId) {
|
|
$sql = "DELETE FROM saved_filters WHERE filter_id = ? AND user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("ii", $filterId, $userId);
|
|
|
|
if ($stmt->execute() && $stmt->affected_rows > 0) {
|
|
return ['success' => true];
|
|
}
|
|
return ['success' => false, 'error' => 'Filter not found'];
|
|
}
|
|
|
|
/**
|
|
* Set a filter as default
|
|
*/
|
|
public function setDefaultFilter($filterId, $userId) {
|
|
// First, clear all defaults
|
|
$this->clearDefaultFilters($userId);
|
|
|
|
// Then set this one as default
|
|
$sql = "UPDATE saved_filters SET is_default = 1 WHERE filter_id = ? AND user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("ii", $filterId, $userId);
|
|
|
|
if ($stmt->execute()) {
|
|
return ['success' => true];
|
|
}
|
|
return ['success' => false, 'error' => $this->conn->error];
|
|
}
|
|
|
|
/**
|
|
* Get the default filter for a user
|
|
*/
|
|
public function getDefaultFilter($userId) {
|
|
$sql = "SELECT filter_id, filter_name, filter_criteria
|
|
FROM saved_filters
|
|
WHERE user_id = ? AND is_default = 1
|
|
LIMIT 1";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("i", $userId);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
if ($row = $result->fetch_assoc()) {
|
|
$row['filter_criteria'] = json_decode($row['filter_criteria'], true);
|
|
return $row;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Clear all default filters for a user (helper method)
|
|
*/
|
|
private function clearDefaultFilters($userId) {
|
|
$sql = "UPDATE saved_filters SET is_default = 0 WHERE user_id = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("i", $userId);
|
|
$stmt->execute();
|
|
}
|
|
|
|
/**
|
|
* Get filter ID by name (helper method)
|
|
*/
|
|
private function getFilterIdByName($userId, $filterName) {
|
|
$sql = "SELECT filter_id FROM saved_filters WHERE user_id = ? AND filter_name = ?";
|
|
$stmt = $this->conn->prepare($sql);
|
|
$stmt->bind_param("is", $userId, $filterName);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
if ($row = $result->fetch_assoc()) {
|
|
return $row['filter_id'];
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
?>
|