Files
Global-Jain/app/Repositories/Api/Access/Request/RequestRepository.php
2025-11-05 10:37:10 +05:30

666 lines
27 KiB
PHP

<?php
namespace App\Repositories\Api\Access\Request;
use App\Models\User;
use App\Models\Request;
use App\Constant\Constant;
use App\Jobs\Notifications\Shravak\SendAcceptFriendRequest;
use App\Jobs\Notifications\Shravak\SendFriendRequest;
use App\Models\UserDeviceToken;
use Illuminate\Support\Facades\Log;
use App\Traits\PushNotificationTraits;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Collection;
use App\Models\Notifications;
use Illuminate\Support\Facades\DB;
class RequestRepository implements RequestInterface
{
use PushNotificationTraits;
/**
* @var User
*/
protected $user;
/**
* @var Request
*/
protected $request;
/**
* @var UserDeviceToken
*/
protected $userDeviceToken;
/**
* @param User $user
* @param Request $request
* @param UserDeviceToken $userDeviceToken
* RequestRepository constructor.
*
*/
public function __construct(User $user, Request $request, UserDeviceToken $userDeviceToken)
{
$this->user = $user;
$this->request = $request;
$this->userDeviceToken = $userDeviceToken;
}
/**
* @return array
*/
public function sendFriendRequest(array $data)
{
$response = [];
$user = [];
try {
$loggedInUser = loggedInUser();
$user = $this->user->query()->find($loggedInUser->id);
$receiver = $this->user->where('id', $data['receiver_id'])->first();
//Check if request is exist
$requestExist = $this->request->query()->where([
'receiver_id' => $data['receiver_id']
])->where([
'sender_id' => $loggedInUser->id,
])->where('status', '!=', Constant::STATUS_TWO)->first();
if (!empty($loggedInUser)) {
if ($data['receiver_id'] == $loggedInUser->id || $requestExist) {
$response['message'] = trans('auth.request.request_already_sent');
$response['status'] = Constant::CODE_403;
} else {
$receiverId = (array) $data['receiver_id'];
$pivotData = array_fill(Constant::STATUS_ZERO, count($receiverId), ['status' => Constant::STATUS_ZERO]);
$syncData = array_combine($receiverId, $pivotData);
$user->friendRequests()->attach($syncData);
// Delete previous friend request
$friendRequestExist = Notifications::whereIn('user_id', [$receiver->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $loggedInUser->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
//Push Notification
dispatch(new SendFriendRequest($loggedInUser, $receiver));
$response['message'] = trans('auth.request.friend_request_success');
$response['status'] = Constant::CODE_200;
}
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_403;
}
return $response;
}
/**
* @return array
*/
public function acceptFriendRequest(array $data)
{
$response = [];
try {
$loggedInUser = loggedInUser();
$receiver = $this->user->where('id', $data['receiver_id'])->first();
//Check if request is exist
$requestExist = $this->request->query()->where([
'receiver_id' => $loggedInUser->id,
'sender_id' => $data['receiver_id'],
])->first();
$senderId = $this->request->query()->where([
'receiver_id' => $data['receiver_id'],
'sender_id' => $loggedInUser->id
])->first();
if (!empty($loggedInUser)) {
if (!empty($requestExist) || !empty($senderId)) {
if ($requestExist && $data['status'] != Constant::STATUS_TWO) {
$requestExist->status = $data['status'];
$requestExist->save();
//Delete previous notification
$friendRequestExist = Notifications::whereIn('user_id', [$loggedInUser->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $receiver->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
//Push Notification
dispatch(new SendAcceptFriendRequest($loggedInUser, $receiver));
$response['status'] = Constant::CODE_200;
$response['message'] = trans('auth.request.friend_request_accept');
}
if ($senderId && $data['status'] != Constant::STATUS_TWO) {
$senderId->status = $data['status'];
$senderId->save();
//Delete previous notification
$friendRequestExist = Notifications::whereIn('user_id', [$receiver->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $loggedInUser->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
//Push Notification
dispatch(new SendAcceptFriendRequest($loggedInUser, $receiver));
$response['status'] = Constant::CODE_200;
$response['message'] = trans('auth.request.friend_request_accept');
}
//Delete requests if declined
if (isset($data['status']) && $data['status'] == Constant::STATUS_TWO && $requestExist && $senderId) {
$friendRequestExist = Notifications::whereIn('user_id', [$receiver->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $loggedInUser->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
// Delete notification when user revert friend request
$revertFriendRequestExist = Notifications::whereIn('user_id', [$loggedInUser->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $receiver->id);
if ($revertFriendRequestExist->first()) {
$revertFriendRequestExist->delete();
}
$requestExist->delete();
$senderId->delete();
$response['status'] = Constant::CODE_200;
$response['message'] = trans('auth.request.friend_request_decline');
} else if (isset($data['status']) && $data['status'] == Constant::STATUS_TWO && $requestExist) {
$friendRequestExist = Notifications::whereIn('user_id', [$receiver->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $loggedInUser->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
// Delete notification when user revert friend request
$revertFriendRequestExist = Notifications::whereIn('user_id', [$loggedInUser->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $receiver->id);
if ($revertFriendRequestExist->first()) {
$revertFriendRequestExist->delete();
}
$requestExist->delete();
$response['status'] = Constant::CODE_200;
$response['message'] = trans('auth.request.friend_request_decline');
} else if (isset($data['status']) && $data['status'] == Constant::STATUS_TWO && $senderId) {
$friendRequestExist = Notifications::whereIn('user_id', [$receiver->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $loggedInUser->id);
if ($friendRequestExist->first()) {
$friendRequestExist->delete();
}
// Delete notification when user revert friend request
$revertFriendRequestExist = Notifications::whereIn('user_id', [$loggedInUser->id])
->where('type', 'FriendRequest')
->whereJsonContains('extra_fields->from_id', $receiver->id);
if ($revertFriendRequestExist->first()) {
$revertFriendRequestExist->delete();
}
$senderId->delete();
$response['status'] = Constant::CODE_200;
$response['message'] = trans('auth.request.friend_request_decline');
}
} else {
$response['message'] = trans('auth.request.request_not_found');
$response['status'] = Constant::CODE_403;
}
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function listFriendRequest()
{
$response = [];
try {
$loggedInUser = loggedInUser();
if (!empty($loggedInUser)) {
$requests = $this->request->with('receivedUsers')->where([
'receiver_id' => $loggedInUser->id,
'status' => Constant::STATUS_ZERO
])->get()->toArray();
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function myListFriendRequest(array $data)
{
$response = [];
try {
$loggedInUser = loggedInUser();
if (!empty($loggedInUser)) {
$requests = $this->request->with('receivedUsers')->where([
'receiver_id' => $loggedInUser->id,
'status' => Constant::STATUS_ZERO
])->latest()->paginate($data['limit'] ?? 10, ['*'], 'page', $data['page'] ?? 1);
unreadFriendRequestCounter($loggedInUser->id, Constant::STATUS_ZERO); //Set shravak pending req badge to default state
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function sentRequestList()
{
$response = [];
try {
$loggedInUser = loggedInUser();
if (!empty($loggedInUser)) {
$requests = $this->request->with('sentUsers')->where([
'sender_id' => $loggedInUser->id,
'status' => Constant::STATUS_ZERO
])->latest()->get()->toArray();
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function mySentRequestList(array $data)
{
$response = [];
try {
$loggedInUser = loggedInUser();
if (!empty($loggedInUser)) {
$requests = $this->request->with('sentUsers')->where([
'sender_id' => $loggedInUser->id,
'status' => Constant::STATUS_ZERO
])->latest()->paginate($data['limit'] ?? 10, ['*'], 'page', $data['page'] ?? 1);
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function friendList($data)
{
$response = [];
$alreadyTaggedId = [];
try {
$loggedInUser = loggedInUser();
$sentRequests = $loggedInUser->friendRequests();
$receivedRequests = $loggedInUser->myFriendRequests();
if (!empty($loggedInUser)) {
//If already tagged user
if (isset($data['already_tagged']) && !empty($data['already_tagged'])) {
$alreadyTaggedId = $data['already_tagged'];
if (isset($data['name']) && !empty($data['name'])) {
$sentRequests = $sentRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$sentRequests = $sentRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->whereNotIn('users.id', $alreadyTaggedId)
->get();
if (isset($data['name']) && !empty($data['name'])) {
$receivedRequests = $receivedRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$receivedRequests = $receivedRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->whereNotIn('users.id', $alreadyTaggedId)
->get();
} else {
if (isset($data['name']) && !empty($data['name'])) {
$sentRequests = $sentRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$sentRequests = $sentRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
if (isset($data['name']) && !empty($data['name'])) {
$receivedRequests = $receivedRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$receivedRequests = $receivedRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
}
$requests = $sentRequests->merge($receivedRequests);
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function myFriendList($data)
{
$response = [];
$alreadyTaggedId = [];
try {
$loggedInUser = loggedInUser();
$sentRequests = $loggedInUser->friendRequests();
$receivedRequests = $loggedInUser->myFriendRequests();
if (!empty($loggedInUser)) {
//If already tagged user
if (isset($data['already_tagged']) && !empty($data['already_tagged'])) {
$alreadyTaggedId = $data['already_tagged'];
if (isset($data['name']) && !empty($data['name'])) {
$sentRequests = $sentRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$sentRequests = $sentRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->whereNotIn('users.id', $alreadyTaggedId)
->get();
if (isset($data['name']) && !empty($data['name'])) {
$receivedRequests = $receivedRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$receivedRequests = $receivedRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->whereNotIn('users.id', $alreadyTaggedId)
->get();
} else {
if (isset($data['name']) && !empty($data['name'])) {
$sentRequests = $sentRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$sentRequests = $sentRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
if (isset($data['name']) && !empty($data['name'])) {
$receivedRequests = $receivedRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$receivedRequests = $receivedRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
}
$requests = $sentRequests->merge($receivedRequests);
$response['data'] = $this->paginate($requests, $data['limit'] ?? 10, $data['page'] ?? Constant::STATUS_ONE, request());
// $response['data'] = new Paginator($requests, $data['limit'] ?? Constant::PAGINATE_LIMIT);
unreadShravakMenuCounter($loggedInUser->id, Constant::STATUS_ZERO); //Set shravak menu badge to default state
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* @return array
*/
public function userFriendList($data, $user)
{
$response = [];
$alreadyTaggedId = [];
try {
$loggedInUser = loggedInUser();
$sentRequests = $user->friendRequests();
$receivedRequests = $user->myFriendRequests();
if (!empty($loggedInUser)) {
if (isset($data['name']) && !empty($data['name'])) {
$sentRequests = $sentRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$sentRequests = $sentRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
if (isset($data['name']) && !empty($data['name'])) {
$receivedRequests = $receivedRequests->where('name', 'LIKE', "%{$data['name']}%");
}
$receivedRequests = $receivedRequests->with('userDetail')
->select('users.id', 'users.name', 'users.avatar')
->where('requests.status', Constant::STATUS_ONE)
->get();
$requests = $sentRequests->merge($receivedRequests);
$requests = $this->paginate($requests, $data['limit'] ?? 10, $data['page'] ?? Constant::STATUS_ONE, $data);
$response['data'] = $requests;
$response['status'] = Constant::CODE_200;
} else {
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('auth.something_went_wrong');
$response['status'] = Constant::CODE_401;
}
return $response;
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
public function paginate($items, $perPage = Constant::PAGINATE_LIMIT, $page = null, $request)
{
$page = $page ?: (Paginator::resolveCurrentPage() ?: Constant::STATUS_ONE);
$items = $items instanceof Collection ? $items : Collection::make($items);
// return new LengthAwarePaginator(array_slice(array_values($items), $offset, $perPage, true), count($items), $perPage, $page, ['path' => $request->url(), 'query' => $request->query()]);
return new LengthAwarePaginator($items->forPage($page, $perPage)->values(), $items->count(), $perPage, $page, ['path' => $request->url(), 'query' => $request->query()]);
}
/**
* @return array
*/
public function friendSuggestion($data)
{
$response = [
'status' => Constant::CODE_403,
'error' => trans('api.something_went_wrong'),
'success' => Constant::STATUS_FALSE
];
try {
$user = loggedInUser();
$myFriendsList = DB::table('requests')
// ->select(GROUP_CONCAT(CONCAT(sender_id,',',receiver_id)))
->select(DB::raw("group_concat(CONCAT(sender_id,',',receiver_id)) as myfriend"))
->where('status', Constant::STATUS_ONE)
->where(function ($query) {
$query->where('sender_id', loggedInUser()->id)
->orWhere('receiver_id', loggedInUser()->id);
})
->first();
$senderRequest = Request::select('receiver_id as user_id')->where(function ($query) {
$query->where('sender_id', loggedInUser()->id);
});
$reciveRequest = Request::select('sender_id as user_id')->where(function ($query) {
$query->where('receiver_id', loggedInUser()->id);
})->union($senderRequest);
$myFriendListIds = $reciveRequest->pluck('user_id')->toArray();
// get users
$friendSuggestion = DB::select("select DISTINCT users.id from (SELECT receiver_id as user_id
FROM requests WHERE sender_id IN (".$myFriendsList->myfriend.") AND sender_id != 1 AND receiver_id != 1 AND status = 1 union all SELECT sender_id as user_id
FROM requests WHERE receiver_id IN (".$myFriendsList->myfriend.") AND sender_id != 1 AND receiver_id != 1 AND status = 1 ) a
join users on users.id = a.user_id where users.id NOT IN (".implode(',', $myFriendListIds).") ");
$collection = collect($friendSuggestion)->pluck('id')->toArray();
$friendSuggestion = User::whereIn('id', $collection)->where('id', '!=', loggedInUser()->id);
$response['data'] = $friendSuggestion->paginate($data['limit'] ?? 10, ['*'], 'page', $data['page'] ?? 1);
// $response['data'] = $this->paginate($friendSuggestion, $data['limit'] ?? 10, $data['page'] ?? Constant::STATUS_ONE, request());
$response['status'] = Constant::CODE_200;
$response['success'] = Constant::STATUS_TRUE;
$response['message'] = trans('api.sant.unfollow');
unset($response['error']);
} catch (\Exception $ex) {
Log::error($ex);
$response['message'] = trans('api.something_went_wrong');
$response['status'] = Constant::CODE_403;
}
return $response;
}
}