- Added support for uploading and compressing GLB models using Draco in the backoffice. - Implemented commands for importing and re-compressing 3D models. - Updated model resource to handle 3D model uploads and validations. - Introduced a new script for compressing GLB files with Draco. - Modified Vite configuration to remove GLB files from the build output. - Updated package dependencies to include GLTF-transform libraries for handling 3D models. - Added tests to ensure proper functionality of 3D model handling and compression.
61 lines
1.9 KiB
PHP
61 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\ModelloResource\Pages\Concerns;
|
|
|
|
use App\Models\Modello;
|
|
use App\Support\Configuratore\Modelli3d;
|
|
use App\Support\Configuratore\Modello3dNonValido;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
|
|
|
|
/**
|
|
* Il campo "Modello 3D" non è una colonna: il file caricato passa da Modelli3d, che salva
|
|
* l'originale e la copia compressa con Draco. Se la compressione fallisce, il salvataggio
|
|
* viene annullato (transazione) e l'errore compare sul campo.
|
|
*/
|
|
trait CaricaModello3d
|
|
{
|
|
protected function handleRecordCreation(array $data): Model
|
|
{
|
|
$file = Arr::pull($data, 'modello_3d_upload');
|
|
|
|
return DB::transaction(function () use ($data, $file) {
|
|
$record = parent::handleRecordCreation($data);
|
|
$this->caricaModello3d($record, $file);
|
|
|
|
return $record;
|
|
});
|
|
}
|
|
|
|
protected function handleRecordUpdate(Model $record, array $data): Model
|
|
{
|
|
$file = Arr::pull($data, 'modello_3d_upload');
|
|
|
|
return DB::transaction(function () use ($record, $data, $file) {
|
|
$record = parent::handleRecordUpdate($record, $data);
|
|
$this->caricaModello3d($record, $file);
|
|
|
|
return $record;
|
|
});
|
|
}
|
|
|
|
private function caricaModello3d(Model $record, mixed $file): void
|
|
{
|
|
$file = is_array($file) ? Arr::first($file) : $file;
|
|
if (! $file instanceof TemporaryUploadedFile || ! $record instanceof Modello) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
app(Modelli3d::class)->carica($record, $file->getRealPath(), $file->getClientOriginalName());
|
|
} catch (Modello3dNonValido $e) {
|
|
throw ValidationException::withMessages(['data.modello_3d_upload' => $e->getMessage()]);
|
|
}
|
|
|
|
$file->delete();
|
|
}
|
|
}
|