diff --git a/src/Entity/ProviderEntity.php b/src/Entity/ProviderEntity.php
index 97a997c..1fe6af8 100644
--- a/src/Entity/ProviderEntity.php
+++ b/src/Entity/ProviderEntity.php
@@ -5,6 +5,7 @@ namespace App\Entity;
use App\Model\Fillable;
use App\Model\FillTrait;
use App\Model\Referable;
+use Carbon\Carbon;
use Doctrine\ORM\Mapping as ORM;
/**
@@ -29,6 +30,21 @@ class ProviderEntity implements Fillable, Referable
*/
private $class;
+ /**
+ * Time and date of last data update
+ *
+ * @ORM\Column(type="datetime", nullable=false)
+ */
+ private $updateDate;
+
+ /**
+ * ProviderEntity constructor.
+ */
+ public function __construct()
+ {
+ $this->updateDate = Carbon::now();
+ }
+
public function getName()
{
return $this->name;
@@ -48,4 +64,12 @@ class ProviderEntity implements Fillable, Referable
{
$this->class = $class;
}
+
+ /**
+ * @return Carbon
+ */
+ public function getUpdateDate()
+ {
+ return Carbon::instance($this->updateDate);
+ }
}
\ No newline at end of file
diff --git a/src/Migrations/Version20181027124203.php b/src/Migrations/Version20181027124203.php
new file mode 100644
index 0000000..25481f8
--- /dev/null
+++ b/src/Migrations/Version20181027124203.php
@@ -0,0 +1,36 @@
+abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
+
+ $this->addSql('CREATE TEMPORARY TABLE __temp__provider AS SELECT id, name, class FROM provider');
+ $this->addSql('DROP TABLE provider');
+ $this->addSql('CREATE TABLE provider (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, class VARCHAR(255) NOT NULL, update_date DATETIME NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY(id))');
+ $this->addSql('INSERT INTO provider (id, name, class) SELECT id, name, class FROM __temp__provider');
+ $this->addSql('DROP TABLE __temp__provider');
+ }
+
+ public function down(Schema $schema) : void
+ {
+ // this down() migration is auto-generated, please modify it to your needs
+ $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
+
+ $this->addSql('CREATE TEMPORARY TABLE __temp__provider AS SELECT id, name, class FROM provider');
+ $this->addSql('DROP TABLE provider');
+ $this->addSql('CREATE TABLE provider (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, class VARCHAR(255) NOT NULL, PRIMARY KEY(id))');
+ $this->addSql('INSERT INTO provider (id, name, class) SELECT id, name, class FROM __temp__provider');
+ $this->addSql('DROP TABLE __temp__provider');
+ }
+}
diff --git a/src/Model/FillTrait.php b/src/Model/FillTrait.php
index 8edae3a..f308765 100644
--- a/src/Model/FillTrait.php
+++ b/src/Model/FillTrait.php
@@ -23,9 +23,13 @@ trait FillTrait
public static function createFromArray(array $vars = [], ...$args)
{
- $object = empty($args)
- ? (new \ReflectionClass(static::class))->newInstanceWithoutConstructor()
- : new static(...$args);
+ $reflection = new \ReflectionClass(static::class);
+ $constructor = $reflection->getConstructor();
+
+
+ $object = empty($args) && ($constructor && $constructor->getNumberOfRequiredParameters() > 0)
+ ? $reflection->newInstanceWithoutConstructor()
+ : $reflection->newInstanceArgs($args);
$object->fill($vars);
diff --git a/src/Provider/Dummy/DummyProvider.php b/src/Provider/Dummy/DummyProvider.php
index eb88b36..0a996da 100644
--- a/src/Provider/Dummy/DummyProvider.php
+++ b/src/Provider/Dummy/DummyProvider.php
@@ -9,6 +9,7 @@ use App\Provider\MessageRepository;
use App\Provider\Provider;
use App\Provider\StopRepository;
use App\Provider\TrackRepository;
+use Carbon\Carbon;
class DummyProvider implements Provider
{
@@ -70,4 +71,9 @@ class DummyProvider implements Provider
{
return null;
}
+
+ public function getLastUpdate(): ?Carbon
+ {
+ return null;
+ }
}
\ No newline at end of file
diff --git a/src/Provider/Provider.php b/src/Provider/Provider.php
index d079c90..f82d412 100644
--- a/src/Provider/Provider.php
+++ b/src/Provider/Provider.php
@@ -2,6 +2,8 @@
namespace App\Provider;
+use Carbon\Carbon;
+
interface Provider
{
public function getDepartureRepository(): DepartureRepository;
@@ -14,4 +16,6 @@ interface Provider
public function getShortName(): string;
public function getIdentifier(): string;
public function getAttribution(): ?string;
+
+ public function getLastUpdate(): ?Carbon;
}
\ No newline at end of file
diff --git a/src/Provider/ZtmGdansk/ZtmGdanskProvider.php b/src/Provider/ZtmGdansk/ZtmGdanskProvider.php
index f3c2ce0..5b3d4f3 100644
--- a/src/Provider/ZtmGdansk/ZtmGdanskProvider.php
+++ b/src/Provider/ZtmGdansk/ZtmGdanskProvider.php
@@ -15,6 +15,7 @@ use App\Provider\StopRepository;
use App\Provider\TrackRepository;
use App\Provider\ZtmGdansk\{ZtmGdanskDepartureRepository, ZtmGdanskMessageRepository};
use App\Service\Proxy\ReferenceFactory;
+use Carbon\Carbon;
use Doctrine\ORM\EntityManagerInterface;
class ZtmGdanskProvider implements Provider
@@ -25,6 +26,9 @@ class ZtmGdanskProvider implements Provider
private $tracks;
private $messages;
+ /** @var ProviderEntity */
+ private $entity;
+
public function getName(): string
{
return 'MZKZG - Trójmiasto';
@@ -64,6 +68,7 @@ class ZtmGdanskProvider implements Provider
$this->stops = $stops;
$this->messages = $messages;
$this->tracks = $tracks;
+ $this->entity = $provider;
}
public function getDepartureRepository(): DepartureRepository
@@ -90,4 +95,9 @@ class ZtmGdanskProvider implements Provider
{
return $this->tracks;
}
+
+ public function getLastUpdate(): ?Carbon
+ {
+ return $this->entity->getUpdateDate();
+ }
}
\ No newline at end of file
diff --git a/src/Service/DataUpdater.php b/src/Service/DataUpdater.php
index e900c3e..bf68deb 100644
--- a/src/Service/DataUpdater.php
+++ b/src/Service/DataUpdater.php
@@ -30,11 +30,21 @@ class DataUpdater
public function update()
{
- $schema = $this->em->getConnection()->getSchemaManager();
- collect($schema->listTables())->reject(function (Table $schema) {
- return $schema->getName() === 'migration_versions';
- })->each([$schema, 'dropAndCreateTable']);
+ $connection = $this->em->getConnection();
+ $schema = $connection->getSchemaManager();
- $this->dispatcher->dispatch(self::UPDATE_EVENT, new DataUpdateEvent());
+ try {
+ $connection->beginTransaction();
+
+ collect($schema->listTables())->reject(function (Table $schema) {
+ return $schema->getName() === 'migration_versions';
+ })->each([$schema, 'dropAndCreateTable']);
+
+ $this->dispatcher->dispatch(self::UPDATE_EVENT, new DataUpdateEvent());
+ $connection->commit();
+ } catch (\Throwable $exception) {
+ $connection->rollBack();
+ throw $exception;
+ }
}
}
\ No newline at end of file
diff --git a/templates/choose.html.twig b/templates/choose.html.twig
index a2108e1..8d4a044 100644
--- a/templates/choose.html.twig
+++ b/templates/choose.html.twig
@@ -5,7 +5,13 @@