diff --git a/src/app/Models/Traits/HasProfilePhoto.php b/src/app/Models/Traits/HasProfilePhoto.php new file mode 100644 index 0000000..c92df2e --- /dev/null +++ b/src/app/Models/Traits/HasProfilePhoto.php @@ -0,0 +1,88 @@ +profile_photo_path, function ($previous) use ($photo, $storagePath) { + $this->forceFill([ + 'profile_photo_path' => $photo->storePublicly( + $storagePath, ['disk' => $this->profilePhotoDisk()] + ), + ])->save(); + + if ($previous) { + Storage::disk($this->profilePhotoDisk())->delete($previous); + } + }); + } + + /** + * Delete the user's profile photo. + * + * @return void + */ + public function deleteProfilePhoto() + { + if (! Features::managesProfilePhotos()) { + return; + } + + if (is_null($this->profile_photo_path)) { + return; + } + + Storage::disk($this->profilePhotoDisk())->delete($this->profile_photo_path); + + $this->forceFill([ + 'profile_photo_path' => null, + ])->save(); + } + + /** + * Get the URL to the user's profile photo. + * + * @return \Illuminate\Database\Eloquent\Casts\Attribute + */ + public function profilePhotoUrl(): Attribute + { + return Attribute::get(function () { + return $this->profile_photo_path + ? Storage::disk($this->profilePhotoDisk())->url($this->profile_photo_path) + : $this->defaultProfilePhotoUrl(); + }); + } + + /** + * Get the default profile photo URL if no profile photo has been uploaded. + * + * @return string + */ + protected function defaultProfilePhotoUrl() + { + return 'https://avatars.test/avatar?size=256'; + } + + /** + * Get the disk that profile photos should be stored on. + * + * @return string + */ + protected function profilePhotoDisk() + { + return isset($_ENV['VAPOR_ARTIFACT_NAME']) ? 's3' : config('jetstream.profile_photo_disk', 'public'); + } +}