diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 68f8e7e..524f26a 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -46,7 +46,6 @@ class Plugin extends Model 'dark_mode' => 'boolean', 'preferred_renderer' => 'string', 'plugin_type' => 'string', - 'alias' => 'boolean', ]; protected static function boot() @@ -154,7 +153,7 @@ class Plugin extends Model public function updateDataPayload(): void { - if ($this->data_strategy !== 'polling' || ! $this->polling_url) { + if ($this->data_strategy !== 'polling' || !$this->polling_url) { return; } $headers = ['User-Agent' => 'usetrmnl/byos_laravel', 'Accept' => 'application/json']; diff --git a/app/Services/ImageGenerationService.php b/app/Services/ImageGenerationService.php index 405ea3f..b8269a3 100644 --- a/app/Services/ImageGenerationService.php +++ b/app/Services/ImageGenerationService.php @@ -26,44 +26,11 @@ class ImageGenerationService public static function generateImage(string $markup, $deviceId): string { $device = Device::with(['deviceModel', 'palette', 'deviceModel.palette', 'user'])->find($deviceId); - $uuid = self::generateImageFromModel( - markup: $markup, - deviceModel: $device->deviceModel, - user: $device->user, - palette: $device->palette ?? $device->deviceModel?->palette, - device: $device - ); - - $device->update(['current_screen_image' => $uuid]); - Log::info("Device $device->id: updated with new image: $uuid"); - - return $uuid; - } - - /** - * Generate an image from markup using a DeviceModel - * - * @param string $markup The HTML markup to render - * @param DeviceModel|null $deviceModel The device model to use for image generation - * @param \App\Models\User|null $user Optional user for timezone settings - * @param \App\Models\DevicePalette|null $palette Optional palette, falls back to device model's palette - * @param Device|null $device Optional device for legacy devices without DeviceModel - * @return string The UUID of the generated image - */ - public static function generateImageFromModel( - string $markup, - ?DeviceModel $deviceModel = null, - ?\App\Models\User $user = null, - ?\App\Models\DevicePalette $palette = null, - ?Device $device = null - ): string { $uuid = Uuid::uuid4()->toString(); try { - // Get image generation settings from DeviceModel or Device (for legacy devices) - $imageSettings = $deviceModel - ? self::getImageSettingsFromModel($deviceModel) - : ($device ? self::getImageSettings($device) : self::getImageSettingsFromModel(null)); + // Get image generation settings from DeviceModel if available, otherwise use device settings + $imageSettings = self::getImageSettings($device); $fileExtension = $imageSettings['mime_type'] === 'image/bmp' ? 'bmp' : 'png'; $outputPath = Storage::disk('public')->path('/images/generated/'.$uuid.'.'.$fileExtension); @@ -78,7 +45,7 @@ class ImageGenerationService $browserStage->html($markup); // Set timezone from user or fall back to app timezone - $timezone = $user?->timezone ?? config('app.timezone'); + $timezone = $device->user->timezone ?? config('app.timezone'); $browserStage->timezone($timezone); if (config('app.puppeteer_window_size_strategy') === 'v2') { @@ -98,12 +65,12 @@ class ImageGenerationService $browserStage->setBrowsershotOption('args', ['--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu']); } - // Get palette from parameter or fallback to device model's default palette + // Get palette from device or fallback to device model's default palette + $palette = $device->palette ?? $device->deviceModel?->palette; $colorPalette = null; + if ($palette && $palette->colors) { $colorPalette = $palette->colors; - } elseif ($deviceModel?->palette && $deviceModel->palette->colors) { - $colorPalette = $deviceModel->palette->colors; } $imageStage = new ImageStage(); @@ -140,7 +107,8 @@ class ImageGenerationService throw new RuntimeException('Image file is empty: '.$outputPath); } - Log::info("Generated image: $uuid"); + $device->update(['current_screen_image' => $uuid]); + Log::info("Device $device->id: updated with new image: $uuid"); return $uuid; @@ -157,7 +125,22 @@ class ImageGenerationService { // If device has a DeviceModel, use its settings if ($device->deviceModel) { - return self::getImageSettingsFromModel($device->deviceModel); + /** @var DeviceModel $model */ + $model = $device->deviceModel; + + return [ + 'width' => $model->width, + 'height' => $model->height, + 'colors' => $model->colors, + 'bit_depth' => $model->bit_depth, + 'scale_factor' => $model->scale_factor, + 'rotation' => $model->rotation, + 'mime_type' => $model->mime_type, + 'offset_x' => $model->offset_x, + 'offset_y' => $model->offset_y, + 'image_format' => self::determineImageFormatFromModel($model), + 'use_model_settings' => true, + ]; } // Fallback to device settings @@ -181,43 +164,6 @@ class ImageGenerationService ]; } - /** - * Get image generation settings from a DeviceModel - */ - private static function getImageSettingsFromModel(?DeviceModel $deviceModel): array - { - if ($deviceModel) { - return [ - 'width' => $deviceModel->width, - 'height' => $deviceModel->height, - 'colors' => $deviceModel->colors, - 'bit_depth' => $deviceModel->bit_depth, - 'scale_factor' => $deviceModel->scale_factor, - 'rotation' => $deviceModel->rotation, - 'mime_type' => $deviceModel->mime_type, - 'offset_x' => $deviceModel->offset_x, - 'offset_y' => $deviceModel->offset_y, - 'image_format' => self::determineImageFormatFromModel($deviceModel), - 'use_model_settings' => true, - ]; - } - - // Default settings if no device model provided - return [ - 'width' => 800, - 'height' => 480, - 'colors' => 2, - 'bit_depth' => 1, - 'scale_factor' => 1.0, - 'rotation' => 0, - 'mime_type' => 'image/png', - 'offset_x' => 0, - 'offset_y' => 0, - 'image_format' => ImageFormat::AUTO->value, - 'use_model_settings' => false, - ]; - } - /** * Determine the appropriate ImageFormat based on DeviceModel settings */ diff --git a/app/Services/PluginImportService.php b/app/Services/PluginImportService.php index 49dce99..eeb5835 100644 --- a/app/Services/PluginImportService.php +++ b/app/Services/PluginImportService.php @@ -20,13 +20,12 @@ class PluginImportService /** * Validate YAML settings * - * @param array $settings The parsed YAML settings - * + * @param array $settings The parsed YAML settings * @throws Exception */ private function validateYAML(array $settings): void { - if (! isset($settings['custom_fields']) || ! is_array($settings['custom_fields'])) { + if (!isset($settings['custom_fields']) || !is_array($settings['custom_fields'])) { return; } @@ -44,7 +43,6 @@ class PluginImportService } } } - /** * Import a plugin from a ZIP file * @@ -75,17 +73,12 @@ class PluginImportService $zip->extractTo($tempDir); $zip->close(); - // Find the required files (settings.yml and full.liquid/full.blade.php/shared.liquid/shared.blade.php) + // Find the required files (settings.yml and full.liquid/full.blade.php) $filePaths = $this->findRequiredFiles($tempDir, $zipEntryPath); // Validate that we found the required files - if (! $filePaths['settingsYamlPath']) { - throw new Exception('Invalid ZIP structure. Required file settings.yml is missing.'); - } - - // Validate that we have at least one template file - if (! $filePaths['fullLiquidPath'] && ! $filePaths['sharedLiquidPath'] && ! $filePaths['sharedBladePath']) { - throw new Exception('Invalid ZIP structure. At least one of the following files is required: full.liquid, full.blade.php, shared.liquid, or shared.blade.php.'); + if (! $filePaths['settingsYamlPath'] || ! $filePaths['fullLiquidPath']) { + throw new Exception('Invalid ZIP structure. Required files settings.yml and full.liquid are missing.'); // full.blade.php } // Parse settings.yml @@ -93,37 +86,20 @@ class PluginImportService $settings = Yaml::parse($settingsYaml); $this->validateYAML($settings); - // Determine which template file to use and read its content - $templatePath = null; + // Read full.liquid content + $fullLiquid = File::get($filePaths['fullLiquidPath']); + + // Prepend shared.liquid content if available + if ($filePaths['sharedLiquidPath'] && File::exists($filePaths['sharedLiquidPath'])) { + $sharedLiquid = File::get($filePaths['sharedLiquidPath']); + $fullLiquid = $sharedLiquid."\n".$fullLiquid; + } + + // Check if the file ends with .liquid to set markup language $markupLanguage = 'blade'; - - if ($filePaths['fullLiquidPath']) { - $templatePath = $filePaths['fullLiquidPath']; - $fullLiquid = File::get($templatePath); - - // Prepend shared.liquid or shared.blade.php content if available - if ($filePaths['sharedLiquidPath'] && File::exists($filePaths['sharedLiquidPath'])) { - $sharedLiquid = File::get($filePaths['sharedLiquidPath']); - $fullLiquid = $sharedLiquid."\n".$fullLiquid; - } elseif ($filePaths['sharedBladePath'] && File::exists($filePaths['sharedBladePath'])) { - $sharedBlade = File::get($filePaths['sharedBladePath']); - $fullLiquid = $sharedBlade."\n".$fullLiquid; - } - - // Check if the file ends with .liquid to set markup language - if (pathinfo((string) $templatePath, PATHINFO_EXTENSION) === 'liquid') { - $markupLanguage = 'liquid'; - $fullLiquid = '