Sindbad~EG File Manager
<?php
/**
* Audit Log Class
* Tracks all system activities
*/
class AuditLog {
private $db;
public function __construct() {
$this->db = Database::getInstance()->getConnection();
}
/**
* Log an activity
*/
public function log($userId, $action, $module, $recordId = null, $oldValues = null, $newValues = null) {
try {
$stmt = $this->db->prepare("
INSERT INTO audit_logs (user_id, action, module, record_id, old_values, new_values, ip_address, user_agent)
VALUES (:user_id, :action, :module, :record_id, :old_values, :new_values, :ip_address, :user_agent)
");
$stmt->execute([
'user_id' => $userId,
'action' => $action,
'module' => $module,
'record_id' => $recordId,
'old_values' => $oldValues ? json_encode($oldValues) : null,
'new_values' => $newValues ? json_encode($newValues) : null,
'ip_address' => $_SERVER['REMOTE_ADDR'] ?? null,
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null
]);
return true;
} catch (PDOException $e) {
// Fail silently to not disrupt application
error_log("Audit log error: " . $e->getMessage());
return false;
}
}
/**
* Get audit logs with filters
*/
public function getLogs($filters = [], $limit = 100, $offset = 0) {
try {
$sql = "
SELECT al.*, u.username, u.full_name
FROM audit_logs al
LEFT JOIN users u ON al.user_id = u.id
WHERE 1=1
";
$params = [];
if (!empty($filters['user_id'])) {
$sql .= " AND al.user_id = :user_id";
$params['user_id'] = $filters['user_id'];
}
if (!empty($filters['module'])) {
$sql .= " AND al.module = :module";
$params['module'] = $filters['module'];
}
if (!empty($filters['action'])) {
$sql .= " AND al.action = :action";
$params['action'] = $filters['action'];
}
if (!empty($filters['date_from'])) {
$sql .= " AND DATE(al.created_at) >= :date_from";
$params['date_from'] = $filters['date_from'];
}
if (!empty($filters['date_to'])) {
$sql .= " AND DATE(al.created_at) <= :date_to";
$params['date_to'] = $filters['date_to'];
}
$sql .= " ORDER BY al.created_at DESC LIMIT :limit OFFSET :offset";
$stmt = $this->db->prepare($sql);
foreach ($params as $key => $value) {
$stmt->bindValue(':' . $key, $value);
}
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll();
} catch (PDOException $e) {
return [];
}
}
/**
* Get total count of logs
*/
public function getCount($filters = []) {
try {
$sql = "SELECT COUNT(*) as total FROM audit_logs WHERE 1=1";
$params = [];
if (!empty($filters['user_id'])) {
$sql .= " AND user_id = :user_id";
$params['user_id'] = $filters['user_id'];
}
if (!empty($filters['module'])) {
$sql .= " AND module = :module";
$params['module'] = $filters['module'];
}
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetch();
return $result['total'];
} catch (PDOException $e) {
return 0;
}
}
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists