Skip to content

Commit

Permalink
Code optimizations (#14)
Browse files Browse the repository at this point in the history
* Code optimizations

---------

Co-authored-by: Kevin Meijer <[email protected]>
  • Loading branch information
kevinmeijer97 and Kevin Meijer authored May 9, 2023
1 parent 3af5d3e commit cc9e88e
Show file tree
Hide file tree
Showing 21 changed files with 169 additions and 5,943 deletions.
5 changes: 4 additions & 1 deletion config/image-optimize.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@
'default_queue_name' => env('IMAGE_OPTIMIZE_QUEUE_NAME', 'default'),

// Set the default queue connection
'default_queue_connection' => env('IMAGE_OPTIMIZE_QUEUE_CONNECTION'),
'default_queue_connection' => env('IMAGE_OPTIMIZE_QUEUE_CONNECTION', config('queue.default', 'sync')),

// The following mime types will be used to optimize images
'mime_types' => ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
];
536 changes: 2 additions & 534 deletions dist/js/statamic-image-optimize.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/js/statamic-image-optimize.js.LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
3 changes: 0 additions & 3 deletions mix-manifest.json

This file was deleted.

5 changes: 2 additions & 3 deletions resources/js/components/cp/image-resize/ResizeForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@
let self = this;
this.jobStarted = true;
this.checkJobs = true;
this.resizeImages(forceAll);
await this.resizeImages(forceAll);
let resizeInterval = setInterval(async function () {
let resizeCheckResponse = await self.checkResizeImages();
Expand All @@ -119,7 +119,6 @@
if (resizeCheckResponse.assetsToOptimize === 0) {
this.checkJobs = false;
clearInterval(resizeInterval);
return;
}
}, 1000);
},
Expand All @@ -146,7 +145,7 @@
return responseData;
})
.catch(function (error) {
console.log('error', error);
console.error(error);
});
}
}
Expand Down
14 changes: 8 additions & 6 deletions routes/cp.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
<?php

Route::namespace('\JustBetter\ImageOptimize\Http\Controllers\CP')
->prefix('statamic-image-optimize')
use Illuminate\Support\Facades\Route;
use JustBetter\ImageOptimize\Http\Controllers\CP\ImageResizeController;

Route::prefix('statamic-image-optimize')
->name('statamic-image-optimize.')
->group(function() {
Route::get('/', 'ImageResizeController@index')
Route::get('/', [ImageResizeController::class, 'index'])
->name('index');
Route::get('/resize-images/{forceAll?}', 'ImageResizeController@resizeImages')
Route::get('/resize-images/{forceAll?}', [ImageResizeController::class, 'resizeImages'])
->name('resize-images');
Route::get('/resize-images-count/{batchId?}', 'ImageResizeController@resizeImagesJobCount')
Route::get('/resize-images-count/{batchId?}', [ImageResizeController::class, 'resizeImagesJobCount'])
->name('resize-images-count');
});
});
3 changes: 0 additions & 3 deletions src/Actions/OptimizeAssets.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@

namespace JustBetter\ImageOptimize\Actions;

use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage;
use JustBetter\ImageOptimize\Jobs\ResizeImageJob;
use Statamic\Actions\Action;
use Statamic\Contracts\Assets\Asset;
use Statamic\Facades\Asset as AssetAPI;

