HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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
        ];
    }

}