From 1766cc23d65e30fe8197f1736afe839de609480e Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 13 Jan 2026 09:27:28 +0900 Subject: [PATCH] door: return datetime objects for core functions --- src/pvv/side/door.php | 20 ++++++++++++-------- www/door/index.php | 9 +++++++-- www/index.php | 4 ++-- www/spaceapi.php | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/pvv/side/door.php b/src/pvv/side/door.php index c4282b1..eb79f89 100644 --- a/src/pvv/side/door.php +++ b/src/pvv/side/door.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace pvv\side; +use DateTimeImmutable; + class Door { private $pdo; @@ -14,7 +16,7 @@ class Door { } /** - * @return array{time: int, open: bool}[] + * @return array{time: DateTimeImmutable, open: bool}[] */ public function getAll(): array { $query = 'SELECT time, open FROM door ORDER BY time DESC'; @@ -24,7 +26,7 @@ class Door { $doorEvents = []; foreach ($statement->fetchAll() as $row) { $doorEvents[] = [ - 'time' => (int) $row['time'], + 'time' => (new DateTimeImmutable)->setTimestamp((int) $row['time']), 'open' => (bool) $row['open'], ]; } @@ -33,19 +35,21 @@ class Door { } /** - * @return array{time: int, open: bool}[] + * @return array{time: DateTimeImmutable, open: bool}[] */ public function getEntriesAfter(\DateTimeImmutable $startTime): array { + $timestamp = $startTime->getTimestamp(); + $query = 'SELECT time, open FROM door WHERE time > :startTime ORDER BY time DESC'; $statement = $this->pdo->prepare($query); - $statement->bindParam(':startTime', $startTime->getTimestamp(), \PDO::PARAM_INT); + $statement->bindParam(':startTime', $timestamp, \PDO::PARAM_INT); $statement->execute(); $doorEvents = []; foreach ($statement->fetchAll() as $row) { $doorEvents[] = [ - 'time' => (int) $row['time'], + 'time' => (new DateTimeImmutable)->setTimestamp((int) $row['time']), 'open' => (bool) $row['open'], ]; } @@ -54,7 +58,7 @@ class Door { } /** - * @return array{time: int, open: bool} + * @return array{time: DateTimeImmutable, open: bool} */ public function getCurrent(): array { $query = 'SELECT time, open FROM door ORDER BY time DESC LIMIT 1'; @@ -63,7 +67,7 @@ class Door { $row = $statement->fetch(); return [ - 'time' => (int) $row['time'], + 'time' => (new DateTimeImmutable)->setTimestamp((int) $row['time']), 'open' => (bool) $row['open'], ]; } @@ -72,7 +76,7 @@ class Door { $firstValidTime = time() - 60 * 60 * 24 * self::DAYS_OF_DOOR_HISTORY; $query = 'DELETE FROM door WHERE time < :firstValid'; $statement = $this->pdo->prepare($query); - $statement->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_STR); + $statement->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_INT); $statement->execute(); } diff --git a/www/door/index.php b/www/door/index.php index e0f0599..a50ebfa 100644 --- a/www/door/index.php +++ b/www/door/index.php @@ -51,14 +51,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { echo json_encode([ 'status' => 'OK', - 'entries' => $lines, + 'entries' => array_map(function ($line) { + return [ + 'time' => $line['time']->getTimestamp(), + 'open' => $line['open'], + ]; + }, $lines), ]); } else { // Only last entry $line = (object) $door->getCurrent(); echo json_encode([ 'status' => 'OK', - 'time' => $line->time, + 'time' => $line->time->getTimestamp(), 'open' => $line->open, ]); } diff --git a/www/index.php b/www/index.php index 74b6302..507ae53 100644 --- a/www/index.php +++ b/www/index.php @@ -10,7 +10,7 @@ $motd = $motdfetcher->getMOTD(); $door = new pvv\side\Door($pdo); $doorEntry = (object) $door->getCurrent(); -if ($doorEntry->time < (time() - 60 * 30)) { +if ($doorEntry->time->getTimestamp() < (time() - 60 * 30)) { $doorStateText = 'Ingen data fra dørsensor'; } else { if ($doorEntry->open) { @@ -19,7 +19,7 @@ if ($doorEntry->time < (time() - 60 * 30)) { $doorStateText = 'Døren er ikke åpen'; } } -$doorTime = date('H:i', $doorEntry->time); +$doorTime = $doorEntry->time->format('H:i'); ?> diff --git a/www/spaceapi.php b/www/spaceapi.php index 6668240..aae76b5 100644 --- a/www/spaceapi.php +++ b/www/spaceapi.php @@ -36,7 +36,7 @@ $doorEntry = (object) $door->getCurrent(); "issue_report_channels": ["email"], "state": { "open": open ? 'true' : 'false'; ?>, - "lastchange": time ? $doorEntry->time : 0; ?>, + "lastchange": time->getTimestamp(); ?>, "message": "open ? 'open for public, members are present' : 'closed'; ?>" }, "feeds": {