Ejemplo n.º 1
0
 /**
  * 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;
     }
 }