123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <?php
- namespace App\Services;
- use Cache;
- use Storage;
- use Illuminate\Support\Str;
- use App\Avatar;
- use App\Profile;
- use App\Jobs\AvatarPipeline\AvatarStorageLargePurge;
- use League\Flysystem\UnableToCheckDirectoryExistence;
- use League\Flysystem\UnableToRetrieveMetadata;
- class AvatarService
- {
- public static function get($profile_id)
- {
- $exists = Cache::get('avatar:' . $profile_id);
- if($exists) {
- return $exists;
- }
- $profile = Profile::find($profile_id);
- if(!$profile) {
- return config('app.url') . '/storage/avatars/default.jpg';
- }
- return $profile->avatarUrl();
- }
- public static function disk()
- {
- $storage = [
- 'cloud' => boolval(config_cache('pixelfed.cloud_storage')),
- 'local' => boolval(config_cache('federation.avatars.store_local'))
- ];
- if(!$storage['cloud'] && !$storage['local']) {
- return false;
- }
- $driver = $storage['cloud'] == false ? 'local' : config('filesystems.cloud');
- $disk = Storage::disk($driver);
- return $disk;
- }
- public static function storage(Avatar $avatar)
- {
- $disk = self::disk();
- if(!$disk) {
- return;
- }
- $storage = [
- 'cloud' => boolval(config_cache('pixelfed.cloud_storage')),
- 'local' => boolval(config_cache('federation.avatars.store_local'))
- ];
- $base = ($storage['cloud'] == false ? 'public/cache/' : 'cache/') . 'avatars/';
- return $disk->allFiles($base . $avatar->profile_id);
- }
- public static function cleanup($avatar, $confirm = false)
- {
- if(!$avatar || !$confirm) {
- return;
- }
- if($avatar->cdn_url == null) {
- return;
- }
- $storage = [
- 'cloud' => boolval(config_cache('pixelfed.cloud_storage')),
- 'local' => boolval(config_cache('federation.avatars.store_local'))
- ];
- if(!$storage['cloud'] && !$storage['local']) {
- return;
- }
- $disk = self::disk();
- if(!$disk) {
- return;
- }
- $base = ($storage['cloud'] == false ? 'public/cache/' : 'cache/') . 'avatars/';
- try {
- $exists = $disk->directoryExists($base . $avatar->profile_id);
- } catch (
- UnableToRetrieveMetadata |
- UnableToCheckDirectoryExistence |
- Exception $e
- ) {
- return;
- }
- if(!$exists) {
- return;
- }
- $files = collect($disk->allFiles($base . $avatar->profile_id));
- if(!$files || !$files->count() || $files->count() === 1) {
- return;
- }
- if($files->count() > 5) {
- AvatarStorageLargePurge::dispatch($avatar)->onQueue('mmo');
- return;
- }
- $curFile = Str::of($avatar->cdn_url)->explode('/')->last();
- $files = $files->filter(function($f) use($curFile) {
- return !$curFile || !str_ends_with($f, $curFile);
- })->each(function($name) use($disk) {
- $disk->delete($name);
- });
- return;
- }
- }
|