pixelfed/pixelfed

View on GitHub
app/Jobs/AvatarPipeline/RemoteAvatarFetch.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

namespace App\Jobs\AvatarPipeline;

use App\Avatar;
use App\Profile;
use App\Services\MediaStorageService;
use App\Util\ActivityPub\Helpers;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class RemoteAvatarFetch implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $profile;

    /**
     * Delete the job if its models no longer exist.
     *
     * @var bool
     */
    public $deleteWhenMissingModels = true;

    /**
     * The number of times the job may be attempted.
     *
     * @var int
     */
    public $tries = 1;

    public $timeout = 300;

    public $maxExceptions = 1;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Profile $profile)
    {
        $this->profile = $profile;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $profile = $this->profile;

        if ((bool) config_cache('pixelfed.cloud_storage') == false && (bool) config_cache('federation.avatars.store_local') == false) {
            return 1;
        }

        if ($profile->domain == null || $profile->private_key) {
            return 1;
        }

        $avatar = Avatar::whereProfileId($profile->id)->first();

        if (! $avatar) {
            $avatar = new Avatar;
            $avatar->profile_id = $profile->id;
            $avatar->save();
        }

        if ($avatar->media_path == null && $avatar->remote_url == null) {
            $avatar->media_path = 'public/avatars/default.jpg';
            $avatar->is_remote = true;
            $avatar->save();
        }

        $person = Helpers::fetchFromUrl($profile->remote_url);

        if (! $person || ! isset($person['@context'])) {
            return 1;
        }

        if (! isset($person['icon']) ||
            ! isset($person['icon']['type']) ||
            ! isset($person['icon']['url'])
        ) {
            return 1;
        }

        if ($person['icon']['type'] !== 'Image') {
            return 1;
        }

        if (! Helpers::validateUrl($person['icon']['url'])) {
            return 1;
        }

        $icon = $person['icon'];

        $avatar->remote_url = $icon['url'];
        $avatar->save();

        MediaStorageService::avatar($avatar, (bool) config_cache('pixelfed.cloud_storage') == false, true);

        return 1;
    }
}