9a64f526创建于 2025年8月20日历史提交
<?php

namespace App\Builders;

use App\Builders\Concerns\CanScopeByUser;
use App\Models\User;
use LogicException;

class RadioStationBuilder extends FavoriteableBuilder
{
    use CanScopeByUser;

    private function accessible(): self
    {
        throw_unless($this->user, new LogicException('User must be set to query accessible radio stations.'));

        if (!$this->user->preferences->includePublicMedia) {
            // If the user does not want to include public media, we only return stations created by them.
            return $this->whereBelongsTo($this->user);
        }

        // otherwise, we return stations that are created by the user in the same organization.
        return $this->join('users', 'users.id', '=', 'radio_stations.user_id')
            ->join('organizations', 'organizations.id', '=', 'users.organization_id')
            ->where(function (self $builder): void {
                $builder->where('radio_stations.user_id', $this->user->id)
                    ->orWhere(function (self $query): void {
                        $query->where('radio_stations.is_public', true)
                            ->where('organizations.id', $this->user->organization_id);
                    });
            });
    }

    public function withUserContext(
        User $user,
        bool $includeFavoriteStatus = true,
        bool $favoritesOnly = false,
    ): self {
        $this->user = $user;

        return $this->accessible()
            ->when($includeFavoriteStatus, static fn (self $query) => $query->withFavoriteStatus($favoritesOnly));
    }
}