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;
}
}