ClientFavoriteProviderService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace App\Services;
  3. use App\Http\Resources\ClientFavoriteProviderResource;
  4. use App\Models\ClientFavoriteProvider;
  5. use Illuminate\Database\Eloquent\Collection;
  6. class ClientFavoriteProviderService
  7. {
  8. public function getByClientId(int $clientId): Collection
  9. {
  10. return ClientFavoriteProvider::where('client_favorite_providers.client_id', $clientId)
  11. ->leftJoin('providers', 'providers.id', '=', 'client_favorite_providers.provider_id')
  12. ->whereNotNull('providers.recipient_default_bank_account')
  13. ->whereRaw("providers.recipient_default_bank_account::text <> '{}'")
  14. ->whereRaw("providers.recipient_default_bank_account::text <> '[]'")
  15. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  16. ->leftJoin('media as provider_profile_media', 'provider_profile_media.id', '=', 'providers.profile_media_id')
  17. ->leftJoin('addresses as provider_address', function ($join) {
  18. $join->on('provider_address.source_id', '=', 'providers.id')
  19. ->where('provider_address.source', 'provider')
  20. ->whereNull('provider_address.deleted_at');
  21. })
  22. ->leftJoin('cities', 'cities.id', '=', 'provider_address.city_id')
  23. ->select(
  24. 'client_favorite_providers.id',
  25. 'client_favorite_providers.client_id',
  26. 'client_favorite_providers.provider_id',
  27. 'client_favorite_providers.notes',
  28. 'client_favorite_providers.created_at',
  29. 'client_favorite_providers.updated_at',
  30. 'provider_user.name as provider_name',
  31. 'providers.gender',
  32. 'provider_profile_media.path as profile_media_path',
  33. 'providers.average_rating',
  34. 'providers.daily_price_8h',
  35. 'providers.daily_price_6h',
  36. 'providers.daily_price_4h',
  37. 'providers.daily_price_2h',
  38. 'providers.total_services',
  39. 'cities.name as city_name',
  40. )
  41. ->orderBy('client_favorite_providers.created_at', 'desc')
  42. ->get();
  43. }
  44. public function getById(int $id): ClientFavoriteProviderResource
  45. {
  46. $favorite = ClientFavoriteProvider::with(['provider.user', 'provider.profileMedia'])->findOrFail($id);
  47. return new ClientFavoriteProviderResource($favorite);
  48. }
  49. public function create(array $data): ClientFavoriteProviderResource
  50. {
  51. $favorite = ClientFavoriteProvider::create($data);
  52. $favorite->load(['provider.user', 'provider.profileMedia']);
  53. return new ClientFavoriteProviderResource($favorite);
  54. }
  55. public function update(int $id, array $data): ClientFavoriteProviderResource
  56. {
  57. $favorite = ClientFavoriteProvider::findOrFail($id);
  58. $favorite->update($data);
  59. $favorite->load(['provider.user', 'provider.profileMedia']);
  60. return new ClientFavoriteProviderResource($favorite);
  61. }
  62. public function delete(int $id): bool
  63. {
  64. $favorite = ClientFavoriteProvider::findOrFail($id);
  65. return $favorite->delete();
  66. }
  67. //
  68. public function getFavoritedProviderIds(int $clientId): array
  69. {
  70. return ClientFavoriteProvider::where('client_id', $clientId)
  71. ->pluck('provider_id')
  72. ->toArray();
  73. }
  74. }