ActivityPublishJob.php 1.8 KB
<?php

namespace App\Jobs;

use App\Helpers\ServiceHelper;
use App\Models\Activity;
use App\Models\UserHasTag;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Redis;

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

    public Activity $activity;

    public array $pushType;

    public array $pushUser;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Activity $activity, array $pushType, array $pushUser = [])
    {
        $this->activity = $activity;
        $this->pushType = $pushType;
        $this->pushUser = $pushUser;
    }

    /**
     * @return int[]
     */
    protected function getTagUserIds(): array
    {
        return UserHasTag::query()
            ->whereIn('tag_id', data_get($this->activity, 'expand.tag_ids', []))
            ->pluck('user_id')->toArray();
    }

    /**
     * Execute the job.
     *
     * @return void
     * @throws \JsonException
     * @throws \RedisException
     */
    public function handle(): void
    {
        $userIds = [];

        foreach ($this->pushType as $item) {
            if ($item === 'tag') {
                $userIds += $this->getTagUserIds();
            }
            if ($item === 'user') {
                $userIds += $this->pushUser;
            }
        }

        $userIds = array_values(array_unique($userIds, SORT_NUMERIC));

        Redis::client()->hSet('activity_publish', $this->activity->getKey(), json_encode($userIds, JSON_THROW_ON_ERROR));
        ServiceHelper::send('ActivityPublish', ['activityId' => $this->activity->getKey()]);
    }
}