/** * L'utente inizia la ricerca. * Input: * - Cordinate dell'utente nel momento della richiesta * Output: * - Dettagli di ricerca * * * @param Request $request * * @return \Illuminate\Http\JsonResponse * @throws Exception */ public function begin(Request $request) { try { $this->validate($request, ['geoLocalization.latitude' => 'required|regex:/^(-)?[0-9]{1,3}\\.[0-9]{1,7}+$/', 'geoLocalization.longitude' => 'required|regex:/^(-)?[0-9]{1,3}\\.[0-9]{1,7}+$/']); } catch (ValidationException $e) { $errors = $e->getErrors(); return parent::response([], $errors); } $data = $request->only(['geoLocalization.latitude', 'geoLocalization.longitude']); $user = $this->getAuthenticatedUser(); if ($user === null) { // Utente non autorizzato abort(403); } $this->checkIfUserCanLaunchSearch($user); // Creo istanza di ricerca $search = new Search(); $search->user_id = $user->id; $search->max_duration = 600; // 10 minuti //$user->max_duration; $search->max_distance = 10000; // 10.000 KM //$user->max_distance; $search->geo_latitude = $data['geoLocalization']['latitude']; $search->geo_longitude = $data['geoLocalization']['longitude']; $search->ip = $request->ip(); $search->save(); // Aggiorno posizione dell'utente $user->geo_last_update = new Carbon(); $user->geo_latitude = $data['geoLocalization']['latitude']; $user->geo_longitude = $data['geoLocalization']['longitude']; // Creo una nuova lista di ricerca $search->createNewList(); // Si inizia! $inProgress = $this->process($search); if ($inProgress === true) { // Aggiorno status dell'utente $user->status = User::STATUS_SEARCHING; } // Salvo l'utente $user->save(); return parent::response(['search' => $search, 'inProgress' => $inProgress, 'nextKeepAlive' => Search::KEEP_ALIVE_INTERVAL]); }