Edit File: FriendService.php
<?php namespace App\Services\User; use App\Models\{User, SearchHistory, FriendRequest}; class FriendService { public function myRequests($paginateNum) { $receivedRequests = auth()->user() ->receivedFriendRequests() ->pending() ->with('sender:id,first_name,last_name,image') ->latest() ->paginate($paginateNum); return $receivedRequests; } //---------------------------------------------------------------------------------------------------------------------------- public function myRequestsCount() { return auth()->user() ->receivedFriendRequests() ->pending() ->count(); } //---------------------------------------------------------------------------------------------------------------------------- public function myFriends($paginateNum) { $userLat = auth()->user()->lat; $userLng = auth()->user()->lng; return FriendRequest::whereFriend() ->with('sender:id,first_name,last_name,image', 'receiver:id,first_name,last_name,image') ->join('users as sender', 'sender.id', '=', 'friend_requests.user_id') ->join('users as receiver', 'receiver.id', '=', 'friend_requests.friend_id') ->selectRaw(" friend_requests.*, COALESCE(sender.lat, receiver.lat) as friend_lat, COALESCE(sender.lng, receiver.lng) as friend_lng, (6371 * acos( cos(radians(?)) * cos(radians(COALESCE(sender.lat, receiver.lat))) * cos(radians(COALESCE(sender.lng, receiver.lng)) - radians(?)) + sin(radians(?)) * sin(radians(COALESCE(sender.lat, receiver.lat))) )) AS distance ", [ $userLat, $userLng, $userLat ]) ->orderBy('distance', 'ASC') // ترتيب الأصدقاء حسب القرب ->latest('friend_requests.created_at') ->paginate($paginateNum); } //---------------------------------------------------------------------------------------------------------------------------- public function myFriendsCount() { return auth()->user()->friends()->count(); } //---------------------------------------------------------------------------------------------------------------------------- public function showFriend($id) { return User::where('id', '!=', auth()->id()) ->with('interestOptions') ->findOrFail($id); } //---------------------------------------------------------------------------------------------------------------------------- public function switchRequest($friend_id) { if (!User::where('id', $friend_id)->exists()) { return $this->response('fail', __('apis.user_not_found'), null); } // البحث عن طلب الصداقة سواء كان مرسلًا أو واردًا $friendRequest = FriendRequest::where(function ($q) use ($friend_id) { $q->where('user_id', auth()->id()) ->where('friend_id', $friend_id); }) ->orWhere(function ($q) use ($friend_id) { $q->where('user_id', $friend_id) ->where('friend_id', auth()->id()); }) ->first(); // إذا كان طلب الصداقة موجودًا if ($friendRequest) { if (!$friendRequest->is_accepted) { // إذا كان الطلب لم يتم قبوله بعد (رفض الطلب) $msg = __('apis.friend_request_rejected'); $status = 'rejected'; } else { // إذا كان الطلب مقبولًا (إلغاء الصداقة) $msg = __('apis.friend_request_canceled'); $status = 'canceled'; } $friendRequest->delete(); return $this->response('success', $msg, $status); } // إرسال طلب صداقة جديد auth()->user()->sentFriendRequests()->create(['friend_id' => $friend_id]); return $this->response('success', __('apis.friend_request_sent'), 'sent'); } //---------------------------------------------------------------------------------------------------------------------------- public function acceptRequest($request_id) { $request = $this->findRequest($request_id); $request->update(['is_accepted' => true]); return $this->response('success', __('apis.friend_request_accepted')); } //---------------------------------------------------------------------------------------------------------------------------- public function rejectRequest($request_id) { $request = $this->findRequest($request_id); $request->delete(); return $this->response('success', __('apis.friend_request_rejected')); } //---------------------------------------------------------------------------------------------------------------------------- public function getAll($paginateNum) { return $this->getUsersQuery() ->inRandomOrder() ->paginate($paginateNum); } //---------------------------------------------------------------------------------------------------------------------------- public function filter($filter = [], $paginateNum) { $users = $this->getUsersQuery() ->filter($filter) ->paginate($paginateNum); if (request('name') && auth()->check()) { $this->storeSearchHistory(request('name')); } return $users; } //---------------------------------------------------------------------------------------------------------------------------- public function report($request) { auth()->user()->reports()->create($request); return $this->response('success', __('apis.report_sent')); } //---------------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------------- //helper methods //---------------------------------------------------------------------------------------------------------------------------- public function storeSearchHistory($searchQuery) { $maxSearches = 5; $searchCount = SearchHistory::where('user_id', auth()->id())->count(); if ($searchCount >= $maxSearches) { SearchHistory::where('user_id', auth()->id()) ->orderBy('created_at', 'asc') ->first() ->delete(); } SearchHistory::create([ 'user_id' => auth()->id(), 'search_query' => $searchQuery, ]); } /** * Get the base query for user details. * * @return \Illuminate\Database\Eloquent\Builder */ protected function findRequest($request_id) { return auth()->user()->receivedFriendRequests() ->pending() ->findOrFail($request_id); } /** * Get the base query for users. * * @return \Illuminate\Database\Eloquent\Builder */ protected function getUsersQuery() { return User::when(auth()->check(), function ($query) { return $query->where('id', '!=', auth()->id()); }); } protected function response($key, $msg, $data = []) { return [ 'key' => $key, 'msg' => $msg, 'data' => $data ]; } }
Back to File Manager