| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <?php
- namespace App\Services;
- use App\Enums\ApprovalStatusEnum;
- use App\Exceptions\FavoriteProviderException;
- use App\Http\Resources\ClientFavoriteProviderResource;
- use App\Models\ClientFavoriteProvider;
- use App\Models\ClientProviderBlock;
- use App\Models\Provider;
- use App\Models\ProviderClientBlock;
- use Illuminate\Database\Eloquent\Collection;
- use Illuminate\Support\Facades\DB;
- class ClientFavoriteProviderService
- {
- public function getByClientId(int $clientId): Collection
- {
- return ClientFavoriteProvider::where('client_favorite_providers.client_id', $clientId)
- ->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();
- }
- }
|