/** * Ritorna la lista degli abbracci effettuati dall'utente. * Gestisce anche la paginazione automaticamente. * * @param Request $request * * @return \Illuminate\Http\JsonResponse */ public function getList(Request $request) { $user = $this->getAuthenticatedUser(); $hugs = Hug::where(function ($query) use($request) { /** * @var Builder $query */ $query->whereNull('closed_at')->orWhere(function ($query) { /** * @var Builder $query */ $query->whereNotNull('closed_at')->where('closed_at', '>=', Carbon::now()->subHours(24)->toDateTimeString()); // Abbracci conclusi }); })->where(function ($query) use($user) { /** * @var Builder $query */ $query->where('user_seeker_id', '=', $user->id)->orWhere('user_sought_id', '=', $user->id); })->paginate(20); $response = json_decode($hugs->toJson()); $response->list = $response->data; unset($response->data); return parent::response($response); }
/** * Serve per rinnovare il checkIn da parte di utente quando l'abbraccio è in corso. * * @param Hug $hug * @param User $user */ private function checkIn(Hug $hug, User $user) { if ($user->id == $hug->user_seeker_id) { $hug->user_seeker_last_checkin = Carbon::now()->toDateTimeString(); } else { $hug->user_sought_last_checkin = Carbon::now()->toDateTimeString(); } $hug->save(); }
/** * Controlla se l'utente può avviare la ricerca. * * Un utente non può avviare una ricerca quando: * - Ha già una ricerca in corso. * - Ha già un abbraccio in corso * - Non ha lasciato il feedback per un'altro abbraccio concluso. * * @param User $user * * @throws UserCannotLaunchSearchException */ private function checkIfUserCanLaunchSearch(User $user) { $search = Search::whereUserId($user->id)->whereNull('finished_at')->first(); if ($search instanceof Search) { throw new UserCannotLaunchSearchException("Un'altra ricerca è in corso - Search id: {$search->id}"); } $hug = Hug::whereNull('closed_at')->where(function ($query) use($user) { /** * @var Builder $query */ $query->where('user_seeker_id', '=', $user->id)->orWhere('user_sought_id', '=', $user->id); })->first(); if ($hug instanceof Hug) { throw new UserCannotLaunchSearchException("E' coinvolto in un'altro abbraccio - Hug id: {$hug->id}"); } $hugWithOutFeedBack = DB::table('hugs AS HUG')->leftJoin('user_hug_feedbacks AS FEEDBACK_AS_SEEKER', function ($join) { /** * @var JoinClause $join */ $join->on('HUG.user_seeker_id', '=', 'FEEDBACK_AS_SEEKER.user_id')->on('HUG.id', '=', 'FEEDBACK_AS_SEEKER.hug_id'); })->leftJoin('user_hug_feedbacks AS FEEDBACK_AS_SOUGHT', function ($join) { /** * @var JoinClause $join */ $join->on('HUG.user_sought_id', '=', 'FEEDBACK_AS_SOUGHT.user_id')->on('HUG.id', '=', 'FEEDBACK_AS_SOUGHT.hug_id'); })->whereNotNull('HUG.closed_at')->whereNull('FEEDBACK_AS_SEEKER.id')->whereNull('FEEDBACK_AS_SOUGHT.id')->where(function ($query) use($user) { /** * @var Builder $query */ $query->where('HUG.user_seeker_id', '=', $user->id)->orWhere('HUG.user_sought_id', '=', $user->id); })->first(['HUG.*']); if (!empty($hugWithOutFeedBack)) { throw new UserCannotLaunchSearchException("Non ha lasciato il feedback per un abbraccio concluso - Hug id: {$hugWithOutFeedBack->id}"); } }