<?php
/**
* Created by PhpStorm.
* User: SUSAN MEDINA
* Date: 21/03/2019
* Time: 08:12 PM
*/
namespace App\EventSubscriber\Task;
use App\Entity\App\User;
use App\Repository\App\Task\TaskRepository;
use App\Repository\App\UserRepository;
use App\Services\StatesService;
use App\Services\UtilsService;
use App\Services\WorkerBudgetService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use ApiPlatform\Core\EventListener\EventPriorities;
use Symfony\Component\HttpKernel\KernelEvents;
use App\Services\TaskService;
class TaskPostSerializerSubscriber implements EventSubscriberInterface
{
private $taskService;
private $utilsService;
private $statesService;
private $workerBudgetService;
private $userRepository;
private $taskRepository;
public function __construct(TaskService $taskService,
UtilsService $utilsService,
WorkerBudgetService $workerBudgetService,
StatesService $statesService,
UserRepository $userRepository,
TaskRepository $taskRepository
) {
$this->taskService = $taskService;
$this->utilsService = $utilsService;
$this->statesService = $statesService;
$this->workerBudgetService = $workerBudgetService;
$this->userRepository = $userRepository;
$this->taskRepository = $taskRepository;
}
/**
* @param ViewEvent $event
* @throws \App\Exception\AccessDeniedException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function onKernelView(ViewEvent $event)
{
if ($this->utilsService->isAPublicRequest($event)) {
return;
}
$request = $event->getRequest();
$taskResult = $event->getControllerResult();
$routes = array(
'api_tasks_get_collection',
'api_tasks_post_collection',
'api_tasks_get_item',
'api_tasks_put_item',
'api_tickets_tasks_get_subresource',
'api_maintenance_elements_tasks_get_subresource',
'api_maintenance_elements_childrens_tasks_get_subresource',
'api_resources_tasks_get_subresource'
);
$routesCollection = array(
'api_tasks_get_collection',
'api_tickets_tasks_get_subresource',
'api_maintenance_elements_tasks_get_subresource',
'api_maintenance_elements_childrens_tasks_get_subresource',
'api_resources_tasks_get_subresource'
);
$route = $request->attributes->get('_route');
if (!in_array($route, $routes))
return;
$taskResult = json_decode($taskResult, true);
$orderByRole = $request->query->get('orderByRole') ?? false;
if (in_array($route, $routesCollection)) {
$listTask = [];
foreach ($taskResult as $key => &$task) {
$listTask[] = $this->taskService->formatNormalize($task, $route);
}
if ($orderByRole) {
$listTask = $this->orderByRole($listTask, $orderByRole);
}
$taskResult = json_encode($listTask);
} else {
$taskResult = $this->taskService->formatNormalize($taskResult, $route);
$taskResult = json_encode($taskResult);
}
$event->setControllerResult($taskResult);
}
/**
* @param $array
* @param $role
* @return array
* @throws \Doctrine\ORM\NonUniqueResultException
*/
protected function orderByRole($array, $role)
{
$result = [];
$listWorker = [];
$listTask = [];
foreach ($array as $key => $task) {
if (isset($task['id'])) {
$getTask = $this->taskRepository->find($task['id']);
if (isset($task[$role])) {
$users = $task[$role];
$newTask = $task;
foreach ($users as $user) {
if (isset($newTask['workerBudgets'])) {
unset($newTask['workerBudgets']);
}
if (isset($newTask['operators'])) {
unset($newTask['operators']);
}
if (isset($newTask['taskmasters'])) {
unset($newTask['taskmasters']);
}
$listWorker[$user['id']] = $user;
if ($role === 'operators') {
$getUser = $this->userRepository->find($user['id']);
if ($getUser instanceof User) {
$newTask['workerBudgetState'] = $this->workerBudgetService->workerBudgetCurrentState(
$getUser,
$getTask,
true
);
if (isset($newTask['workerBudgetState']['name']) && !is_null(
$newTask['workerBudgetState']['name']
)) {
$newTask['nextStates'] = $this->statesService->getNextTaskState(
$newTask['workerBudgetState']['name'],
true
);
}
}
}
$listTask[$user['id']][] = $newTask;
}
}
}
}
foreach ($listWorker as $key => &$worker) {
$worker['tasks'] = $listTask[$key];
$result[] = $worker;
}
return $result;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['onKernelView', EventPriorities::POST_SERIALIZE]
];
}
}