From 64eb1bc0474cec855d4e6e6348a715e7808e56b1 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 14 Mar 2025 23:28:26 +0100 Subject: [PATCH] feat: update plugin data if stale --- app/Models/Plugin.php | 23 +++++++++++++++++++ ...ta_payload_updated_at_to_plugins_table.php | 22 ++++++++++++++++++ routes/api.php | 15 ++++++++---- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2025_03_14_211414_add_data_payload_updated_at_to_plugins_table.php diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 6042f23..1f1731c 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -4,6 +4,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; class Plugin extends Model @@ -14,6 +15,8 @@ class Plugin extends Model protected $casts = [ 'data_payload' => 'json', + 'data_payload_updated_at' => 'datetime', + 'is_native' => 'boolean', ]; protected static function boot() @@ -26,4 +29,24 @@ class Plugin extends Model } }); } + + public function isDataStale(): bool + { + if (! $this->data_payload_updated_at || ! $this->data_stale_minutes) { + return true; + } + + return $this->data_payload_updated_at->addMinutes($this->data_stale_minutes)->isPast(); + } + + public function updateDataPayload(): void + { + if ($this->data_strategy === 'polling' && $this->polling_url) { + $response = Http::get($this->polling_url)->json(); + $this->update([ + 'data_payload' => $response, + 'data_payload_updated_at' => now(), + ]); + } + } } diff --git a/database/migrations/2025_03_14_211414_add_data_payload_updated_at_to_plugins_table.php b/database/migrations/2025_03_14_211414_add_data_payload_updated_at_to_plugins_table.php new file mode 100644 index 0000000..51d7178 --- /dev/null +++ b/database/migrations/2025_03_14_211414_add_data_payload_updated_at_to_plugins_table.php @@ -0,0 +1,22 @@ +timestamp('data_payload_updated_at')->nullable()->after('data_payload'); + }); + } + + public function down(): void + { + Schema::table('plugins', function (Blueprint $table) { + $table->dropColumn('data_payload_updated_at'); + }); + } +}; diff --git a/routes/api.php b/routes/api.php index a385d41..d30f523 100644 --- a/routes/api.php +++ b/routes/api.php @@ -46,11 +46,18 @@ Route::get('/display', function (Request $request) { $playlistItem = $device->getNextPlaylistItem(); if ($playlistItem) { + $plugin = $playlistItem->plugin; + + // Check and update stale data if needed + if ($plugin->isDataStale()) { + $plugin->updateDataPayload(); + } + $playlistItem->update(['last_displayed_at' => now()]); - if ($playlistItem->plugin->render_markup) { - $markup = Blade::render($playlistItem->plugin->render_markup, ['data' => $playlistItem->plugin->data_payload]); - } elseif ($playlistItem->plugin->render_markup_view) { - $markup = view($playlistItem->plugin->render_markup_view, ['data' => $playlistItem->plugin->data_payload])->render(); + if ($plugin->render_markup) { + $markup = Blade::render($plugin->render_markup, ['data' => $plugin->data_payload]); + } elseif ($plugin->render_markup_view) { + $markup = view($plugin->render_markup_view, ['data' => $plugin->data_payload])->render(); } GenerateScreenJob::dispatchSync($device->id, $markup);