'json', 'data_payload_updated_at' => 'datetime', 'is_native' => 'boolean', 'current_image' => 'string', ]; protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->uuid)) { $model->uuid = Str::uuid(); } }); } 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) { // Parse headers from polling_header string $headers = ['User-Agent' => 'usetrmnl/byos_laravel', 'Accept' => 'application/json']; if ($this->polling_header) { $headerLines = explode("\n", trim($this->polling_header)); foreach ($headerLines as $line) { $parts = explode(':', $line, 2); if (count($parts) === 2) { $headers[trim($parts[0])] = trim($parts[1]); } } } $response = Http::withHeaders($headers) ->get($this->polling_url) ->json(); $this->update([ 'data_payload' => $response, 'data_payload_updated_at' => now(), ]); } } }