From aaabe2edf44e79939f01ed85a37571bb032a99a4 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 10 Nov 2020 22:14:56 +0100 Subject: [PATCH] fix enums --- Admin/Routes/Web/Api.php | 67 ++++++ Admin/Routes/Web/Backend.php | 6 +- Controller/ApiController.php | 412 +++++++++++++++++++++++++++++++++++ Models/PermissionState.php | 10 +- 4 files changed, 488 insertions(+), 7 deletions(-) create mode 100644 Admin/Routes/Web/Api.php create mode 100644 Controller/ApiController.php diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php new file mode 100644 index 0000000..c3221c2 --- /dev/null +++ b/Admin/Routes/Web/Api.php @@ -0,0 +1,67 @@ + [ + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::TICKET, + ], + ], + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskSet', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::MODIFY, + 'state' => PermissionState::TICKET, + ], + ], + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskGet', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::TICKET, + ], + ], + ], + '^.*/task/element.*$' => [ + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskElementCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::ELEMENT, + ], + ], + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskElementSet', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::MODIFY, + 'state' => PermissionState::ELEMENT, + ], + ], + [ + 'dest' => '\Modules\Support\Controller\ApiController:apiTaskElementGet', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::READ, + 'state' => PermissionState::TICKET, + ], + ], + ], +]; diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 4626ebd..f382848 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -13,7 +13,7 @@ return [ 'permission' => [ 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, - 'state' => PermissionState::SUPPORT, + 'state' => PermissionState::TICKET, ], ], ], @@ -24,7 +24,7 @@ return [ 'permission' => [ 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, - 'state' => PermissionState::SUPPORT, + 'state' => PermissionState::TICKET, ], ], ], @@ -35,7 +35,7 @@ return [ 'permission' => [ 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::CREATE, - 'state' => PermissionState::SUPPORT, + 'state' => PermissionState::TICKET, ], ], ], diff --git a/Controller/ApiController.php b/Controller/ApiController.php new file mode 100644 index 0000000..288a8f1 --- /dev/null +++ b/Controller/ApiController.php @@ -0,0 +1,412 @@ + Returns the validation array of the request + * + * @since 1.0.0 + */ + private function validateTicketCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['plain'] = empty($request->getData('plain'))) + ) { + return $val; + } + + return []; + } + + /** + * Api method to create a task + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateTicketCreate($request))) { + $response->set($request->getUri()->__toString(), new FormValidation($val)); + $response->getHeader()->setStatusCode(RequestStatusCode::R_400); + + return; + } + + $task = $this->createTicketFromRequest($request); + $this->createModel($request->getHeader()->getAccount(), $task, TaskMapper::class, 'task', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task', 'Task successfully created.', $task); + } + + /** + * Method to create task from request. + * + * @param RequestAbstract $request Request + * + * @return Task Returns the created task from the request + * + * @since 1.0.0 + */ + private function createTicketFromRequest(RequestAbstract $request) : Task + { + $task = new Task(); + $task->setTitle((string) ($request->getData('title') ?? '')); + $task->setDescription(Markdown::parse((string) ($request->getData('plain') ?? ''))); + $task->setDescriptionRaw((string) ($request->getData('plain') ?? '')); + $task->setCreatedBy(new NullAccount($request->getHeader()->getAccount())); + $task->setStatus(TaskStatus::OPEN); + $task->setType(TaskType::SINGLE); + + if (empty($request->getData('priority'))) { + $task->setDue(empty($request->getData('due')) ? null : new \DateTime($request->getData('due'))); + } else { + $task->setPriority((int) $request->getData('priority')); + } + + if (!empty($tags = $request->getDataJson('tags'))) { + foreach ($tags as $tag) { + if (!isset($tag['id'])) { + $request->setData('title', $tag['title'], true); + $request->setData('color', $tag['color'], true); + $request->setData('language', $tag['language'], true); + + $internalResponse = new HttpResponse(); + $this->app->moduleManager->get('Tag')->apiTagCreate($request, $internalResponse, null); + $task->addTag($internalResponse->get($request->getUri()->__toString())['response']); + } else { + $task->addTag(new NullTag((int) $tag['id'])); + } + } + } + + $element = new TaskElement(); + $element->addTo(new NullAccount((int) ($request->getData('forward') ?? $request->getHeader()->getAccount()))); + $element->setCreatedBy($task->getCreatedBy()); + $element->setDue($task->getDue()); + $element->setPriority($task->getPriority()); + $element->setStatus(TaskStatus::OPEN); + + $task->addElement($element); + + return $task; + } + + /** + * Api method to get a task + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $task = TaskMapper::get((int) $request->getData('id')); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task', 'Task successfully returned.', $task); + } + + /** + * Api method to update a task + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $old = clone TaskMapper::get((int) $request->getData('id')); + $new = $this->updateTicketFromRequest($request); + $this->updateModel($request->getHeader()->getAccount(), $old, $new, TaskMapper::class, 'task', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task', 'Task successfully updated.', $new); + } + + /** + * Method to update an task from a request + * + * @param RequestAbstract $request Request + * + * @return Task Returns the updated task from the request + * + * @since 1.0.0 + */ + private function updateTicketFromRequest(RequestAbstract $request) : Task + { + $task = TaskMapper::get((int) ($request->getData('id'))); + $task->setTitle((string) ($request->getData('title') ?? $task->getTitle())); + $task->setDescription(Markdown::parse((string) ($request->getData('plain') ?? $task->getDescriptionRaw()))); + $task->setDescriptionRaw((string) ($request->getData('plain') ?? $task->getDescriptionRaw())); + $task->setDue(new \DateTime((string) ($request->getData('due') ?? $task->getDue()->format('Y-m-d H:i:s')))); + $task->setStatus((int) ($request->getData('status') ?? $task->getStatus())); + $task->setType((int) ($request->getData('type') ?? $task->getType())); + $task->setPriority((int) ($request->getData('priority') ?? $task->getPriority())); + + return $task; + } + + /** + * Validate task element create request + * + * @param RequestAbstract $request Request + * + * @return array Returns the validation array of the request + * + * @since 1.0.0 + */ + private function validateTicketElementCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['status'] = !TaskStatus::isValidValue((int) $request->getData('status'))) + || ($val['due'] = !((bool) \strtotime((string) $request->getData('due')))) + || ($val['task'] = !(\is_numeric($request->getData('task')))) + || ($val['forward'] = !(\is_numeric(empty($request->getData('forward')) ? $request->getHeader()->getAccount() : $request->getData('forward')))) + ) { + return $val; + } + + return []; + } + + /** + * Api method to create a task element + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketElementCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateTicketElementCreate($request))) { + $response->set('task_element_create', new FormValidation($val)); + $response->getHeader()->setStatusCode(RequestStatusCode::R_400); + + return; + } + + /** + * @todo Orange-Management/oms-Tasks#3 + * Validate that the user is allowed to create a task element for a specific task + */ + + $task = TaskMapper::get((int) ($request->getData('task'))); + $element = $this->createTicketElementFromRequest($request, $task); + $task->setStatus($element->getStatus()); + $task->setPriority($element->getPriority()); + $task->setDue($element->getDue()); + + $this->createModel($request->getHeader()->getAccount(), $element, TaskElementMapper::class, 'taskelement', $request->getOrigin()); + $this->updateModel($request->getHeader()->getAccount(), $task, $task, TaskMapper::class, 'task', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task element', 'Task element successfully created.', $element); + } + + /** + * Method to create task element from request. + * + * @param RequestAbstract $request Request + * @param Task $task Task + * + * @return TaskElement Returns the task created from the request + * + * @since 1.0.0 + */ + private function createTicketElementFromRequest(RequestAbstract $request, Task $task) : TaskElement + { + $element = new TaskElement(); + $element->setCreatedBy(new NullAccount($request->getHeader()->getAccount())); + $element->setDue(!empty($request->getData('due')) ? new \DateTime((string) ($request->getData('due'))) : $task->getDue()); + $element->setPriority((int) ($request->getData('priority') ?? $task->getPriority())); + $element->setStatus((int) ($request->getData('status'))); + $element->setTask($task->getId()); + $element->setDescription(Markdown::parse((string) ($request->getData('plain') ?? ''))); + $element->setDescriptionRaw((string) ($request->getData('plain') ?? '')); + + $tos = $request->getData('to') ?? $request->getHeader()->getAccount(); + if (!\is_array($tos)) { + $tos = [$tos]; + } + + $ccs = $request->getData('cc') ?? []; + if (!\is_array($ccs)) { + $ccs = [$ccs]; + } + + foreach ($tos as $to) { + $element->addTo(new NullAccount((int) $to)); + } + + foreach ($ccs as $cc) { + $element->addCC(new NullAccount((int) $cc)); + } + + return $element; + } + + /** + * Api method to get a task + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketElementGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $task = TaskElementMapper::get((int) $request->getData('id')); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task element', 'Task element successfully returned.', $task); + } + + /** + * Api method to update a task + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiTicketElementSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $old = clone TaskElementMapper::get((int) $request->getData('id')); + $new = $this->updateTicketElementFromRequest($request); + $this->updateModel($request->getHeader()->getAccount(), $old, $new, TaskElementMapper::class, 'taskelement', $request->getOrigin()); + + /** + * @todo Orange-Management/oms-Tasks#2 + * Update task status depending on the new task element or updated task element + * The task status is not normalized and relates to the last task element. + * Depending on the task status of the last task element also the task status should change. + */ + //$this->updateModel($request->getHeader()->getAccount(), $task, $task, TaskMapper::class, 'task', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Task element', 'Task element successfully updated.', $new); + } + + /** + * Method to update an task element from a request + * + * @param RequestAbstract $request Request + * + * @return TaskElement Returns the updated task element from the request + * + * @since 1.0.0 + */ + private function updateTicketElementFromRequest(RequestAbstract $request) : TaskElement + { + $element = TaskElementMapper::get((int) ($request->getData('id'))); + $element->setDue(new \DateTime((string) ($request->getData('due') ?? $element->getDue()->format('Y-m-d H:i:s')))); + $element->setStatus((int) ($request->getData('status') ?? $element->getStatus())); + $element->setDescription(Markdown::parse((string) ($request->getData('plain') ?? $element->getDescriptionRaw()))); + $element->setDescriptionRaw((string) ($request->getData('plain') ?? $element->getDescriptionRaw())); + + $tos = $request->getData('to') ?? $request->getHeader()->getAccount(); + if (!\is_array($tos)) { + $tos = [$tos]; + } + + $ccs = $request->getData('cc') ?? []; + if (!\is_array($ccs)) { + $ccs = [$ccs]; + } + + foreach ($tos as $to) { + $element->addTo($to); + } + + foreach ($ccs as $cc) { + $element->addCC($cc); + } + + return $element; + } +} diff --git a/Models/PermissionState.php b/Models/PermissionState.php index 613bcbd..66326c0 100644 --- a/Models/PermissionState.php +++ b/Models/PermissionState.php @@ -26,11 +26,13 @@ use phpOMS\Stdlib\Base\Enum; */ abstract class PermissionState extends Enum { - public const SUPPORT = 1; + public const TICKET = 1; - public const ANALYSIS = 2; + public const ELEMENT = 2; - public const SETTINGS = 3; + public const ANALYSIS = 3; - public const DASHBOARD = 4; + public const SETTINGS = 4; + + public const DASHBOARD = 5; }