Files
2026-10-23 11:14:24 +00:00

50 lines
1.6 KiB
PHP

<?php
/**
* staff/session_ping.php
*
* Wird vom Frontend per fetch() aufgerufen wenn der Nutzer aktiv ist.
* Aktualisiert staff_last_activity und gibt die verbleibende Zeit zurück.
*/
require_once __DIR__ . '/../includes/bootstrap.php';
header('Content-Type: application/json');
// Nur POST erlauben (Ausnahme: GET ?check=1 fragt nur die Restzeit ab, ohne die Sitzung zu verlängern)
$checkOnly = ($_GET['check'] ?? '') === '1' && $_SERVER['REQUEST_METHOD'] === 'GET';
if ($_SERVER['REQUEST_METHOD'] !== 'POST' && !$checkOnly) {
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
exit;
}
// Muss eingeloggt sein
if (empty($_SESSION['staff_id'])) {
http_response_code(401);
echo json_encode(['error' => 'Nicht eingeloggt', 'remaining' => 0]);
exit;
}
$timeout = (int)(get_setting('staff_session_timeout', '30') ?: 30);
$last = $_SESSION['staff_last_activity'] ?? 0;
$elapsed = time() - $last;
// Abgelaufen? Dann nicht mehr verlängern
if ($last && $elapsed > ($timeout * 60)) {
http_response_code(401);
echo json_encode(['error' => 'Session abgelaufen', 'remaining' => 0]);
exit;
}
// Nur Restzeit abfragen (andere Tabs und Hintergrund-Abfragen verlängern nichts)
if ($checkOnly) {
echo json_encode(['ok' => true, 'remaining' => max(0, (int) ($timeout * 60 - $elapsed))]);
exit;
}
// Aktivität erneuern (dieser Ping kommt nur bei echten Klicks, Tipps und Mausbewegungen)
$_SESSION['staff_last_activity'] = time();
staff_touch_activity(get_db(), (int) $_SESSION['staff_id']);
$remaining = $timeout * 60;
echo json_encode(['ok' => true, 'remaining' => $remaining]);