with('provider.profileMedia') ->leftJoin('providers', 'providers.id', '=', 'client_favorite_providers.provider_id') ->whereExists(Provider::hasActivePrimaryBankAccount()) ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id') ->leftJoin('addresses as provider_address', function ($join) { $join->on('provider_address.source_id', '=', 'providers.id') ->where('provider_address.source', 'provider') ->whereNull('provider_address.deleted_at'); }) ->leftJoin('cities', 'cities.id', '=', 'provider_address.city_id') ->select( 'client_favorite_providers.id', 'client_favorite_providers.client_id', 'client_favorite_providers.provider_id', 'client_favorite_providers.notes', 'client_favorite_providers.created_at', 'client_favorite_providers.updated_at', 'provider_user.name as provider_name', 'providers.gender', 'providers.average_rating', 'providers.daily_price_8h', 'providers.daily_price_6h', 'providers.daily_price_4h', 'providers.daily_price_2h', 'providers.total_services', 'cities.name as city_name', ) ->orderBy('client_favorite_providers.created_at', 'desc') ->get(); } public function getById(int $id): ClientFavoriteProviderResource { $favorite = ClientFavoriteProvider::with(['provider.user', 'provider.profileMedia'])->findOrFail($id); return new ClientFavoriteProviderResource($favorite); } public function create(array $data): ClientFavoriteProviderResource { $favorite = ClientFavoriteProvider::create($data); $favorite->load(['provider.user', 'provider.profileMedia']); return new ClientFavoriteProviderResource($favorite); } public function update(int $id, array $data): ClientFavoriteProviderResource { $favorite = ClientFavoriteProvider::findOrFail($id); $favorite->update($data); $favorite->load(['provider.user', 'provider.profileMedia']); return new ClientFavoriteProviderResource($favorite); } public function delete(int $id): bool { $favorite = ClientFavoriteProvider::findOrFail($id); return $favorite->delete(); } // public function createByCode(int $clientId, string $code): ClientFavoriteProviderResource { $code = Provider::normalizeShareCode($code); $provider = Provider::query() ->where('share_code', $code) ->where('approval_status', ApprovalStatusEnum::ACCEPTED->value) ->visibleToCustomers() ->with(['user', 'profileMedia']) ->first(); if (! $provider) { throw new FavoriteProviderException('favorite_code_not_found', 404); } $isBlocked = ProviderClientBlock::where('provider_id', $provider->id) ->where('client_id', $clientId) ->exists() || ClientProviderBlock::where('client_id', $clientId) ->where('provider_id', $provider->id) ->exists(); if ($isBlocked) { throw new FavoriteProviderException('favorite_code_blocked'); } $favorite = DB::transaction(function () use ($clientId, $provider) { $alreadyFavorite = ClientFavoriteProvider::where('client_id', $clientId) ->where('provider_id', $provider->id) ->exists(); if ($alreadyFavorite) { throw new FavoriteProviderException('favorite_code_already_favorite'); } $removed = ClientFavoriteProvider::onlyTrashed() ->where('client_id', $clientId) ->where('provider_id', $provider->id) ->latest('id') ->first(); if ($removed) { $removed->restore(); return $removed; } return ClientFavoriteProvider::create([ 'client_id' => $clientId, 'provider_id' => $provider->id, ]); }); $favorite->setRelation('provider', $provider); return new ClientFavoriteProviderResource($favorite); } // public function getFavoritedProviderIds(int $clientId): array { return ClientFavoriteProvider::where('client_id', $clientId) ->pluck('provider_id') ->toArray(); } }