/** * 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}"); } }