From e3f7305efdb9f0e9dd1d3eea0d0d6a57d6a9d0fd Mon Sep 17 00:00:00 2001 From: "Tomas Palider (DJTommek)" Date: Tue, 17 May 2022 21:22:23 +0200 Subject: [PATCH] #90 Live location API: added methods for sending quick preformatted API responses --- .../ChatLiveLocationPresenter.php | 65 +++++++++---------- src/libs/Web/MainPresenter.php | 18 +++++ 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/libs/Web/ChatLiveLocation/ChatLiveLocationPresenter.php b/src/libs/Web/ChatLiveLocation/ChatLiveLocationPresenter.php index c5038838..c4cd72f3 100644 --- a/src/libs/Web/ChatLiveLocation/ChatLiveLocationPresenter.php +++ b/src/libs/Web/ChatLiveLocation/ChatLiveLocationPresenter.php @@ -2,13 +2,11 @@ namespace App\Web\ChatLiveLocation; -use App\Config; use App\TelegramCustomWrapper\Events\Special\LocationEvent; use App\TelegramUpdateDb; use App\Utils\General; use App\Utils\Strict; use App\Web\MainPresenter; -use Nette\Utils\Json; use unreal4u\TelegramAPI\Telegram; class ChatLiveLocationPresenter extends MainPresenter @@ -18,42 +16,39 @@ public function action() { $result = new \stdClass(); $result->locations = []; - if (Strict::isInt($_GET['telegramId'] ?? null)) { - $chatTelegramId = Strict::intval($_GET['telegramId'] ?? null); - $updates = TelegramUpdateDb::findByChatId($chatTelegramId); + if (Strict::isInt($_GET['telegramId'] ?? false) === false) { + $this->apiError('Invalid or missing Telegram chat ID'); + } + $chatTelegramId = Strict::intval($_GET['telegramId']); + $updates = TelegramUpdateDb::findByChatId($chatTelegramId); + + foreach ($updates as $update) { + $locationEvent = new LocationEvent($update->getOriginalUpdateObject()); + $locations = $locationEvent->getCollection(); + if (in_array(General::globalGetToBool('address'), [true, null], true)) { // if not set, default is true + $locations->fillAddresses(); + } + if (General::globalGetToBool('datetimezone') === true) { + $locations->fillDatetimeZone(); + } + if (General::globalGetToBool('elevation') === true) { + $locations->fillElevations(); + } + foreach ($locations as $location) { + $responseLocation = new \stdClass(); + $responseLocation->telegram_id = $locationEvent->getFromId(); + $responseLocation->telegram_displayname = $locationEvent->getFromDisplayname(); + $responseLocation->lat = $location->getLat(); + $responseLocation->lon = $location->getLon(); + $responseLocation->elevation = $location->getCoordinates()->getElevation(); + $responseLocation->address = $location->getAddress(); + $responseLocation->timezone = $location->getTimezoneData(); + $responseLocation->lastUpdate = $update->getLastUpdate()->getTimestamp(); + $result->locations[] = $responseLocation; - foreach ($updates as $update) { - $locationEvent = new LocationEvent($update->getOriginalUpdateObject()); - $locations = $locationEvent->getCollection(); - if (in_array(General::globalGetToBool('address'), [true, null], true)) { // if not set, default is true - $locations->fillAddresses(); - } - if (General::globalGetToBool('datetimezone') === true) { - $locations->fillDatetimeZone(); - } - if (General::globalGetToBool('elevation') === true) { - $locations->fillElevations(); - } - foreach ($locations as $location) { - $responseLocation = new \stdClass(); -// $update->getChatId(); - $responseLocation->telegram_id = $locationEvent->getFromId(); - $responseLocation->telegram_displayname = $locationEvent->getFromDisplayname(); - $responseLocation->lat = $location->getLat(); - $responseLocation->lon = $location->getLon(); - $responseLocation->elevation = $location->getCoordinates()->getElevation(); - $responseLocation->address = $location->getAddress(); - $responseLocation->timezone = $location->getTimezoneData(); - $responseLocation->lastUpdate = $update->getLastUpdate()->format(Config::DATETIME_FORMAT_ZONE); - $result->locations[] = $responseLocation; - } } - } else { - die('no valid telegramId'); } - header('Content-Type: application/json'); - header('Access-Control-Allow-Origin: *'); - die(Json::encode($result, JSON_PRETTY_PRINT)); + $this->apiResponse($result); } } diff --git a/src/libs/Web/MainPresenter.php b/src/libs/Web/MainPresenter.php index c6c20c21..c6b86b41 100644 --- a/src/libs/Web/MainPresenter.php +++ b/src/libs/Web/MainPresenter.php @@ -8,6 +8,7 @@ use App\User; use App\Utils\Strict; use App\Web\Login\LoginFacade; +use Nette\Utils\Json; use Nette\Utils\Strings; abstract class MainPresenter @@ -99,5 +100,22 @@ public final function getFlashMessages(): \Generator unset($_SESSION['FLASH_MESSAGES'][$key]); } } + + public function apiResponse(\stdClass|array $result, string $message = '', bool $error = false): void + { + header('Content-Type: application/json'); + header('Access-Control-Allow-Origin: *'); + die(Json::encode([ + 'datetime' => time(), + 'error' => $error, + 'message' => $message, + 'result' => $result, + ], JSON_PRETTY_PRINT)); + } + + public function apiError(string $message = ''): void + { + $this->apiResponse([], $message, true); + } }