File: D:/HostingSpaces/netwerkbrabant/netwerkbrabant.nl/app/KommaApp/Search/SearchService.php
<?php
namespace App\KommaApp\Search;
use App\KommaApp\Base\Service;
use App\KommaApp\MagazineArticles\Models\MagazineArticle;
use App\KommaApp\Magazines\Models\Magazine;
use App\KommaApp\Tags\Models\TagTranslation;
use Carbon\Carbon;
use App\KommaApp\Companies\Models\Company;
use App\KommaApp\Events\Models\Event;
use App\KommaApp\Events\Models\EventTranslation;
use App\KommaApp\MagazineArticles\Models\MagazineArticleTranslation;
use App\KommaApp\Magazines\Models\MagazineTranslation;
use App\KommaApp\NewsArticles\Models\NewsArticleTranslation;
use App\KommaApp\Pages\Models\PageTranslation;
use App\KommaApp\PastEvents\Models\PastEventTranslation;
class SearchService extends Service
{
protected $searchModels = [
Company::class,
PageTranslation::class,
Event::class,
EventTranslation::class,
MagazineTranslation::class,
MagazineArticleTranslation::class,
NewsArticleTranslation::class,
PastEventTranslation::class
];
public function __construct()
{
parent::__construct();
$this->today = Carbon::now()->addHour();
$this->today = $this->today->format('Y-m-d H:i:s');
}
public function ifQueryIsTag($query)
{
if($tagTranslation = TagTranslation::where('name', $query)->first())
{
return redirect()->route('tag.show', ['tabSlug' => $tagTranslation->slug]);
}
}
public function searchForQuery($query)
{
$searchResults = [];
$this->searchForMagazineArticles($query, $searchResults);
$this->searchForEvents($query, $searchResults);
$this->searchForCompanies($query, $searchResults);
$this->searchForPastEvents($query, $searchResults);
$this->searchForNewsArticles($query, $searchResults);
// Search for pages and magazines in the future
return $searchResults;
}
private function searchForMagazineArticles(string $query, &$searchResults)
{
$magazineArticles = MagazineArticleTranslation::search($query)->get();
$magazineArticlesKeys = $magazineArticles->pluck('magazine_article_id')->toArray();
$magazineArticles = MagazineArticle::has('magazines')
->has('images')
->has('partners')
->has('company')
->where('active', 1)
->whereIn('id', $magazineArticlesKeys)
->orderBy('id','desc')
->take(5)
->get();
$magazineArticles->sortByDesc('magazine_article_id');
if($magazineArticles->count() == 0) return;
$showLink = false;
if($magazineArticles->count() > 4) $showLink = true;
$preparedMagazineArticles = [];
// We actually only need 4
$magazineArticles = $magazineArticles->take(4);
$magazineArticles->load('images', 'translation', 'magazines', 'magazines.translation');
foreach($magazineArticles as $magazineArticle){
$magazineArticleRoute = $magazineArticle->magazines->first()->translation->slug.'/'.$magazineArticle->translation->slug;
$preparedMagazineArticle = (object)[
'name' => $magazineArticle->translation->name,
'description' => '<p>'.nl2br($magazineArticle->translation->meta_description).'</p>',
'route' => $magazineArticleRoute,
'images' => $magazineArticle->images,
];
$preparedMagazineArticles[] = $preparedMagazineArticle;
}
$searchResults['magazineArticles'] = (object)[
'showLink' => $showLink,
'models' => $preparedMagazineArticles
];
}
private function searchForEvents(string $query, &$searchResults)
{
$events = Event::search($query)->get();
// Get the id because we must check if the found event translation aren't already in the events
$eventKeys = $events->pluck('id')->toArray();
$eventTranslations = EventTranslation::search($query)->get();
// Merge the found (unique) event translation with events
foreach ($eventTranslations as $eventTranslation)
{
if(in_array($eventTranslation->event_id, $eventKeys)) continue;
$eventKeys[] = $eventTranslation->event_id;
}
$events = $this->site
->events()
->has('images')
->where('active', 1)
->whereNotNull('region_id')
->where('date', '>=', $this->today)
->whereIn('id', $eventKeys)
->orderBy('date','asc')
->take(5)
->get();
if($events->count() == 0) return;
$showLink = false;
if($events->count() > 4) $showLink = true;
$preparedEvents = [];
// We actually only need 4
$events = $events->take(4);
$events->load('images', 'translation');
foreach($events as $event){
$eventDescription = '<p>';
if(!empty($event->location_name)) $eventDescription.= '<strong>'.$event->location_name.'</strong><br/>';
if(!empty($event->time)) $eventDescription.= $event->time.'<br/>';
$eventDescription.= $event->date->format('d').' '. __('calendar.monthNamesShort.'.($event->date->format('n') - 1)) . ' '. $event->date->format('Y') .'</p>';
$preparedEvent = (object)[
'name' => $event->translation->name,
'description' => $eventDescription,
'route' => $event->translation->slug,
'images' => $event->images,
];
$preparedEvents[] = $preparedEvent;
}
$searchResults['events'] = (object)[
'showLink' => $showLink,
'models' => $preparedEvents
];
}
private function searchForPastEvents(string $query, &$searchResults)
{
$pastEvents = PastEventTranslation::search($query)->get();
$pastEventKeys = $pastEvents->pluck('past_event_id')->toArray();
$pastEvents = $this->site
->pastEvents()
->has('images')
->where('active', 1)
->whereNotNull('region_id')
->where('date', '<=', $this->today)
->whereIn('id', $pastEventKeys)
->orderBy('date','desc')
->with('images', 'translation')
->take(5)
->get();
if($pastEvents->count() == 0) return;
$showLink = false;
if($pastEvents->count() > 4) $showLink = true;
$preparedPastEvents = [];
// We actually only need 4
$pastEvents = $pastEvents->take(4);
foreach($pastEvents as $pastEvent){
$pastEventDescription = '<p>';
if(!empty($pastEvent->translation->sub_title)) $pastEventDescription.= '<strong>'.$pastEvent->translation->sub_title.'</strong><br/>';
$pastEventDescription.= $pastEvent->date->format('d').' '. __('calendar.monthNames.'.($pastEvent->date->format('n') - 1)) . ' '. $pastEvent->date->format('Y') .'</p>';
$preparedPastEvent = (object)[
'name' => $pastEvent->translation->name,
'description' => $pastEventDescription,
'route' => $pastEvent->translation->slug,
'images' => $pastEvent->images,
];
$preparedPastEvents[] = $preparedPastEvent;
}
$searchResults['pastEvents'] = (object)[
'showLink' => $showLink,
'models' => $preparedPastEvents
];
}
private function searchForNewsArticles(string $query, &$searchResults)
{
$newsArticles = NewsArticleTranslation::search($query)->get();
$newsArticlesKeys = $newsArticles->pluck('news_article_id')->toArray();
$newsArticles = $this->site
->newsArticles()
->has('images')
->where('active', 1)
->where('date', '<=', $this->today)
->whereIn('id', $newsArticlesKeys)
->orderBy('date','desc')
->with('images', 'translation')
->take(5)
->get();
if($newsArticles->count() == 0) return;
$showLink = false;
if($newsArticles->count() > 4) $showLink = true;
$preparedNewsArticles = [];
// We actually only need 4
$newsArticles = $newsArticles->take(4);
foreach($newsArticles as $newsArticle){
$newsArticleDescription = '<p>'.$newsArticle->date->format('d').' '. __('calendar.monthNames.'.($newsArticle->date->format('n') - 1)) . ' '. $newsArticle->date->format('Y') .'</p>';
$preparedNewsArticle = (object)[
'name' => $newsArticle->translation->name,
'description' => $newsArticleDescription,
'route' => $newsArticle->translation->slug,
'images' => $newsArticle->images,
];
$preparedNewsArticles[] = $preparedNewsArticle;
}
$searchResults['newsArticles'] = (object)[
'showLink' => $showLink,
'models' => $preparedNewsArticles
];
}
private function searchForCompanies(string $query, &$searchResults)
{
$companies = Company::search($query)->get();
$companyKeys = $companies->pluck('id')->toArray();
$companies = $this->site
->companies()
->where('active', 1)
->whereIn('id', $companyKeys)
->with('images', 'translation')
->take(5)
->get();
if($companies->count() == 0) return;
$showLink = false;
if($companies->count() > 4) $showLink = true;
$preparedCompanies = [];
// We actually only need 4
$companies = $companies->take(4);
foreach($companies as $company){
$companyDescription = '<p>' . $company->address . '<br/>' . $company->postal . ' ' . $company->city . '</p>';
$preparedCompany = (object)[
'name' => $company->name,
'description' => $companyDescription,
'route' => $company->slug,
'images' => $company->images,
];
$preparedCompanies[] = $preparedCompany;
}
$searchResults['companies'] = (object)[
'showLink' => $showLink,
'models' => $preparedCompanies
];
}
}