From d77458f79287e6cad454d78dd9afd7abbcb73dd8 Mon Sep 17 00:00:00 2001 From: Clement Desmidt Date: Wed, 18 Mar 2020 10:43:49 +0100 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Permet=20l'ajout=20et=20la=20mise?= =?UTF-8?q?=20=C3=A0=20jour=20des=20avatars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #12 --- app/Http/Controllers/UserController.php | 9 +- app/Http/Requests/UpdateUser.php | 8 +- app/User.php | 25 ++-- config/medialibrary.php | 156 ++++++++++++++++++++ resources/views/layouts/connected.blade.php | 12 +- 5 files changed, 186 insertions(+), 24 deletions(-) create mode 100644 config/medialibrary.php diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 3733780..7047acf 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -22,9 +22,6 @@ class UserController extends Controller $user_id = Auth::user()->getAuthIdentifier(); $user = User::find($user_id); $validated = $request->validated(); - if (!array_key_exists('encrypt_messages', $validated)) { - $validated['encrypt_messages'] = 0; - } if (isset($validated['avatar'])) { try { $user->clearMediaCollection('avatars'); @@ -33,7 +30,13 @@ class UserController extends Controller } catch (FileDoesNotExist $e) { } catch (FileIsTooBig $e) { } + unset($validated['avatar']); } + + if (!array_key_exists('encrypt_messages', $validated)) { + $validated['encrypt_messages'] = 0; + } + $user->update($validated); return redirect(route('user.index'))->withSuccess('Data saved!'); diff --git a/app/Http/Requests/UpdateUser.php b/app/Http/Requests/UpdateUser.php index 90493cd..8081f3f 100644 --- a/app/Http/Requests/UpdateUser.php +++ b/app/Http/Requests/UpdateUser.php @@ -25,11 +25,11 @@ class UpdateUser extends FormRequest public function rules() { return [ - 'name' => 'required|min:4|max:255', - 'email' => 'required|email:rfc|unique:users,email,'.Auth::user()->getAuthIdentifier(), - 'encrypt_messages' => 'boolean', + 'name' => 'required|min:4|max:255', + 'email' => 'required|email:rfc|unique:users,email,'.Auth::user()->getAuthIdentifier(), + 'encrypt_messages' => 'boolean', 'notification_hour' => 'in:0,1,2,3,4', - 'avatar' => 'file|dimensions:min_width=50,min_height=50,max_width=200,max_height=200,ratio=1' + 'avatar' => 'file|dimensions:max_width=200,max_height=200,ratio=1' ]; } } diff --git a/app/User.php b/app/User.php index 016b6ac..5425326 100644 --- a/app/User.php +++ b/app/User.php @@ -5,6 +5,7 @@ namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Facades\Log; use Spatie\Image\Exceptions\InvalidManipulation; use Spatie\MediaLibrary\HasMedia\HasMedia; use Spatie\MediaLibrary\HasMedia\HasMediaTrait; @@ -20,7 +21,7 @@ class User extends Authenticatable implements HasMedia * @var array */ protected $fillable = [ - 'name', 'email', 'password', 'notification_hour', 'encrypt_messages', 'avatar', + 'name', 'email', 'password', 'notification_hour', 'encrypt_messages', ]; /** @@ -37,14 +38,8 @@ class User extends Authenticatable implements HasMedia ]; /** - * The attributes that should be cast to native types. - * - * @var array + * @return string */ -// protected $casts = [ -// 'email_verified_at' => 'datetime', -// ]; - public function getFolder() { $arrayHash = str_split(strtolower(md5($this->id))); @@ -66,9 +61,15 @@ class User extends Authenticatable implements HasMedia { try { $this->addMediaConversion('thumb') - ->width(50) - ->height(50); + ->width(100) + ->height(100) + ->optimize(); + $this->addMediaConversion('icon') + ->width(32) + ->height(32) + ->optimize(); } catch (InvalidManipulation $e) { + Log::alert(sprintf('Error while manipulating Avatar for %s (%s)', $this->email, $e->getMessage())); } } @@ -76,8 +77,8 @@ class User extends Authenticatable implements HasMedia * @param string $alias * @return string */ - public function getAvatar($alias = 'thumb') + public function getAvatar($alias = 'thumb'): string { - return $this->getFirstMediaUrl('avatars'); + return $this->getFirstMediaUrl('avatars', $alias); } } diff --git a/config/medialibrary.php b/config/medialibrary.php new file mode 100644 index 0000000..9b00744 --- /dev/null +++ b/config/medialibrary.php @@ -0,0 +1,156 @@ + env('MEDIA_DISK', 'public'), + + /* + * The maximum file size of an item in bytes. + * Adding a larger file will result in an exception. + */ + 'max_file_size' => 1024 * 1024 * 10, + + /* + * This queue will be used to generate derived and responsive images. + * Leave empty to use the default queue. + */ + 'queue_name' => '', + + /* + * The fully qualified class name of the media model. + */ + 'media_model' => Spatie\MediaLibrary\Models\Media::class, + + 's3' => [ + /* + * The domain that should be prepended when generating urls. + */ + 'domain' => 'https://'.env('AWS_BUCKET').'.s3.amazonaws.com', + ], + + 'remote' => [ + /* + * Any extra headers that should be included when uploading media to + * a remote disk. Even though supported headers may vary between + * different drivers, a sensible default has been provided. + * + * Supported by S3: CacheControl, Expires, StorageClass, + * ServerSideEncryption, Metadata, ACL, ContentEncoding + */ + 'extra_headers' => [ + 'CacheControl' => 'max-age=604800', + ], + ], + + 'responsive_images' => [ + + /* + * This class is responsible for calculating the target widths of the responsive + * images. By default we optimize for filesize and create variations that each are 20% + * smaller than the previous one. More info in the documentation. + * + * https://docs.spatie.be/laravel-medialibrary/v7/advanced-usage/generating-responsive-images + */ + 'width_calculator' => Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, + + /* + * By default rendering media to a responsive image will add some javascript and a tiny placeholder. + * This ensures that the browser can already determine the correct layout. + */ + 'use_tiny_placeholders' => true, + + /* + * This class will generate the tiny placeholder used for progressive image loading. By default + * the medialibrary will use a tiny blurred jpg image. + */ + 'tiny_placeholder_generator' => Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + ], + + /* + * When urls to files get generated, this class will be called. Leave empty + * if your files are stored locally above the site root or on s3. + */ + 'url_generator' => null, + + /* + * Whether to activate versioning when urls to files get generated. + * When activated, this attaches a ?v=xx query string to the URL. + */ + 'version_urls' => false, + + /* + * The class that contains the strategy for determining a media file's path. + */ + 'path_generator' => null, + + /* + * Medialibrary will try to optimize all converted images by removing + * metadata and applying a little bit of compression. These are + * the optimizers that will be used by default. + */ + 'image_optimizers' => [ + Spatie\ImageOptimizer\Optimizers\Jpegoptim::class => [ + '--strip-all', // this strips out all text information such as comments and EXIF data + '--all-progressive', // this will make sure the resulting image is a progressive one + ], + Spatie\ImageOptimizer\Optimizers\Pngquant::class => [ + '--force', // required parameter for this package + ], + Spatie\ImageOptimizer\Optimizers\Optipng::class => [ + '-i0', // this will result in a non-interlaced, progressive scanned image + '-o2', // this set the optimization level to two (multiple IDAT compression trials) + '-quiet', // required parameter for this package + ], + Spatie\ImageOptimizer\Optimizers\Svgo::class => [ + '--disable=cleanupIDs', // disabling because it is known to cause troubles + ], + Spatie\ImageOptimizer\Optimizers\Gifsicle::class => [ + '-b', // required parameter for this package + '-O3', // this produces the slowest but best results + ], + ], + + /* + * These generators will be used to create an image of media files. + */ + 'image_generators' => [ + Spatie\MediaLibrary\ImageGenerators\FileTypes\Image::class, + Spatie\MediaLibrary\ImageGenerators\FileTypes\Webp::class, + Spatie\MediaLibrary\ImageGenerators\FileTypes\Pdf::class, + Spatie\MediaLibrary\ImageGenerators\FileTypes\Svg::class, + Spatie\MediaLibrary\ImageGenerators\FileTypes\Video::class, + ], + + /* + * The engine that should perform the image conversions. + * Should be either `gd` or `imagick`. + */ + 'image_driver' => 'gd', + + /* + * FFMPEG & FFProbe binaries paths, only used if you try to generate video + * thumbnails and have installed the php-ffmpeg/php-ffmpeg composer + * dependency. + */ + 'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'), + 'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'), + + /* + * The path where to store temporary files while performing image conversions. + * If set to null, storage_path('medialibrary/temp') will be used. + */ + 'temporary_directory_path' => null, + + /* + * Here you can override the class names of the jobs used by this package. Make sure + * your custom jobs extend the ones provided by the package. + */ + 'jobs' => [ + 'perform_conversions' => Spatie\MediaLibrary\Jobs\PerformConversions::class, + 'generate_responsive_images' => Spatie\MediaLibrary\Jobs\GenerateResponsiveImages::class, + ], +]; diff --git a/resources/views/layouts/connected.blade.php b/resources/views/layouts/connected.blade.php index 501171e..8d4a513 100644 --- a/resources/views/layouts/connected.blade.php +++ b/resources/views/layouts/connected.blade.php @@ -55,14 +55,16 @@