/** * Si occupa di processera la lista della ricerca estraendo un nuovo utente disponibile. * * Se trova un utente si occupa di contattarlo. * Termina la ricerca e ritorna falso qualora non venga trovato alcun utente per la lista. * * @param Search $search * * @return bool Vero se la ricerca sta proseguendo, falso se è terminata */ protected function process($search) { // E' una ricerca conclusa? if ($search->isFinished()) { return false; } // Flush dell'ultimo fetch $search->flushLastFetch(); // Verifico che la ricerca non abbia superato il massimo tempo consentito $searchingFor = Carbon::now()->diffInSeconds(Carbon::createFromFormat('Y-m-d H:i:s', $search->created_at), true); if ($searchingFor >= $search->max_duration) { // Termino la ricerca $this->finish($search, self::FINISH_STATUS_TIMEOUT); return false; } $newListCreated = false; // Verifico se la lista è "troppo vecchia" $list = $search->getLastList(); $listDateDiff = Carbon::now()->diffInSeconds(Carbon::createFromFormat('Y-m-d H:i:s', $list->created_at)); if ($listDateDiff > SearchList::OLD_LIST_AFTER_SECONDS) { // Creo una nuova lista $search->createNewList(); $newListCreated = true; } // Estraggo un utente $user = $search->fetchUser(); if (empty($user)) { // Nessun utente trovato // Se la lista non è stata appena creata, provo a crearne un'altra e a fare un nuovo fetch if ($newListCreated === false) { $search->createNewList(); $user = $search->fetchUser(); } } if ($user instanceof User) { // Utente trovato, contattiamolo $this->contactFetchedUser($search, $user); return true; } else { // Non ho trovato nessun utente, termino la ricerca $this->finish($search, static::FINISH_STATUS_NOT_SUCCESSFUL); return false; } }