Files
api/services/nginx/app/objects/logs_o.php
T
2025-01-29 14:27:44 +01:00

96 lines
3.8 KiB
PHP

<?php
namespace objects;
use classes\db;
use classes\object_property;
use traits\db_object_t;
class logs_o extends db
{
use db_object_t;
public object_property $module;
public object_property $department;
public object_property $type;
public object_property $user_id;
public object_property $action;
public object_property $message;
public function structure(): void
{
$this->setTable('logs');
}
public function add(string $module, string $department, int $type, int $user_id, string $action, string $message): void
{
// Add to the cache instead of the database, to make it faster
redis->add_log($module, $department, $type, $user_id, $action, $message);
}
public function getObjectProperties(): void
{
$this->module = new object_property($this->table, $this->id, 'module', 'string', true);
$this->department = new object_property($this->table, $this->id, 'department', 'string', false);
$this->type = new object_property($this->table, $this->id, 'type', 'int', true);
$this->user_id = new object_property($this->table, $this->id, 'user_id', 'int', false);
$this->action = new object_property($this->table, $this->id, 'action', 'string', true);
$this->message = new object_property($this->table, $this->id, 'message', 'string', false);
}
public function syncLogsToDatabase($display_progress = false): void
{
function progress($display_progress, $message): void
{
if ($display_progress) {
echo "\n\033[33m$message\033[0m\n";
}
}
function progress_bar($display_progress, int $current, int $total): void
{
// Calculate the percentage
$percentage = ($current / $total) * 100;
// Round the percentage
$percentage = round($percentage);
// Display the progress bar
if ($display_progress) {
echo "\r\033[33m" . str_repeat('=', $percentage) . str_repeat(' ', 100 - $percentage) . "\033[0m " . number_format($percentage, 2) . '%';
}
// Show the percentage, completed and total
if ($display_progress) {
echo "\r\033[33m" . number_format($percentage, 2) . '% (' . $current . '/' . $total . ")\033[0m";
// If the current is equal to the total, add a new line
if ($current === $total) {
echo "\n";
}
}
}
global /** @var db $db */
$db;
// Get all logs from the cache
progress($display_progress, 'Counting logs in cache');
$total = redis->get_log_count();
progress($display_progress, 'Downloading ' . $total . ' logs from cache');
$logs = redis->get_logs();
progress($display_progress, 'Retrieved ' . count($logs) . ' logs from cache');
$current = 0;
// Insert the logs into the database
if ($logs) {
progress($display_progress, 'Preparing to insert logs into the database');
$stmt = $db->prepare("INSERT INTO $this->table (module, department, type, user_id, action, message, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
progress($display_progress, 'Inserting logs into the database');
foreach ( $logs as $log ) {
$current++;
$timestamp = date('Y-m-d H:i:s', $log['timestamp']);
$stmt->bind_param('ssiiisss', $log['module'], $log['department'], $log['type'], $log['user_id'], $log['action'], $log['message'], $timestamp, $timestamp);
$stmt->execute();
// Remove the log from the cache
redis->delete('log_' . $log['id']);
progress_bar($display_progress, $current, $total);
}
$stmt->close();
}
}
}