96 lines
2.4 KiB
PHP
96 lines
2.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
|
|
|
|
header('Content-Type: application/json');
|
|
$door = new pvv\side\Door($pdo);
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
|
|
[$type, $data] = explode(' ', $_SERVER['HTTP_AUTHORIZATION'], 2);
|
|
if (strcasecmp($type, 'Bearer') == 0) {
|
|
if (hash_equals($data, $DOOR_SECRET)) {
|
|
handleSetState();
|
|
} else {
|
|
echo '{"status": "error", "message": "Invalid authentication key"}';
|
|
exit;
|
|
}
|
|
} else {
|
|
echo '{"status": "error", "message": "Invalid authentication method"}';
|
|
exit;
|
|
}
|
|
} else {
|
|
echo '{"status": "error", "message": "Missing authentication"}';
|
|
exit;
|
|
}
|
|
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
|
|
if (isset($_GET['period'])) {
|
|
$period = (string) htmlspecialchars($_GET['period']);
|
|
|
|
if ($period == 'day') {
|
|
$startTime = time() - (60 * 60 * 24);
|
|
} elseif ($period == 'week') {
|
|
$startTime = time() - (60 * 60 * 24 * 7);
|
|
} else {
|
|
echo '{"status": "error", "message": "Invalid period"}';
|
|
exit;
|
|
}
|
|
|
|
$lines = $door->getEntriesAfter($startTime);
|
|
if (isset($_GET['edgeonly']) && (bool) htmlspecialchars($_GET['edgeonly'])) {
|
|
// Ignore repeats
|
|
$lines = getChanges($lines);
|
|
}
|
|
|
|
echo json_encode([
|
|
'status' => 'OK',
|
|
'entries' => $lines,
|
|
]);
|
|
} else {
|
|
// Only last entry
|
|
$line = (object) $door->getCurrent();
|
|
echo json_encode([
|
|
'status' => 'OK',
|
|
'time' => $line->time,
|
|
'open' => $line->open,
|
|
]);
|
|
}
|
|
}
|
|
|
|
|
|
function handleSetState(): void {
|
|
global $door;
|
|
|
|
$jsonobj = file_get_contents('php://input');
|
|
$event = json_decode($jsonobj);
|
|
|
|
if ((!isset($event->time)) || (!is_numeric($event->time))) {
|
|
echo '{"status": "error", "message": "Invalid timestamp"}';
|
|
exit;
|
|
}
|
|
if ((!isset($event->isDoorOpen)) || (!is_bool($event->isDoorOpen))) {
|
|
echo '{"status": "error", "message": "Invalid door state"}';
|
|
exit;
|
|
}
|
|
|
|
$door->createEvent((int) $event->time, $event->isDoorOpen ? 1 : 0);
|
|
echo '{"status": "OK"}';
|
|
}
|
|
|
|
function getChanges($items) {
|
|
$prevState = 2;
|
|
$res = [];
|
|
|
|
foreach ($items as $item) {
|
|
if ($item['open'] !== $prevState) {
|
|
$res[] = $item;
|
|
$prevState = $item['open'];
|
|
}
|
|
}
|
|
|
|
return $res;
|
|
}
|