From 9c18634d63e90aeea4827378b61c0ebe6c2d19f6 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Mon, 3 Sep 2018 21:16:09 +0200 Subject: [PATCH] add backend messages support --- composer.lock | 4 +- package.json | 2 +- src/Controller/MessagesController.php | 21 ++++++++ src/Model/Message.php | 52 +++++++++++++++++-- .../ZtmGdansk/ZtmGdanskMessageRepository.php | 43 ++++++++++++++- src/Service/RepositoryParameterConverter.php | 18 ++++--- 6 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 src/Controller/MessagesController.php diff --git a/composer.lock b/composer.lock index 059161b..dc394ae 100644 --- a/composer.lock +++ b/composer.lock @@ -2953,7 +2953,7 @@ "source": { "type": "git", "url": "http://git.kadet.net/kadet/functional-php.git", - "reference": "024d97d46c183df8f3ccaf1f8b4dc73d9cb629ae" + "reference": "f8ea3de9f7f6d2f2427488434d73edd8967b6856" }, "require": { "php": ">=7.1" @@ -2982,7 +2982,7 @@ } ], "description": "Functional library for PHP", - "time": "2018-08-27T16:57:36+00:00" + "time": "2018-09-02T18:26:49+00:00" }, { "name": "symfony/dotenv", diff --git a/package.json b/package.json index e47e04b..ece12a7 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "MIT", "devDependencies": { "webpack": "^4.17.0", - "webpack-cli": "^3.1.0" + "webpack-cli": "^3.1.0", "@fortawesome/fontawesome-svg-core": "^1.2.4", "@fortawesome/pro-light-svg-icons": "^5.3.1", "@fortawesome/pro-regular-svg-icons": "^5.3.1", diff --git a/src/Controller/MessagesController.php b/src/Controller/MessagesController.php new file mode 100644 index 0000000..cd4e0ee --- /dev/null +++ b/src/Controller/MessagesController.php @@ -0,0 +1,21 @@ +json($messages->getAll()); + } +} \ No newline at end of file diff --git a/src/Model/Message.php b/src/Model/Message.php index 2099ada..dd84746 100644 --- a/src/Model/Message.php +++ b/src/Model/Message.php @@ -4,6 +4,8 @@ namespace App\Model; +use Carbon\Carbon; + class Message implements Fillable { use FillTrait; @@ -16,13 +18,25 @@ class Message implements Fillable * Message content. * @var string */ - public $message; + private $message; /** * Message type, see TYPE_* constants - * @var + * @var string */ - public $type = self::TYPE_UNKNOWN; + private $type = self::TYPE_UNKNOWN; + + /** + * Message validity time span start + * @var Carbon|null + */ + private $validFrom; + + /** + * Message validity time span end + * @var Carbon|null + */ + private $validTo; /** * @return string @@ -55,4 +69,36 @@ class Message implements Fillable { $this->type = $type; } + + /** + * @return Carbon|null + */ + public function getValidFrom(): ?Carbon + { + return $this->validFrom; + } + + /** + * @param Carbon|null $validFrom + */ + public function setValidFrom(?Carbon $validFrom): void + { + $this->validFrom = $validFrom; + } + + /** + * @return Carbon|null + */ + public function getValidTo(): ?Carbon + { + return $this->validTo; + } + + /** + * @param Carbon|null $validTo + */ + public function setValidTo(?Carbon $validTo): void + { + $this->validTo = $validTo; + } } \ No newline at end of file diff --git a/src/Provider/ZtmGdansk/ZtmGdanskMessageRepository.php b/src/Provider/ZtmGdansk/ZtmGdanskMessageRepository.php index 9c770e6..a623cb4 100644 --- a/src/Provider/ZtmGdansk/ZtmGdanskMessageRepository.php +++ b/src/Provider/ZtmGdansk/ZtmGdanskMessageRepository.php @@ -4,20 +4,59 @@ namespace App\Provider\ZtmGdansk; +use App\Model\Message; use App\Model\Stop; use App\Provider\MessageRepository; +use Carbon\Carbon; +use Symfony\Component\Cache\Adapter\AdapterInterface; use Tightenco\Collect\Support\Collection; class ZtmGdanskMessageRepository implements MessageRepository { + const MESSAGES_URL = "http://87.98.237.99:88/displayMessages"; + + private $cache; + + /** + * ZtmGdanskStopRepository constructor. + */ + public function __construct(AdapterInterface $cache) + { + $this->cache = $cache; + } public function getAll(): Collection { - return collect(); + return collect($this->queryZtmApi())->unique(function ($message) { + return $message['messagePart1'] . $message['messagePart2']; + })->map(function ($message) { + return Message::createFromArray([ + 'message' => trim($message['messagePart1'] . $message['messagePart2']), + 'type' => Message::TYPE_UNKNOWN, + 'validFrom' => new Carbon($message['startDate']), + 'validTo' => new Carbon($message['endDate']), + ]); + }); } public function getForStop(Stop $stop): Collection { - return collect(); + return $this->getAll(); + } + + private function queryZtmApi() + { + $item = $this->cache->getItem('ztm-gdansk.messages'); + + if (!$item->isHit()) { + $messages = json_decode(file_get_contents(static::MESSAGES_URL), true); + + $item->expiresAfter(60); + $item->set($messages['displaysMsg']); + + $this->cache->save($item); + } + + return $item->get(); } } \ No newline at end of file diff --git a/src/Service/RepositoryParameterConverter.php b/src/Service/RepositoryParameterConverter.php index baf6690..02f8ca9 100644 --- a/src/Service/RepositoryParameterConverter.php +++ b/src/Service/RepositoryParameterConverter.php @@ -7,6 +7,7 @@ namespace App\Service; use App\Exception\NonExistentServiceException; use App\Provider\DepartureRepository; use App\Provider\LineRepository; +use App\Provider\MessageRepository; use App\Provider\StopRepository; use const Kadet\Functional\_; use function Kadet\Functional\any; @@ -54,6 +55,10 @@ class RepositoryParameterConverter implements ParamConverterInterface $request->attributes->set($configuration->getName(), $provider->getDepartureRepository()); break; + case is_a($class, MessageRepository::class, true): + $request->attributes->set($configuration->getName(), $provider->getMessageRepository()); + break; + default: return false; } @@ -66,12 +71,13 @@ class RepositoryParameterConverter implements ParamConverterInterface public function supports(ParamConverter $configuration) { - $instance = curry('is_a', 3)(_, _, true); + $supports = any(array_map(curry('is_a', 3)(_, _, true), [ + StopRepository::class, + LineRepository::class, + DepartureRepository::class, + MessageRepository::class + ])); - return any( - $instance(StopRepository::class), - $instance(LineRepository::class), - $instance(DepartureRepository::class) - )($configuration->getClass()); + return $supports($configuration->getClass()); } } \ No newline at end of file