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/SBogers10/ehbo.today/app/KommaApp/Events/Kms/EventService.php
<?php
/**
 * Created by PhpStorm.
 * Event: julesgraus
 * Date: 31/01/2018
 * Time: 13:13
 */

namespace App\KommaApp\Events\Kms;


use App\KommaApp\Competences\Models\Competence;
use App\KommaApp\Courses\Models\Course;
use App\KommaApp\Documents\Kms\DocumentableInterface;
use App\KommaApp\Kms\Core\AbstractTranslatableModel;
use App\KommaApp\Kms\Core\Attributes\Attribute;
use App\KommaApp\Kms\Core\HasRoutesInterface;
use App\KommaApp\Kms\Core\Sections\AbstractSectionTabItem;
use App\KommaApp\Kms\Core\Sections\SectionService;
use App\KommaApp\Events\Models\Event;
use App\KommaApp\Kms\Core\Sections\SectionTabItem;
use App\KommaApp\Users\Kms\UserService;
use App\KommaApp\Users\Models\User;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class EventService extends SectionService
{
    protected $sortable = false;
    protected $orderBy = 'date';

    /** @var UserService $userService */
    private $userService;

    function __construct()
    {
        $this->forModelName = Event::class;
        $this->userService = \App::make(UserService::class);

        parent::__construct();
    }

    public function saveModel(Model $model = null, Collection $sectionTabItems): Model
    {
        $userPresenceData = [];

        /** @var Event $model */
        $sectionTabItems->each(function($sectionTabItem, $key) use($model, &$userPresenceData) {
            /** @var SectionTabItem $sectionTabItem */

            $attribute = $sectionTabItem->getAttribute();
            $value = $attribute->getValue();


            $reference = $attribute->getsValueFromReference();
            switch ($attribute->getsValueFrom())
            {
                case Attribute::ValueFromItself:
                    if($reference == 'subscribed_users' || $reference == 'present_users') {
                        if($reference == 'subscribed_users') $status = Event::UserStatusSubscribed;

                        if($value == '') break;
                        $idsToProcess = collect(explode(',', $value));
                        $syncData = $idsToProcess->mapWithKeys(function($userId) use ($status) {
                            return [$userId => ['user_status' => $status]];
                        })->toArray();
                        $userPresenceData = $userPresenceData + $syncData; //Union operation (combine arrays, left one is leading of both have same key)
                    }
                    break;
            }
        });

        $model->save(); //Save the page
        $model = parent::saveModel($model, $sectionTabItems); //First make sure we have a model and save the attributes in them from the SectionTabItem attributes

        //Return the page
        return $model;
    }

    /**
     * This method will remove an TranslatableModelInterface instance
     *
     * @param $model
     * @throws \Exception
     */
    public function destroyModel(Model $model)
    {
        //delete the images
        $this->imageService->deleteModelImages($model);
        if(is_a($model, DocumentableInterface::class)) $this->documentService->deleteDocumentsForModel($model);

        if(is_a($model,AbstractTranslatableModel::class)) {
            foreach ($model->translations()->get() as $translation) {

                //Delete the route of the translation
                if(is_a($model, HasRoutesInterface::class)){
                    $translation->routes()->delete();
                }

                //Delete the translation
                $translation->delete();
            }
        }

        $model->users()->detach();

        $model->delete();
    }

    public function fillAttributesWithData(Collection $sectionTabItems, Model $model)
    {
        //Validate that each Collection item is an instance of AbstractSectionTabItem
        $sectionTabItems->every(function($item, $key) {
            if(!is_a($item, AbstractSectionTabItem::class)) throw new \InvalidArgumentException("The attributes passed must be a Collection of AbstractSectionTabItem instances but was not");
        });

        $filledAttributes = new Collection();
        if(is_a($model, AbstractTranslatableModel::class)) $model->load('translations');

        /** @var Event $model */
        $sectionTabItems->each(
            function ($sectionTabItem, $key) use ($model, $filledAttributes) {
                /** @var $sectionTabItem SectionTabItem */

                if(!is_a($sectionTabItem->getAttribute(), Attribute::class)) throw new \InvalidArgumentException("One of the attributes in a AbstractSectionTabItem instance is not but must be an child instance of Attribute.");

                $value = null;

                $valueReference = $sectionTabItem->getAttribute()->getsValueFromReference();
                switch($sectionTabItem->getAttribute()->getsValueFrom())
                {
                    case Attribute::ValueFromItself:
                        switch ($valueReference)
                        {
                            case 'subscribed_users':
                                $ids = $model->users()->wherePivot('user_status', '=', Event::UserStatusSubscribed)->get()->map(function(User $user) {
                                   return $user->id;
                                })->toArray();
                                $value = implode(',', $ids);
                                break;
                        }
                        break;
                }

                //Finally when we have a value we will set it on the attribute and then process the next one.
                if($value !== null) {
                    $sectionTabItem->getAttribute()->setValue((string)$value);
                }

                $filledAttributes->push($sectionTabItem);
            }
        );

        $filledAttributes = parent::fillAttributesWithData($sectionTabItems, $model);

        return $filledAttributes;
    }

    /**
     * @param User $user
     * @return Collection
     */
    public function subscribedEvents(User $user)
    {
        $subscribedEvents = $user->events()->withPivot(['user_status'])->wherePivot('user_status', '=', Event::UserStatusSubscribed)->whereDate('date', '>=', Carbon::now()->startOfDay()->toDateString())->orderBy('date')->get();

        return $subscribedEvents;
    }

    /**
     * @param User $user
     * @param bool $includeUserCompetenceStatuses
     * @return Collection
     */
    public function completedEvents(User $user)
    {
        $completedEvents = $user->events()->whereDate('date', '>', Carbon::now()->subYear(2)->startOfDay())->withPivot(['user_status'])->wherePivot('user_status', '=', Event::UserStatusPresent)->orderBy('date', 'desc')->get();

        return $completedEvents;
    }

    /**
     * @return Collection
     */
    public function getAllEvents()
    {
        $events = Event::all();

        return $events;
    }


}