class OptimizeAssets extends Action
{
Expand Down
34 changes: 19 additions & 15 deletions src/Actions/ResizeImage.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,37 @@

use Intervention\Image\Exception\NotReadableException;
use Intervention\Image\Facades\Image;
use JustBetter\ImageOptimize\Contracts\ResizesImage;
use JustBetter\ImageOptimize\Events\ImageResizedEvent;
use League\Glide\Manipulators\Size;
use Statamic\Assets\Asset;

class ResizeImage
class ResizeImage implements ResizesImage
{
public function __construct(
public Asset $asset,
public int $width = 1680,
public int $height = 1680,
) {
$this->resize();
}

public function resize(): void
public function resize(Asset $asset, ?int $width = null, ?int $height = null): void
{
$width ??= (int) config('image-optimize.default_resize_width');
$height ??= (int) config('image-optimize.default_resize_height');

// Prevents exceptions occurring when resizing non-compatible filetypes like SVG.
try {
$image = (new Size())->runMaxResize(Image::make($this->asset->stream()), $this->width, $this->height);
$image = (new Size())->runMaxResize(Image::make($asset->stream()), $width, $height);

$this->asset->disk()->filesystem()->put($this->asset->path(), $image->encode());
$asset->disk()->filesystem()->put($asset->path(), $image->encode());

$this->asset->data(['image-optimized' => '1']);
$asset->data(['image-optimized' => '1']);

$this->asset->save();
$this->asset->meta();
$asset->save();
$asset->meta();
} catch (NotReadableException) {
return;
}

ImageResizedEvent::dispatch();
}

public static function bind(): void
{
app()->singleton(ResizesImage::class,static::class);
}
}
42 changes: 24 additions & 18 deletions src/Actions/ResizeImages.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,41 @@

namespace JustBetter\ImageOptimize\Actions;

use JustBetter\ImageOptimize\Contracts\ResizesImages;
use JustBetter\ImageOptimize\Events\ImagesResizedEvent;
use JustBetter\ImageOptimize\Jobs\ResizeImageJob;
use Statamic\Assets\Asset;
use Statamic\Assets\AssetCollection;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Statamic\Assets\AssetCollection;

class ResizeImages
class ResizeImages implements ResizesImages
{
public int $chunkSize = 200;

public function __construct(
public AssetCollection $assetCollection
) {
}

public function resizeImages(): Batch
public function resize(bool $forceAll = false): Batch
{
$batches = $this->assetCollection->map(function (Asset $asset) {
if(!$asset->isImage()) {
return null;
}
/** @var AssetCollection $assets */
$assets = Asset::all();

$asset->hydrate();
return new ResizeImageJob($asset);
})->filter();
$assets
->whereIn('mime_type', config('image-optimize.mime_types'))
->when(!$forceAll, fn() => $assets->whereNull('image-optimized'));

return Bus::batch($batches)
$jobs = $assets
->filter(fn(Asset $asset): bool => $asset->isImage())
->map(fn (Asset $asset) => new ResizeImageJob($asset->hydrate()));

return Bus::batch($jobs)
->name('image-optimize')
->onConnection(config('image-optimize.default_queue_connection'))
->onQueue(config('image-optimize.default_queue_name'))
->then(function(): void {
ImagesResizedEvent::dispatch();
})
->dispatch();
}

public static function bind(): void
{
app()->singleton(ResizesImages::class,static::class);
}
}
24 changes: 9 additions & 15 deletions src/Commands/ResizeImagesCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
namespace JustBetter\ImageOptimize\Commands;

use Illuminate\Console\Command;
use JustBetter\ImageOptimize\Actions\ResizeImages;
use JustBetter\ImageOptimize\Contracts\ResizesImages;
use JustBetter\ImageOptimize\Jobs\ResizeImagesJob;
use Statamic\Facades\Asset;
use Illuminate\Support\Facades\DB;

class ResizeImagesCommand extends Command
Expand All @@ -14,32 +13,26 @@ class ResizeImagesCommand extends Command

protected $description = 'Optimize all images in the asset library';

public function handle(): int
public function handle(ResizesImages $resizesImages): int
{
/** @var bool $forceAll */
$forceAll = $this->option('forceAll');

$databaseConnected = true;

try {
DB::connection()->getPdo();
} catch (\Exception $e) {
$databaseConnected = false;
}

if (!$databaseConnected) {
$this->output->error('You need an active database connection in order to use the optimize addon.');
$this->error('You need an active database connection in order to use the optimize addon.');
return false;
}

if ($this->getOutput()->isVerbose()) {
$this->output->info("Starting the resize images job");
$this->line("Starting the resize images job");

if ($forceAll) {
$this->output->text("Forcing to optimize all images");
$this->comment("Forcing to optimize all images");
}

$assets = Asset::all();
$batch = (new ResizeImages($forceAll ? $assets : $assets->whereNull('image-optimized')))->resizeImages();
$batch = $resizesImages->resize($forceAll);

$progress = $this->output->createProgressBar($batch->totalJobs);
$progress->start();
Expand All @@ -52,9 +45,10 @@ public function handle(): int
$progress->finish();

$this->output->newLine(2);
$this->output->success("All images have been resized");
$this->info("All images have been resized");
} else {
ResizeImagesJob::dispatch($forceAll);
$this->info("Jobs dispatched");
}

return static::SUCCESS;
Expand Down
10 changes: 10 additions & 0 deletions src/Contracts/ResizesImage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace JustBetter\ImageOptimize\Contracts;

use Statamic\Assets\Asset;

interface ResizesImage
{
public function resize(Asset $asset, ?int $width = null, ?int $height = null): void;
}
10 changes: 10 additions & 0 deletions src/Contracts/ResizesImages.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace JustBetter\ImageOptimize\Contracts;

use Illuminate\Bus\Batch;

interface ResizesImages
{
public function resize(bool $forceAll = false): Batch;
}
10 changes: 10 additions & 0 deletions src/Events/ImageEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace JustBetter\ImageOptimize\Events;

use Illuminate\Foundation\Events\Dispatchable;

abstract class ImageEvent
{
use Dispatchable;
}
6 changes: 2 additions & 4 deletions src/Events/ImageResizedEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

namespace JustBetter\ImageOptimize\Events;

use Illuminate\Foundation\Events\Dispatchable;

class ImageResizedEvent
class ImageResizedEvent extends ImageEvent
{
use Dispatchable;
//
}
6 changes: 2 additions & 4 deletions src/Events/ImagesResizedEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

namespace JustBetter\ImageOptimize\Events;

use Illuminate\Foundation\Events\Dispatchable;

class ImagesResizedEvent
class ImagesResizedEvent extends ImageEvent
{
use Dispatchable;
//
}
34 changes: 20 additions & 14 deletions src/Http/Controllers/CP/ImageResizeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,18 @@

namespace JustBetter\ImageOptimize\Http\Controllers\CP;

use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\DB;
use JustBetter\ImageOptimize\Jobs\ResizeImagesJob;
use JustBetter\ImageOptimize\Contracts\ResizesImages;
use Statamic\Facades\Asset;
use Statamic\Facades\AssetContainer;

class ImageResizeController extends Controller
{
public array $mimeTypes = [
'image/jpeg', 'image/png', 'image/gif', 'image/webp'
];

public function index() : string
{
$assets = Asset::all()->whereIn('mime_type', $this->mimeTypes);
$assets = Asset::all()->whereIn('mime_type', config('image-optimize.mime_types'));
$unoptimizedAssets = $assets->whereNull('image-optimized');
$databaseConnected = true;

Expand All @@ -35,23 +31,33 @@ public function index() : string
]);
}

public function resizeImages(string $forceAll = null): array
public function resizeImages(ResizesImages $resizesImages, string $forceAll = null): JsonResponse
{
$batch = (new ResizeImagesJob($forceAll ? true : false))->handle();
return ['imagesOptimized' => true, 'batchId' => $batch->id];
$batch = $resizesImages->resize($forceAll !== null);

return response()->json([
'imagesOptimized' => true,
'batchId' => $batch->id
]);
}

public function resizeImagesJobCount(string $batchId = null): array
public function resizeImagesJobCount(string $batchId = null): JsonResponse
{
$batch = $batchId ? Bus::findBatch($batchId) : null;

if ($batch) {
return ['assetsToOptimize' => $batch->pendingJobs ?? 0, 'assetTotal' => $batch->totalJobs ?? 0];
return response()->json([
'assetsToOptimize' => $batch->pendingJobs ?? 0,
'assetTotal' => $batch->totalJobs ?? 0
]);
}

$allAssets = Asset::all();
$assets = $allAssets->whereNull('image-optimized');

return ['assetsToOptimize' => $assets->count(), 'assetTotal' => $allAssets->count()];
return response()->json([
'assetsToOptimize' => $assets->count(),
'assetTotal' => $allAssets->count(),
]);
}
}
Loading

0 comments on commit cc9e88e

Please sign in to comment.