From a8e6757c2a3e871404697a77cd988593c4cd94d7 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Wed, 19 Sep 2018 21:34:04 +0200 Subject: [PATCH] Split controllers per application --- Admin/Routes/Web/Api.php | 62 +- Admin/Routes/Web/Backend.php | 38 +- Controller/ApiController.php | 683 ++++++++++++++++++++ Controller/BackendController.php | 290 +++++++++ Controller.php => Controller/Controller.php | 6 +- 5 files changed, 1026 insertions(+), 53 deletions(-) create mode 100644 Controller/ApiController.php create mode 100644 Controller/BackendController.php rename Controller.php => Controller/Controller.php (99%) diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index d42de0f..a4f963f 100644 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -3,42 +3,42 @@ use phpOMS\Router\RouteVerb; use phpOMS\Account\PermissionType; use Modules\Organization\Models\PermissionState; -use Modules\Organization\Controller; +use Modules\Organization\Controller\ApiController; return [ '^.*/api/organization/position.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiPositionCreate', + 'dest' => '\Modules\Organization\Controller\ApiController:apiPositionCreate', 'verb' => RouteVerb::PUT, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::POSITION, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiPositionGet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiPositionGet', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::POSITION, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiPositionSet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiPositionSet', 'verb' => RouteVerb::SET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::MODIFY, 'state' => PermissionState::POSITION, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiPositionDelete', + 'dest' => '\Modules\Organization\Controller\ApiController:apiPositionDelete', 'verb' => RouteVerb::DELETE, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::DELETE, 'state' => PermissionState::POSITION, ], @@ -46,37 +46,37 @@ return [ ], '^.*/api/organization/department.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiDepartmentCreate', + 'dest' => '\Modules\Organization\Controller\ApiController:apiDepartmentCreate', 'verb' => RouteVerb::PUT, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::DEPARTMENT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiDepartmentGet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiDepartmentGet', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::DEPARTMENT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiDepartmentSet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiDepartmentSet', 'verb' => RouteVerb::SET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::MODIFY, 'state' => PermissionState::DEPARTMENT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiDepartmentDelete', + 'dest' => '\Modules\Organization\Controller\ApiController:apiDepartmentDelete', 'verb' => RouteVerb::DELETE, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::DELETE, 'state' => PermissionState::DEPARTMENT, ], @@ -84,37 +84,37 @@ return [ ], '^.*/api/organization/unit.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiUnitCreate', + 'dest' => '\Modules\Organization\Controller\ApiController:apiUnitCreate', 'verb' => RouteVerb::PUT, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::UNIT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiUnitGet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiUnitGet', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::UNIT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiUnitSet', + 'dest' => '\Modules\Organization\Controller\ApiController:apiUnitSet', 'verb' => RouteVerb::SET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::MODIFY, 'state' => PermissionState::UNIT, ], ], [ - 'dest' => '\Modules\Organization\Controller:apiUnitDelete', + 'dest' => '\Modules\Organization\Controller\ApiController:apiUnitDelete', 'verb' => RouteVerb::DELETE, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::UNIT, ], @@ -123,10 +123,10 @@ return [ '^.*/api/organization/find/unit.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiUnitFind', + 'dest' => '\Modules\Organization\Controller\ApiController:apiUnitFind', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::UNIT, ], @@ -134,10 +134,10 @@ return [ ], '^.*/api/organization/find/department.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiDepartmentFind', + 'dest' => '\Modules\Organization\Controller\ApiController:apiDepartmentFind', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::DEPARTMENT, ], @@ -145,10 +145,10 @@ return [ ], '^.*/api/organization/find/position.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:apiPositionFind', + 'dest' => '\Modules\Organization\Controller\ApiController:apiPositionFind', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => ApiController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::POSITION, ], diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 7651d2a..73d928a 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -3,15 +3,15 @@ use phpOMS\Router\RouteVerb; use phpOMS\Account\PermissionType; use Modules\Organization\Models\PermissionState; -use Modules\Organization\Controller; +use Modules\Organization\Controller\BackendController; return [ '^.*/backend/organization/unit/list.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewUnitList', + 'dest' => '\Modules\Organization\Controller\BackendController:viewUnitList', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::UNIT, ], @@ -19,10 +19,10 @@ return [ ], '^.*/backend/organization/unit/profile.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewUnitProfile', + 'dest' => '\Modules\Organization\Controller\BackendController:viewUnitProfile', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::UNIT, ], @@ -30,10 +30,10 @@ return [ ], '^.*/backend/organization/unit/create.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewUnitCreate', + 'dest' => '\Modules\Organization\Controller\BackendController:viewUnitCreate', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::UNIT, ], @@ -41,10 +41,10 @@ return [ ], '^.*/backend/organization/department/list.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewDepartmentList', + 'dest' => '\Modules\Organization\Controller\BackendController:viewDepartmentList', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::DEPARTMENT, ], @@ -52,10 +52,10 @@ return [ ], '^.*/backend/organization/department/profile.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewDepartmentProfile', + 'dest' => '\Modules\Organization\Controller\BackendController:viewDepartmentProfile', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::DEPARTMENT, ], @@ -63,10 +63,10 @@ return [ ], '^.*/backend/organization/department/create.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewDepartmentCreate', + 'dest' => '\Modules\Organization\Controller\BackendController:viewDepartmentCreate', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::DEPARTMENT, ], @@ -74,10 +74,10 @@ return [ ], '^.*/backend/organization/position/list.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewPositionList', + 'dest' => '\Modules\Organization\Controller\BackendController:viewPositionList', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::POSITION, ], @@ -85,10 +85,10 @@ return [ ], '^.*/backend/organization/position/profile.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewPositionProfile', + 'dest' => '\Modules\Organization\Controller\BackendController:viewPositionProfile', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::POSITION, ], @@ -96,10 +96,10 @@ return [ ], '^.*/backend/organization/position/create.*$' => [ [ - 'dest' => '\Modules\Organization\Controller:viewPositionCreate', + 'dest' => '\Modules\Organization\Controller\BackendController:viewPositionCreate', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::POSITION, ], diff --git a/Controller/ApiController.php b/Controller/ApiController.php new file mode 100644 index 0000000..3d7ec0e --- /dev/null +++ b/Controller/ApiController.php @@ -0,0 +1,683 @@ + + * + * @since 1.0.0 + */ + private function validateUnitCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = empty($request->getData('name'))) + || ($val['parent'] = ( + !empty($request->getData('parent')) + && !\is_numeric($request->getData('parent')) + )) + || ($val['status'] = ( + $request->getData('status') === null + || !Status::isValidValue((int) $request->getData('status')) + )) + ) { + return $val; + } + + return []; + } + + /** + * Api method to get a unit + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiUnitGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $unit = UnitMapper::get((int) $request->getData('id')); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Unit', + 'message' => 'Unit successfully returned.', + 'response' => $unit->jsonSerialize() + ]); + } + + /** + * Api method to update a unit + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiUnitSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $unit = $this->updateUnitFromRequest($request); + + UnitMapper::update($unit); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Unit', + 'message' => 'Unit successfully updated.', + 'response' => $unit->jsonSerialize() + ]); + } + + /** + * Method to update unit from request. + * + * @param RequestAbstract $request Request + * + * @return Unit + * + * @since 1.0.0 + */ + private function updateUnitFromRequest(RequestAbstract $request) : Unit + { + $unit = UnitMapper::get((int) $request->getData('id')); + $unit->setName((string) ($request->getData('name') ?? $unit->getName())); + $unit->setDescriptionRaw((string) ($request->getData('description') ?? $unit->getDescriptionRaw())); + $unit->setDescription(Markdown::parse((string) ($request->getData('description') ?? $unit->getDescriptionRaw()))); + + $parent = (int) $request->getData('parent'); + $unit->setParent(!empty($parent) ? $parent : $unit->getParent()); + $unit->setStatus((int) ($request->getData('status') ?? $unit->getStatus())); + + return $unit; + } + + /** + * Api method to delete a unit + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiUnitDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $unit = UnitMapper::get((int) $request->getData('id')); + $status = UnitMapper::delete($unit); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Unit', + 'message' => 'Unit successfully deleted.', + 'response' => $status + ]); + } + + /** + * Api method to create a unit + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiUnitCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateUnitCreate($request))) { + $response->set('unit_create', new FormValidation($val)); + + return; + } + + $unit = $this->createUnitFromRequest($request); + + UnitMapper::create($unit); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Unit', + 'message' => 'Unit successfully created.', + 'response' => $unit->jsonSerialize() + ]); + } + + /** + * Method to create unit from request. + * + * @param RequestAbstract $request Request + * + * @return Unit + * + * @since 1.0.0 + */ + private function createUnitFromRequest(RequestAbstract $request) : Unit + { + $unit = new Unit(); + $unit->setName((string) $request->getData('name')); + $unit->setDescriptionRaw((string) ($request->getData('description') ?? '')); + $unit->setDescription(Markdown::parse((string) ($request->getData('description') ?? ''))); + + $parent = (int) $request->getData('parent'); + $unit->setParent(!empty($parent) ? $parent : null); + $unit->setStatus((int) $request->getData('status')); + + return $unit; + } + + /** + * Validate position create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validatePositionCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = empty($request->getData('name'))) + || ($val['parent'] = ( + !empty($request->getData('parent')) + && !\is_numeric($request->getData('parent')) + )) + || ($val['status'] = ( + $request->getData('status') === null + || !Status::isValidValue((int) $request->getData('status')) + )) + ) { + return $val; + } + + return []; + } + + /** + * Api method to get a position + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiPositionGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $position = PositionMapper::get((int) $request->getData('id')); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Position', + 'message' => 'Position successfully returned.', + 'response' => $position->jsonSerialize() + ]); + } + + /** + * Api method to delete a position + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiPositionDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $position = PositionMapper::get((int) $request->getData('id')); + $status = PositionMapper::delete($position); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Position', + 'message' => 'Position successfully deleted.', + 'response' => $status + ]); + } + + /** + * Api method to update a position + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiPositionSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $position = $this->updatePositionFromRequest($request); + + PositionMapper::update($position); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Position', + 'message' => 'Position successfully updated.', + 'response' => $position->jsonSerialize() + ]); + } + + /** + * Method to update position from request. + * + * @param RequestAbstract $request Request + * + * @return Position + * + * @since 1.0.0 + */ + private function updatePositionFromRequest(RequestAbstract $request) : Position + { + $position = PositionMapper::get((int) $request->getData('id')); + $position->setName((string) ($request->getData('name') ?? $position->getName())); + $position->setDescriptionRaw((string) ($request->getData('description') ?? $position->getDescriptionRaw())); + $position->setDescription(Markdown::parse((string) ($request->getData('description') ?? $position->getDescriptionRaw()))); + + $parent = (int) $request->getData('parent'); + $position->setParent(!empty($parent) ? $parent : $position->getParent()); + + $department = (int) $request->getData('department'); + $position->setDepartment(!empty($department) ? $department : $position->getDepartment()); + $position->setStatus((int) ($request->getData('status') ?? $position->getStatus())); + + return $position; + } + + /** + * Api method to create a position + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiPositionCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validatePositionCreate($request))) { + $response->set('position_create', new FormValidation($val)); + + return; + } + + $position = $this->createPositionFromRequest($request); + + PositionMapper::create($position); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Position', + 'message' => 'Position successfully created.', + 'response' => $position->jsonSerialize() + ]); + } + + /** + * Method to create position from request. + * + * @param RequestAbstract $request Request + * + * @return Position + * + * @since 1.0.0 + */ + private function createPositionFromRequest(RequestAbstract $request) : Position + { + $position = new Position(); + $position->setName((string) ($request->getData('name'))); + $position->setStatus((int) $request->getData('status')); + $position->setDescriptionRaw((string) ($request->getData('description') ?? '')); + $position->setDescription(Markdown::parse((string) ($request->getData('description') ?? ''))); + + $parent = (int) $request->getData('parent'); + $position->setParent(!empty($parent) ? $parent : null); + + $department = (int) $request->getData('department'); + $position->setDepartment(!empty($department) ? $department : null); + + return $position; + } + + /** + * Method to validate department creation from request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateDepartmentCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = empty($request->getData('name'))) + || ($val['parent'] = ( + !empty($request->getData('parent')) + && !\is_numeric($request->getData('parent')) + )) + || ($val['unit'] = ( + !\is_numeric($request->getData('unit')) + )) + ) { + return $val; + } + + return []; + } + + /** + * Api method to get a department + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDepartmentGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $department = DepartmentMapper::get((int) $request->getData('id')); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Department', + 'message' => 'Department successfully returned.', + 'response' => $department->jsonSerialize() + ]); + } + + /** + * Api method to update a department + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDepartmentSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $department = $this->updateDepartmentFromRequest($request); + + DepartmentMapper::update($department); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Department', + 'message' => 'Department successfully updated.', + 'response' => $department->jsonSerialize() + ]); + } + + /** + * Method to update department from request. + * + * @param RequestAbstract $request Request + * + * @return Department + * + * @since 1.0.0 + */ + private function updateDepartmentFromRequest(RequestAbstract $request) : Department + { + $department = DepartmentMapper::get((int) $request->getData('id')); + $department->setName((string) ($request->getData('name') ?? $department->getName())); + $department->setDescriptionRaw((string) ($request->getData('description') ?? $department->getDescriptionRaw())); + $department->setDescription(Markdown::parse((string) ($request->getData('description') ?? $department->getDescriptionRaw()))); + + $parent = (int) $request->getData('parent'); + $department->setParent(!empty($parent) ? $parent : $department->getParent()); + $department->setStatus((int) ($request->getData('status') ?? $department->getStatus())); + + $unit = (int) $request->getData('unit'); + $department->setUnit(!empty($unit) ? $unit : $department->getUnit()); + + return $department; + } + + /** + * Api method to delete a department + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDepartmentDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $department = DepartmentMapper::get((int) $request->getData('id')); + $status = DepartmentMapper::delete($department); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Department', + 'message' => 'Department successfully deleted.', + 'response' => $status + ]); + } + + /** + * Api method to create a department + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDepartmentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateDepartmentCreate($request))) { + $response->set('department_create', new FormValidation($val)); + + return; + } + + $department = $this->createDepartmentFromRequest($request); + + DepartmentMapper::create($department); + + $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); + $response->set($request->getUri()->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Department', + 'message' => 'Department successfully created.', + 'response' => $department->jsonSerialize() + ]); + } + + /** + * Method to create a department from a request + * + * @param RequestAbstract $request Request + * + * @return Department + * + * @since 1.0.0 + */ + private function createDepartmentFromRequest(RequestAbstract $request) : Department + { + $department = new Department(); + $department->setName((string) $request->getData('name')); + $department->setStatus((int) $request->getData('status')); + + $parent = (int) $request->getData('parent'); + $department->setParent(!empty($parent) ? $parent : null); + $department->setUnit((int) ($request->getData('unit') ?? 1)); + $department->setDescriptionRaw((string) ($request->getData('description') ?? '')); + $department->setDescription(Markdown::parse((string) ($request->getData('description') ?? ''))); + + return $department; + } + + /** + * Api method to find units + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiUnitFind(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $response->getHeader()->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); + $response->set($request->getUri()->__toString(), array_values(UnitMapper::find((string) ($request->getData('search') ?? '')))); + } + + /** + * Api method to find departments + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiDepartmentFind(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $response->getHeader()->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); + $response->set($request->getUri()->__toString(), array_values(DepartmentMapper::find((string) ($request->getData('search') ?? '')))); + } + + /** + * Api method to find positions + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiPositionFind(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $response->getHeader()->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); + $response->set($request->getUri()->__toString(), array_values(PositionMapper::find((string) ($request->getData('search') ?? '')))); + } +} diff --git a/Controller/BackendController.php b/Controller/BackendController.php new file mode 100644 index 0000000..484fbc1 --- /dev/null +++ b/Controller/BackendController.php @@ -0,0 +1,290 @@ +app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/unit-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004702001, $request, $response)); + + $view->addData('list:elements', UnitMapper::getAll()); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewUnitProfile(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/unit-profile'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004702001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\UnitTagSelector\UnitTagSelectorView($this->app, $request, $response); + $view->addData('unit-selector', $selectorView); + + $view->addData('unit', UnitMapper::get((int) $request->getData('id'))); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewUnitCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/unit-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004702001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\UnitTagSelector\UnitTagSelectorView($this->app, $request, $response); + $view->addData('unit-selector', $selectorView); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewDepartmentList(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/department-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004703001, $request, $response)); + + $view->addData('list:elements', DepartmentMapper::getAll()); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewDepartmentProfile(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/department-profile'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004703001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\DepartmentTagSelector\DepartmentTagSelectorView($this->app, $request, $response); + $view->addData('department-selector', $selectorView); + + $unitSelectorView = new \Modules\Organization\Theme\Backend\Components\UnitTagSelector\UnitTagSelectorView($this->app, $request, $response); + $view->addData('unit-selector', $unitSelectorView); + + $view->addData('department', DepartmentMapper::get((int) $request->getData('id'))); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewDepartmentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/department-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004703001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\DepartmentTagSelector\DepartmentTagSelectorView($this->app, $request, $response); + $view->addData('department-selector', $selectorView); + + $unitSelectorView = new \Modules\Organization\Theme\Backend\Components\UnitTagSelector\UnitTagSelectorView($this->app, $request, $response); + $view->addData('unit-selector', $unitSelectorView); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewPositionList(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/position-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004704001, $request, $response)); + + $view->addData('list:elements', PositionMapper::getAll()); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewPositionProfile(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/position-profile'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004704001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\PositionTagSelector\PositionTagSelectorView($this->app, $request, $response); + $view->addData('position-selector', $selectorView); + + $departmentSelectorView = new \Modules\Organization\Theme\Backend\Components\DepartmentTagSelector\DepartmentTagSelectorView($this->app, $request, $response); + $view->addData('department-selector', $departmentSelectorView); + + $view->addData('position', PositionMapper::get((int) $request->getData('id'))); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewPositionCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Organization/Theme/Backend/position-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004704001, $request, $response)); + + $selectorView = new \Modules\Organization\Theme\Backend\Components\PositionTagSelector\PositionTagSelectorView($this->app, $request, $response); + $view->addData('position-selector', $selectorView); + + $departmentSelectorView = new \Modules\Organization\Theme\Backend\Components\DepartmentTagSelector\DepartmentTagSelectorView($this->app, $request, $response); + $view->addData('department-selector', $departmentSelectorView); + + $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app, $request, $response); + $view->addData('editor', $editor); + + return $view; + } +} diff --git a/Controller.php b/Controller/Controller.php similarity index 99% rename from Controller.php rename to Controller/Controller.php index b6b0a3a..967d7f0 100644 --- a/Controller.php +++ b/Controller/Controller.php @@ -12,7 +12,7 @@ */ declare(strict_types=1); -namespace Modules\Organization; +namespace Modules\Organization\Controller; use Model\Message\FormValidation; @@ -45,7 +45,7 @@ use Modules\Organization\Models\PermissionState; * @link http://website.orange-management.de * @since 1.0.0 */ -final class Controller extends ModuleAbstract implements WebInterface +class Controller extends ModuleAbstract implements WebInterface { /** @@ -54,7 +54,7 @@ final class Controller extends ModuleAbstract implements WebInterface * @var string * @since 1.0.0 */ - public const MODULE_PATH = __DIR__; + public const MODULE_PATH = __DIR__ . '/../'; /** * Module version.