Commit 0b8d4ffc87fa03c56c0f37762ad8c9c000aa6220
Committed by
Alex Savenko
1 parent
8baf4948
Add Roles.
Showing
15 changed files
with
744 additions
and
284 deletions
Show diff stats
app/library/App/Bootstrap/AclBootstrap.php
| @@ -5,6 +5,8 @@ namespace App\Bootstrap; | @@ -5,6 +5,8 @@ namespace App\Bootstrap; | ||
| 5 | use App\BootstrapInterface; | 5 | use App\BootstrapInterface; |
| 6 | use App\Constants\Services; | 6 | use App\Constants\Services; |
| 7 | use Phalcon\Acl; | 7 | use Phalcon\Acl; |
| 8 | +use Phalcon\Acl\Resource; | ||
| 9 | +use Phalcon\Acl\Role; | ||
| 8 | use Phalcon\Config; | 10 | use Phalcon\Config; |
| 9 | use Phalcon\DiInterface; | 11 | use Phalcon\DiInterface; |
| 10 | use PhalconRest\Api; | 12 | use PhalconRest\Api; |
| @@ -17,17 +19,22 @@ class AclBootstrap implements BootstrapInterface | @@ -17,17 +19,22 @@ class AclBootstrap implements BootstrapInterface | ||
| 17 | /** @var \PhalconApi\Acl\MountingEnabledAdapterInterface $acl */ | 19 | /** @var \PhalconApi\Acl\MountingEnabledAdapterInterface $acl */ |
| 18 | $acl = $di->get(Services::ACL); | 20 | $acl = $di->get(Services::ACL); |
| 19 | 21 | ||
| 20 | - $unauthorizedRole = new Acl\Role(AclRoles::UNAUTHORIZED); | ||
| 21 | - $authorizedRole = new Acl\Role(AclRoles::AUTHORIZED); | 22 | + $unauthorizedRole = new Role(AclRoles::UNAUTHORIZED); |
| 23 | + $authorizedRole = new Role(AclRoles::AUTHORIZED); | ||
| 22 | 24 | ||
| 23 | $acl->addRole($unauthorizedRole); | 25 | $acl->addRole($unauthorizedRole); |
| 24 | $acl->addRole($authorizedRole); | 26 | $acl->addRole($authorizedRole); |
| 25 | 27 | ||
| 26 | - $acl->addRole(new Acl\Role(AclRoles::ADMINISTRATOR), $authorizedRole); | ||
| 27 | - $acl->addRole(new Acl\Role(AclRoles::MANAGER), $authorizedRole); | ||
| 28 | - $acl->addRole(new Acl\Role(AclRoles::USER), $authorizedRole); | ||
| 29 | - $acl->addRole(new Acl\Role(AclRoles::EDITOR), $authorizedRole); | ||
| 30 | - $acl->addRole(new Acl\Role(AclRoles::AUTHOR), $authorizedRole); | 28 | + $administrator = new Role(AclRoles::ADMINISTRATOR); |
| 29 | + $user = new Role(AclRoles::USER); | ||
| 30 | + $editor = new Role(AclRoles::EDITOR); | ||
| 31 | + $author = new Role(AclRoles::AUTHOR); | ||
| 32 | + | ||
| 33 | + | ||
| 34 | + $acl->addRole($administrator, $authorizedRole); | ||
| 35 | + $acl->addRole($user, $authorizedRole); | ||
| 36 | + $acl->addRole($editor, $authorizedRole); | ||
| 37 | + $acl->addRole($author, $authorizedRole); | ||
| 31 | 38 | ||
| 32 | $acl->mountMany($api->getCollections()); | 39 | $acl->mountMany($api->getCollections()); |
| 33 | } | 40 | } |
app/library/App/Constants/AclRoles.php
| @@ -9,9 +9,55 @@ class AclRoles | @@ -9,9 +9,55 @@ class AclRoles | ||
| 9 | const AUTHOR = 'Author'; | 9 | const AUTHOR = 'Author'; |
| 10 | const EDITOR = 'Editor'; | 10 | const EDITOR = 'Editor'; |
| 11 | const USER = 'User'; | 11 | const USER = 'User'; |
| 12 | - const MANAGER = 'Manager'; | ||
| 13 | const ADMINISTRATOR = 'Administrator'; | 12 | const ADMINISTRATOR = 'Administrator'; |
| 14 | 13 | ||
| 15 | - const ALL_ROLES = [self::UNAUTHORIZED, self::AUTHORIZED, self::USER, self::MANAGER, self::ADMINISTRATOR]; | ||
| 16 | - const ALL_REAL_ROLES = [self::AUTHOR, self::EDITOR, self::USER, self::MANAGER, self::ADMINISTRATOR]; | 14 | + const ALL_ROLES = [ |
| 15 | + self::UNAUTHORIZED, | ||
| 16 | + self::AUTHORIZED, | ||
| 17 | + self::AUTHOR, | ||
| 18 | + self::EDITOR, | ||
| 19 | + self::USER, | ||
| 20 | + self::ADMINISTRATOR | ||
| 21 | + ]; | ||
| 22 | + | ||
| 23 | + const ALL_REAL_ROLES = [ | ||
| 24 | + self::AUTHOR, | ||
| 25 | + self::EDITOR, | ||
| 26 | + self::USER, | ||
| 27 | + self::ADMINISTRATOR | ||
| 28 | + ]; | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * Check if $role can remove user with role $role_to_remove | ||
| 32 | + * | ||
| 33 | + * @param $role | ||
| 34 | + * @param $role_to_remove | ||
| 35 | + * @return bool | ||
| 36 | + */ | ||
| 37 | + static public function access_user_delete($role, $role_to_remove) | ||
| 38 | + { | ||
| 39 | + $is_accessible = true; | ||
| 40 | + switch ($role) | ||
| 41 | + { | ||
| 42 | + case self::AUTHOR: | ||
| 43 | + if (in_array($role_to_remove, [self::EDITOR, self::USER, self::ADMINISTRATOR])) | ||
| 44 | + { | ||
| 45 | + $is_accessible = false; | ||
| 46 | + } | ||
| 47 | + break; | ||
| 48 | + case self::EDITOR: | ||
| 49 | + if (in_array($role_to_remove, [self::USER, self::ADMINISTRATOR])) | ||
| 50 | + { | ||
| 51 | + $is_accessible = false; | ||
| 52 | + } | ||
| 53 | + break; | ||
| 54 | + case self::USER: | ||
| 55 | + if (in_array($role_to_remove, [self::ADMINISTRATOR])) | ||
| 56 | + { | ||
| 57 | + $is_accessible = false; | ||
| 58 | + } | ||
| 59 | + break; | ||
| 60 | + } | ||
| 61 | + return $is_accessible; | ||
| 62 | + } | ||
| 17 | } | 63 | } |
| 18 | \ No newline at end of file | 64 | \ No newline at end of file |
app/library/App/Controllers/ProjectController.php
0 โ 100644
| 1 | +<?php | ||
| 2 | + | ||
| 3 | +namespace App\Controllers; | ||
| 4 | + | ||
| 5 | + | ||
| 6 | +use App\Constants\AclRoles; | ||
| 7 | +use App\Model\Project; | ||
| 8 | +use App\Model\User; | ||
| 9 | +use App\Model\UserProject; | ||
| 10 | +use PhalconApi\Constants\ErrorCodes; | ||
| 11 | +use PhalconApi\Exception; | ||
| 12 | +use PhalconRest\Mvc\Controllers\CrudResourceController; | ||
| 13 | + | ||
| 14 | +class ProjectController extends CrudResourceController | ||
| 15 | +{ | ||
| 16 | + /** | ||
| 17 | + * ะะพะทะฒัะฐัะฐะตั ะฒัะต ะฟัะพัะบัั ะทะฐะปะพะณะธะฝะตะฝะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั | ||
| 18 | + * | ||
| 19 | + * @return mixed | ||
| 20 | + * @throws Exception | ||
| 21 | + */ | ||
| 22 | + public function allAction() | ||
| 23 | + { | ||
| 24 | + $user_id = $this->userService->getIdentity(); | ||
| 25 | + $projects = Project::find(["user_id = '$user_id'"]); | ||
| 26 | + if (count($projects) == 0) | ||
| 27 | + { | ||
| 28 | + $projects = User::findFirst([$user_id])->projects; | ||
| 29 | + if (count($projects) == 0) | ||
| 30 | + { | ||
| 31 | + throw new Exception(ErrorCodes::GENERAL_NOT_FOUND, 'Projects not found'); | ||
| 32 | + } | ||
| 33 | + else | ||
| 34 | + { | ||
| 35 | + var_dump($projects); | ||
| 36 | + return $this->createArrayResponse($projects, 'projects'); | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + else | ||
| 40 | + { | ||
| 41 | + return $this->createArrayResponse($projects, 'projects'); | ||
| 42 | + } | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * @param $data | ||
| 47 | + * @param $isUpdate | ||
| 48 | + * @return bool | ||
| 49 | + * @throws Exception | ||
| 50 | + */ | ||
| 51 | + public function postDataValid($data, $isUpdate) | ||
| 52 | + { | ||
| 53 | + if ($isUpdate) | ||
| 54 | + { | ||
| 55 | + if (isset($data['user_id'])) | ||
| 56 | + { | ||
| 57 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Find user_id value in post-data. Operation is not allowed.'); | ||
| 58 | + } | ||
| 59 | + return true; | ||
| 60 | + } | ||
| 61 | + else | ||
| 62 | + { | ||
| 63 | + if (isset($data['user_id'])) | ||
| 64 | + { | ||
| 65 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Find user_id value in post-data. Operation is not allowed.'); | ||
| 66 | + } | ||
| 67 | + return true; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + /** | ||
| 72 | + * | ||
| 73 | + * @param Project $item | ||
| 74 | + */ | ||
| 75 | + protected function beforeCreate(Project $item) | ||
| 76 | + { | ||
| 77 | + $user_id = $this->userService->getIdentity(); | ||
| 78 | + $item->user_id = $user_id; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + /** | ||
| 82 | + * @param Project $item | ||
| 83 | + * @return bool|void | ||
| 84 | + */ | ||
| 85 | + protected function afterCreate(Project $item) | ||
| 86 | + { | ||
| 87 | + $data = ['project_id' => $item->id, 'user_id' => $item->user_id]; | ||
| 88 | + $junction = new UserProject(); | ||
| 89 | + $junction->user_id = $item->user_id; | ||
| 90 | + $junction->project_id = $item->id; | ||
| 91 | + if (!$junction->save()) | ||
| 92 | + { | ||
| 93 | + return $this->onCreateFailed($junction, $data); | ||
| 94 | + } | ||
| 95 | + return true; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + /** | ||
| 99 | + * @param $id | ||
| 100 | + * @throws Exception | ||
| 101 | + */ | ||
| 102 | + protected function beforeHandleUpdate($id) | ||
| 103 | + { | ||
| 104 | + $user_id = $this->userService->getIdentity(); | ||
| 105 | + | ||
| 106 | + if(!UserProject::findFirst(["user_id = '$user_id'"]) && $this->userService->getRole() !== AclRoles::ADMINISTRATOR) | ||
| 107 | + { | ||
| 108 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Operation is not allowed'); | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + /** | ||
| 113 | + * @param $id | ||
| 114 | + * @throws Exception | ||
| 115 | + */ | ||
| 116 | + protected function beforeHandleRemove($id) | ||
| 117 | + { | ||
| 118 | + $project = Project::findFirst($id)->id; | ||
| 119 | + | ||
| 120 | + if (empty($project)) | ||
| 121 | + { | ||
| 122 | + throw new Exception(ErrorCodes::GENERAL_NOT_FOUND, 'Project with `id`='.$id.' not found'); | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + $user_id = $this->userService->getIdentity(); | ||
| 126 | + | ||
| 127 | + $project = Project::findFirst(["user_id = '$user_id' AND id = '$id'"]); | ||
| 128 | + | ||
| 129 | + if (empty($project) && $this->userService->getRole() !== AclRoles::ADMINISTRATOR) | ||
| 130 | + { | ||
| 131 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Operation is not allowed'); | ||
| 132 | + } | ||
| 133 | + else | ||
| 134 | + { | ||
| 135 | + $project_links = UserProject::find(["project_id = '$id'"]); | ||
| 136 | + foreach ($project_links as $project_link) { | ||
| 137 | + $this->removeItem($project_link); | ||
| 138 | + } | ||
| 139 | + } | ||
| 140 | + } | ||
| 141 | +} | ||
| 0 | \ No newline at end of file | 142 | \ No newline at end of file |
app/library/App/Controllers/UserController.php
| @@ -2,6 +2,14 @@ | @@ -2,6 +2,14 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Controllers; | 3 | namespace App\Controllers; |
| 4 | 4 | ||
| 5 | +use App\Auth\UsernameAccountType; | ||
| 6 | +use App\Constants\AclRoles; | ||
| 7 | +use App\Model\Project; | ||
| 8 | +use App\Model\User; | ||
| 9 | +use App\Model\UserProject; | ||
| 10 | +use App\Transformers\UserTransformer; | ||
| 11 | +use PhalconApi\Constants\ErrorCodes; | ||
| 12 | +use PhalconApi\Exception; | ||
| 5 | use PhalconRest\Mvc\Controllers\CrudResourceController; | 13 | use PhalconRest\Mvc\Controllers\CrudResourceController; |
| 6 | 14 | ||
| 7 | class UserController extends CrudResourceController | 15 | class UserController extends CrudResourceController |
| @@ -22,6 +30,48 @@ class UserController extends CrudResourceController | @@ -22,6 +30,48 @@ class UserController extends CrudResourceController | ||
| 22 | } | 30 | } |
| 23 | 31 | ||
| 24 | /** | 32 | /** |
| 33 | + * ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน c ัะพะปัั AclRoles::EDITOR | ||
| 34 | + * | ||
| 35 | + * @return mixed | ||
| 36 | + */ | ||
| 37 | + public function editorsAction() | ||
| 38 | + { | ||
| 39 | + $current_projects = $this->userService->getDetails()->projects; | ||
| 40 | + $editors = []; | ||
| 41 | + foreach ($current_projects as $project) | ||
| 42 | + { | ||
| 43 | + foreach ($project->users as $user) { | ||
| 44 | + if ($user->role == AclRoles::EDITOR) | ||
| 45 | + { | ||
| 46 | + $editors[$project->id][] = $this->createItemResponse($user, new UserTransformer()); | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | + return $this->createResponse($editors); | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + /** | ||
| 54 | + * ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน c ัะพะปัั AclRoles::AUTHOR | ||
| 55 | + * | ||
| 56 | + * @return mixed | ||
| 57 | + */ | ||
| 58 | + public function authorsAction() | ||
| 59 | + { | ||
| 60 | + $current_projects = $this->userService->getDetails()->projects; | ||
| 61 | + $authors = []; | ||
| 62 | + foreach ($current_projects as $project) | ||
| 63 | + { | ||
| 64 | + foreach ($project->users as $user) { | ||
| 65 | + if ($user->role == AclRoles::AUTHOR) | ||
| 66 | + { | ||
| 67 | + $authors[$project->id][] = $this->createItemResponse($user, new UserTransformer()); | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + return $this->createResponse($authors); | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + /** | ||
| 25 | * ะะพะทะฒัะฐัะฐะตั ัะตะบััะตะณะพ ะทะฐะปะพะณะธะฝะตะฝะฝะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั | 75 | * ะะพะทะฒัะฐัะฐะตั ัะตะบััะตะณะพ ะทะฐะปะพะณะธะฝะตะฝะฝะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั |
| 26 | * | 76 | * |
| 27 | * @return mixed | 77 | * @return mixed |
| @@ -32,6 +82,46 @@ class UserController extends CrudResourceController | @@ -32,6 +82,46 @@ class UserController extends CrudResourceController | ||
| 32 | } | 82 | } |
| 33 | 83 | ||
| 34 | /** | 84 | /** |
| 85 | + * ะะทะผะตะฝะตะฝะธะต ะดะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปั | ||
| 86 | + * | ||
| 87 | + * @param $id | ||
| 88 | + * @throws Exception | ||
| 89 | + */ | ||
| 90 | + public function updateAction($id) | ||
| 91 | + { | ||
| 92 | + if ($this->userService->getRole() == AclRoles::ADMINISTRATOR || $id == $this->userService->getIdentity()) | ||
| 93 | + { | ||
| 94 | + return $this->update($id); | ||
| 95 | + } | ||
| 96 | + else | ||
| 97 | + { | ||
| 98 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Operation is not allowed'); | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * ะฃะดะฐะปะตะฝะธะต ะฟะพะปัะทะพะฒะฐัะตะปั | ||
| 104 | + * | ||
| 105 | + * @param $id | ||
| 106 | + * @throws Exception | ||
| 107 | + */ | ||
| 108 | + public function removeAction($id) | ||
| 109 | + { | ||
| 110 | + $user_role = $this->userService->getRole(); | ||
| 111 | + $user_id = $this->userService->getIdentity(); | ||
| 112 | + $role_to_delete = User::findFirst($id)->role; | ||
| 113 | + | ||
| 114 | + if (AclRoles::access_user_delete($user_role, $role_to_delete) || $user_id == $id) | ||
| 115 | + { | ||
| 116 | + return $this->remove($id); | ||
| 117 | + } | ||
| 118 | + else | ||
| 119 | + { | ||
| 120 | + throw new Exception(ErrorCodes::ACCESS_DENIED, 'Operation is not allowed'); | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + /** | ||
| 35 | * ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ | 125 | * ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ |
| 36 | * | 126 | * |
| 37 | * @return mixed | 127 | * @return mixed |
| @@ -41,13 +131,13 @@ class UserController extends CrudResourceController | @@ -41,13 +131,13 @@ class UserController extends CrudResourceController | ||
| 41 | $username = $this->request->getUsername(); | 131 | $username = $this->request->getUsername(); |
| 42 | $password = $this->request->getPassword(); | 132 | $password = $this->request->getPassword(); |
| 43 | 133 | ||
| 44 | - $session = $this->authManager->loginWithUsernamePassword(\App\Auth\UsernameAccountType::NAME, $username, | 134 | + $session = $this->authManager->loginWithUsernamePassword(UsernameAccountType::NAME, $username, |
| 45 | $password); | 135 | $password); |
| 46 | 136 | ||
| 47 | - $transformer = new \App\Transformers\UserTransformer; | 137 | + $transformer = new UserTransformer; |
| 48 | $transformer->setModelClass('App\Model\User'); | 138 | $transformer->setModelClass('App\Model\User'); |
| 49 | 139 | ||
| 50 | - $user = $this->createItemResponse(\App\Model\User::findFirst($session->getIdentity()), $transformer); | 140 | + $user = $this->createItemResponse(User::findFirst($session->getIdentity()), $transformer); |
| 51 | 141 | ||
| 52 | $response = [ | 142 | $response = [ |
| 53 | 'token' => $session->getToken(), | 143 | 'token' => $session->getToken(), |
| @@ -63,7 +153,8 @@ class UserController extends CrudResourceController | @@ -63,7 +153,8 @@ class UserController extends CrudResourceController | ||
| 63 | * | 153 | * |
| 64 | * @return mixed | 154 | * @return mixed |
| 65 | */ | 155 | */ |
| 66 | - public function registerAction() { | 156 | + public function registerAction() |
| 157 | + { | ||
| 67 | 158 | ||
| 68 | $this->beforeHandle(); | 159 | $this->beforeHandle(); |
| 69 | $this->beforeHandleWrite(); | 160 | $this->beforeHandleWrite(); |
| @@ -106,16 +197,72 @@ class UserController extends CrudResourceController | @@ -106,16 +197,72 @@ class UserController extends CrudResourceController | ||
| 106 | } | 197 | } |
| 107 | 198 | ||
| 108 | /** | 199 | /** |
| 200 | + * ะัะธะณะปะฐัะตะฝะธะต ัััะตััะฒัััะตะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั ะฒ ะฟัะพัะบั | ||
| 201 | + * | ||
| 202 | + * @throws Exception | ||
| 203 | + */ | ||
| 204 | + public function inviteAction() | ||
| 205 | + { | ||
| 206 | + $user_id = $this->request->get('user_id'); | ||
| 207 | + $project_id = $this->request->get('project_id'); | ||
| 208 | + | ||
| 209 | + if (empty($user_id) || empty($project_id)) | ||
| 210 | + { | ||
| 211 | + throw new Exception(ErrorCodes::DATA_NOT_FOUND, 'Empty post-data'); | ||
| 212 | + } | ||
| 213 | + elseif (!User::findFirst($user_id)) | ||
| 214 | + { | ||
| 215 | + throw new Exception(ErrorCodes::GENERAL_NOT_FOUND, 'User with requested id not found'); | ||
| 216 | + } | ||
| 217 | + elseif (!Project::findFirst($project_id)) | ||
| 218 | + { | ||
| 219 | + throw new Exception(ErrorCodes::GENERAL_NOT_FOUND, 'Project with requested id not found'); | ||
| 220 | + } | ||
| 221 | + elseif (UserProject::findFirst(["user_id = '$user_id' AND project_id = '$project_id'"])) | ||
| 222 | + { | ||
| 223 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, 'User already invited'); | ||
| 224 | + } | ||
| 225 | + else | ||
| 226 | + { | ||
| 227 | + $userProject = new UserProject(); | ||
| 228 | + $data = ['project_id' => $project_id, 'user_id' => $user_id]; | ||
| 229 | + $userProject->user_id = $user_id; | ||
| 230 | + $userProject->project_id = $project_id; | ||
| 231 | + if (!$userProject->save()) | ||
| 232 | + { | ||
| 233 | + return $this->onCreateFailed($userProject, $data); | ||
| 234 | + } | ||
| 235 | + else | ||
| 236 | + { | ||
| 237 | + return $this->createResponse($data); | ||
| 238 | + } | ||
| 239 | + } | ||
| 240 | + } | ||
| 241 | + | ||
| 242 | + /** | ||
| 109 | * ะะตัะตะพะฟัะตะดะตะปะตะฝะธะต ะฒั ะพะดะฝัั ะดะฐะฝะฝัั | 243 | * ะะตัะตะพะฟัะตะดะตะปะตะฝะธะต ะฒั ะพะดะฝัั ะดะฐะฝะฝัั |
| 110 | * | 244 | * |
| 111 | * @param $data | 245 | * @param $data |
| 112 | * @return array | 246 | * @return array |
| 247 | + * @throws Exception | ||
| 113 | */ | 248 | */ |
| 114 | protected function transformPostData($data) | 249 | protected function transformPostData($data) |
| 115 | { | 250 | { |
| 116 | $result = []; | 251 | $result = []; |
| 117 | 252 | ||
| 118 | - foreach ($data as $key => $value) { | 253 | + foreach ($data as $key => $value) |
| 254 | + { | ||
| 255 | + /** --- ะะตะฝััั ัะพะปะธ ะผะพะถะตั ัะพะปัะบะพ ะฐะดะผะธะฝ ---- **/ | ||
| 256 | + if ($this->userService->getRole() !== AclRoles::ADMINISTRATOR && $key == 'role') | ||
| 257 | + { | ||
| 258 | + $msg = 'You have not access for field `role`'; | ||
| 259 | + throw new Exception( | ||
| 260 | + ErrorCodes::POST_DATA_INVALID, | ||
| 261 | + $msg, | ||
| 262 | + ['post data field' => $key, 'value' => $value] | ||
| 263 | + ); | ||
| 264 | + } | ||
| 265 | + /** -------------------------------------- **/ | ||
| 119 | $result[$key] = $this->transformPostDataValue($key, $value, $data); | 266 | $result[$key] = $this->transformPostDataValue($key, $value, $data); |
| 120 | } | 267 | } |
| 121 | 268 | ||
| @@ -139,4 +286,17 @@ class UserController extends CrudResourceController | @@ -139,4 +286,17 @@ class UserController extends CrudResourceController | ||
| 139 | } | 286 | } |
| 140 | } | 287 | } |
| 141 | 288 | ||
| 289 | + /** | ||
| 290 | + * ะกะพะฟััััะฒัััะตะต ัะดะฐะปะตะฝะธะต ะธะท ะฟะตัะตะปะธะฝะบะพะฒะพัะฝะพะน ัะฐะฑะปะธัั ะฟัะพัะบั-ะฟะพะปัะทะพะฒะฐัะตะปั | ||
| 291 | + * | ||
| 292 | + * @param $id | ||
| 293 | + */ | ||
| 294 | + protected function beforeHandleRemove($id) | ||
| 295 | + { | ||
| 296 | + $junctions = UserProject::findFirst("user_id = '$id'"); | ||
| 297 | + if ($junctions) | ||
| 298 | + { | ||
| 299 | + $junctions->delete(); | ||
| 300 | + } | ||
| 301 | + } | ||
| 142 | } | 302 | } |
| 143 | \ No newline at end of file | 303 | \ No newline at end of file |
app/library/App/Model/Album.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Model; | ||
| 4 | - | ||
| 5 | -class Album extends \App\Mvc\DateTrackingModel | ||
| 6 | -{ | ||
| 7 | - public $id; | ||
| 8 | - public $title; | ||
| 9 | - | ||
| 10 | - public function getSource() | ||
| 11 | - { | ||
| 12 | - return 'album'; | ||
| 13 | - } | ||
| 14 | - | ||
| 15 | - public function columnMap() | ||
| 16 | - { | ||
| 17 | - return parent::columnMap() + [ | ||
| 18 | - 'id' => 'id', | ||
| 19 | - 'title' => 'title' | ||
| 20 | - ]; | ||
| 21 | - } | ||
| 22 | - | ||
| 23 | - public function initialize() { | ||
| 24 | - | ||
| 25 | - $this->hasMany('id', Photo::class, 'albumId', [ | ||
| 26 | - 'alias' => 'Photos', | ||
| 27 | - ]); | ||
| 28 | - } | ||
| 29 | -} |
app/library/App/Model/Photo.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Model; | ||
| 4 | - | ||
| 5 | -class Photo extends \App\Mvc\DateTrackingModel | ||
| 6 | -{ | ||
| 7 | - public $id; | ||
| 8 | - public $title; | ||
| 9 | - public $albumId; | ||
| 10 | - | ||
| 11 | - public function getSource() | ||
| 12 | - { | ||
| 13 | - return 'photo'; | ||
| 14 | - } | ||
| 15 | - | ||
| 16 | - public function columnMap() | ||
| 17 | - { | ||
| 18 | - return parent::columnMap() + [ | ||
| 19 | - 'id' => 'id', | ||
| 20 | - 'title' => 'title', | ||
| 21 | - 'album_id' => 'albumId' | ||
| 22 | - ]; | ||
| 23 | - } | ||
| 24 | - | ||
| 25 | - public function initialize() { | ||
| 26 | - | ||
| 27 | - $this->belongsTo('albumId', Album::class, 'id', [ | ||
| 28 | - 'alias' => 'Album', | ||
| 29 | - ]); | ||
| 30 | - } | ||
| 31 | -} |
app/library/App/Model/Project.php
| @@ -2,7 +2,11 @@ | @@ -2,7 +2,11 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Model; | 3 | namespace App\Model; |
| 4 | 4 | ||
| 5 | -class Project extends \App\Mvc\DateTrackingModel | 5 | +use App\Mvc\DateTrackingModel; |
| 6 | +use PhalconApi\Constants\ErrorCodes; | ||
| 7 | +use PhalconApi\Exception; | ||
| 8 | + | ||
| 9 | +class Project extends DateTrackingModel | ||
| 6 | { | 10 | { |
| 7 | public $id; | 11 | public $id; |
| 8 | public $name; | 12 | public $name; |
| @@ -31,5 +35,94 @@ class Project extends \App\Mvc\DateTrackingModel | @@ -31,5 +35,94 @@ class Project extends \App\Mvc\DateTrackingModel | ||
| 31 | $this->belongsTo('user_id', User::class, 'id', [ | 35 | $this->belongsTo('user_id', User::class, 'id', [ |
| 32 | 'alias' => 'User', | 36 | 'alias' => 'User', |
| 33 | ]); | 37 | ]); |
| 38 | + | ||
| 39 | + $this->hasManyToMany( | ||
| 40 | + 'id', | ||
| 41 | + UserProject::class, | ||
| 42 | + 'project_id', | ||
| 43 | + 'user_id', | ||
| 44 | + User::class, | ||
| 45 | + 'id', | ||
| 46 | + array('alias' => 'users') | ||
| 47 | + ); | ||
| 34 | } | 48 | } |
| 49 | + | ||
| 50 | + /** ------- Getters and Setters ------- **/ | ||
| 51 | + | ||
| 52 | + /** validation: non-empty, 4+ letters * | ||
| 53 | + * @param $name | ||
| 54 | + * @throws Exception | ||
| 55 | + */ | ||
| 56 | + public function setName($name) | ||
| 57 | + { | ||
| 58 | + if (empty($name)) | ||
| 59 | + { | ||
| 60 | + $msg = 'Post-data is invalid, trying to use empty value of `name`'; | ||
| 61 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['name' => $name]); | ||
| 62 | + } | ||
| 63 | + elseif (strlen($name) < 4) | ||
| 64 | + { | ||
| 65 | + $msg = 'Post-data is invalid, value of `name` should be more than 4 letters'; | ||
| 66 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['name' => $name]); | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + $this->name = $name; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + /** validation: non-empty, integer * | ||
| 73 | + * @param $ga_view_id | ||
| 74 | + * @throws Exception | ||
| 75 | + */ | ||
| 76 | + public function setGa_view_id($ga_view_id) | ||
| 77 | + { | ||
| 78 | + if (empty($ga_view_id)) | ||
| 79 | + { | ||
| 80 | + $msg = 'Post-data is invalid, trying to use empty value of `ga_view_id`'; | ||
| 81 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['ga_view_id' => $ga_view_id]); | ||
| 82 | + } | ||
| 83 | + elseif (!is_integer($ga_view_id)) | ||
| 84 | + { | ||
| 85 | + $msg = 'Post-data is invalid, type of `ga_view_id` should be integer'; | ||
| 86 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['ga_view_id' => $ga_view_id]); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + $this->ga_view_id = $ga_view_id; | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + /** validation: non-empty, integer * | ||
| 93 | + * @param $group | ||
| 94 | + * @throws Exception | ||
| 95 | + */ | ||
| 96 | + public function setGroup($group) | ||
| 97 | + { | ||
| 98 | + if (empty($group)) | ||
| 99 | + { | ||
| 100 | + $msg = 'Post-data is invalid, trying to use empty value of `group`'; | ||
| 101 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['group' => $group]); | ||
| 102 | + } | ||
| 103 | + elseif (!is_integer($group)) | ||
| 104 | + { | ||
| 105 | + $msg = 'Post-data is invalid, type of `group` should be integer'; | ||
| 106 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['group' => $group]); | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + $this->group = $group; | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + public function getName() | ||
| 113 | + { | ||
| 114 | + return $this->name; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + public function getGa_view_id() | ||
| 118 | + { | ||
| 119 | + return $this->ga_view_id; | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | + public function getGroup() | ||
| 123 | + { | ||
| 124 | + return $this->group; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + /** ----------------------------------- **/ | ||
| 35 | } | 128 | } |
app/library/App/Model/User.php
| @@ -34,19 +34,35 @@ class User extends DateTrackingModel | @@ -34,19 +34,35 @@ class User extends DateTrackingModel | ||
| 34 | 34 | ||
| 35 | public function initialize() | 35 | public function initialize() |
| 36 | { | 36 | { |
| 37 | - $this->hasMany('id', Project::class, 'user_id', [ | ||
| 38 | - 'alias' => 'Projects', | ||
| 39 | - ]); | 37 | + $this->hasMany( |
| 38 | + 'id', | ||
| 39 | + Project::class, | ||
| 40 | + 'user_id', | ||
| 41 | + [ | ||
| 42 | + 'alias' => 'Projects', | ||
| 43 | + ] | ||
| 44 | + ); | ||
| 45 | + | ||
| 46 | + $this->hasManyToMany( | ||
| 47 | + 'id', | ||
| 48 | + UserProject::class, | ||
| 49 | + 'user_id', | ||
| 50 | + 'project_id', | ||
| 51 | + Project::class, | ||
| 52 | + 'id', | ||
| 53 | + array('alias' => 'projects') | ||
| 54 | + ); | ||
| 40 | } | 55 | } |
| 41 | 56 | ||
| 42 | - public function getUsername() | ||
| 43 | - { | ||
| 44 | - return $this->username; | ||
| 45 | - } | 57 | + /** ------- Getters and Setters ------- **/ |
| 58 | + | ||
| 59 | + /** validation: unique, non-empty, 4+ letters * | ||
| 60 | + * @param $username | ||
| 61 | + * @throws Exception | ||
| 62 | + */ | ||
| 63 | + public function setUsername($username) | ||
| 64 | + { | ||
| 46 | 65 | ||
| 47 | - public function setUsername($username) | ||
| 48 | - { | ||
| 49 | - /** validation: unique, non-empty, 4+ letters **/ | ||
| 50 | $same_user = User::find(["username = '".$username."'"]); | 66 | $same_user = User::find(["username = '".$username."'"]); |
| 51 | if (isset($same_user[0]) && !empty($same_user[0]->username)) | 67 | if (isset($same_user[0]) && !empty($same_user[0]->username)) |
| 52 | { | 68 | { |
| @@ -56,45 +72,38 @@ class User extends DateTrackingModel | @@ -56,45 +72,38 @@ class User extends DateTrackingModel | ||
| 56 | elseif (empty($username)) | 72 | elseif (empty($username)) |
| 57 | { | 73 | { |
| 58 | $msg = 'Post-data is invalid, trying to use empty value of `username`'; | 74 | $msg = 'Post-data is invalid, trying to use empty value of `username`'; |
| 59 | - throw new Exception(ErrorCodes::DATA_NOT_FOUND, $msg, ['username' => $username]); | 75 | + throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['username' => $username]); |
| 60 | } | 76 | } |
| 61 | elseif (strlen($username) < 4) | 77 | elseif (strlen($username) < 4) |
| 62 | { | 78 | { |
| 63 | $msg = 'Post-data is invalid, value of `username` should be more than 4 letters'; | 79 | $msg = 'Post-data is invalid, value of `username` should be more than 4 letters'; |
| 64 | throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['username' => $username]); | 80 | throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['username' => $username]); |
| 65 | } | 81 | } |
| 66 | - /** ---------------------------------------- **/ | ||
| 67 | 82 | ||
| 68 | - $this->username = $username; | ||
| 69 | - } | 83 | + $this->username = $username; |
| 84 | + } | ||
| 70 | 85 | ||
| 71 | - public function getEmail() | ||
| 72 | - { | ||
| 73 | - return $this->email; | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - public function setEmail($email) | ||
| 77 | - { | ||
| 78 | - /** validation: FILTER_VALIDATE_EMAIL **/ | 86 | + /** validation: FILTER_VALIDATE_EMAIL * |
| 87 | + * @param $email | ||
| 88 | + * @throws Exception | ||
| 89 | + */ | ||
| 90 | + public function setEmail($email) | ||
| 91 | + { | ||
| 79 | if (!filter_var($email, FILTER_VALIDATE_EMAIL)) | 92 | if (!filter_var($email, FILTER_VALIDATE_EMAIL)) |
| 80 | { | 93 | { |
| 81 | $msg = 'Post-data is invalid, bad email value'; | 94 | $msg = 'Post-data is invalid, bad email value'; |
| 82 | throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['email' => $email]); | 95 | throw new Exception(ErrorCodes::POST_DATA_INVALID, $msg, ['email' => $email]); |
| 83 | } | 96 | } |
| 84 | - /** ---------- */ | ||
| 85 | 97 | ||
| 86 | - $this->email = $email; | ||
| 87 | - } | 98 | + $this->email = $email; |
| 99 | + } | ||
| 88 | 100 | ||
| 89 | - public function getRole() | ||
| 90 | - { | ||
| 91 | - $service = new Service(); | ||
| 92 | - return $service->getRole(); | ||
| 93 | - } | ||
| 94 | - | ||
| 95 | - public function setRole($role) | ||
| 96 | - { | ||
| 97 | - /** validation: constant value **/ | 101 | + /** validation: constant value * |
| 102 | + * @param $role | ||
| 103 | + * @throws Exception | ||
| 104 | + */ | ||
| 105 | + public function setRole($role) | ||
| 106 | + { | ||
| 98 | if (!in_array($role, AclRoles::ALL_REAL_ROLES)) | 107 | if (!in_array($role, AclRoles::ALL_REAL_ROLES)) |
| 99 | { | 108 | { |
| 100 | $msg = 'Post-data is invalid, bad `role` value'; | 109 | $msg = 'Post-data is invalid, bad `role` value'; |
| @@ -104,9 +113,27 @@ class User extends DateTrackingModel | @@ -104,9 +113,27 @@ class User extends DateTrackingModel | ||
| 104 | ['role' => $role, 'valid values' => AclRoles::ALL_REAL_ROLES] | 113 | ['role' => $role, 'valid values' => AclRoles::ALL_REAL_ROLES] |
| 105 | ); | 114 | ); |
| 106 | } | 115 | } |
| 107 | - /** -------------------------- **/ | ||
| 108 | 116 | ||
| 109 | - $this->role = $role; | ||
| 110 | - } | 117 | + $this->role = $role; |
| 118 | + } | ||
| 119 | + | ||
| 120 | + | ||
| 121 | + public function getUsername() | ||
| 122 | + { | ||
| 123 | + return $this->username; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + public function getEmail() | ||
| 127 | + { | ||
| 128 | + return $this->email; | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + public function getRole() | ||
| 132 | + { | ||
| 133 | + $service = new Service(); | ||
| 134 | + return $service->getRole(); | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + /** ----------------------------------- **/ | ||
| 111 | 138 | ||
| 112 | } | 139 | } |
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * Created by PhpStorm. | ||
| 4 | + * User: Alex Savenko | ||
| 5 | + * Date: 05.04.2017 | ||
| 6 | + * Time: 18:08 | ||
| 7 | + */ | ||
| 8 | + | ||
| 9 | +namespace App\Model; | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +use Phalcon\Mvc\Model; | ||
| 13 | + | ||
| 14 | +class UserProject extends Model | ||
| 15 | +{ | ||
| 16 | + public function getSource() | ||
| 17 | + { | ||
| 18 | + return 'user_project'; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + public function initialize() | ||
| 22 | + { | ||
| 23 | + $this->belongsTo('project_id', Project::class, 'id', | ||
| 24 | + array('alias' => 'project') | ||
| 25 | + ); | ||
| 26 | + $this->belongsTo('user_id', User::class, 'id', | ||
| 27 | + array('alias' => 'user') | ||
| 28 | + ); | ||
| 29 | + } | ||
| 30 | +} | ||
| 0 | \ No newline at end of file | 31 | \ No newline at end of file |
app/library/App/Resources/AlbumResource.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Resources; | ||
| 4 | - | ||
| 5 | -use PhalconRest\Api\ApiEndpoint; | ||
| 6 | -use PhalconRest\Api\ApiResource; | ||
| 7 | -use App\Model\Album; | ||
| 8 | -use App\Transformers\AlbumTransformer; | ||
| 9 | -use App\Constants\AclRoles; | ||
| 10 | -use PhalconRest\Mvc\Controllers\CrudResourceController; | ||
| 11 | - | ||
| 12 | -class AlbumResource extends ApiResource { | ||
| 13 | - | ||
| 14 | - public function initialize() | ||
| 15 | - { | ||
| 16 | - $this | ||
| 17 | - ->name('Album') | ||
| 18 | - ->model(Album::class) | ||
| 19 | - ->expectsJsonData() | ||
| 20 | - ->transformer(AlbumTransformer::class) | ||
| 21 | - ->itemKey('album') | ||
| 22 | - ->collectionKey('albums') | ||
| 23 | - ->deny(AclRoles::UNAUTHORIZED) | ||
| 24 | - ->handler(CrudResourceController::class) | ||
| 25 | - | ||
| 26 | - ->endpoint(ApiEndpoint::all()) | ||
| 27 | - ->endpoint(ApiEndpoint::create()) | ||
| 28 | - ->endpoint(ApiEndpoint::find()) | ||
| 29 | - ->endpoint(ApiEndpoint::update()) | ||
| 30 | - ->endpoint(ApiEndpoint::remove()); | ||
| 31 | - } | ||
| 32 | -} |
app/library/App/Resources/PhotoResource.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Resources; | ||
| 4 | - | ||
| 5 | -use PhalconRest\Api\ApiEndpoint; | ||
| 6 | -use PhalconRest\Api\ApiResource; | ||
| 7 | -use App\Model\Photo; | ||
| 8 | -use App\Transformers\PhotoTransformer; | ||
| 9 | -use App\Constants\AclRoles; | ||
| 10 | -use PhalconRest\Mvc\Controllers\CrudResourceController; | ||
| 11 | - | ||
| 12 | -class PhotoResource extends ApiResource { | ||
| 13 | - | ||
| 14 | - public function initialize() | ||
| 15 | - { | ||
| 16 | - $this | ||
| 17 | - ->name('Photo') | ||
| 18 | - ->model(Photo::class) | ||
| 19 | - ->expectsJsonData() | ||
| 20 | - ->transformer(PhotoTransformer::class) | ||
| 21 | - ->itemKey('photo') | ||
| 22 | - ->collectionKey('photos') | ||
| 23 | - ->deny(AclRoles::UNAUTHORIZED) | ||
| 24 | - ->handler(CrudResourceController::class) | ||
| 25 | - | ||
| 26 | - ->endpoint(ApiEndpoint::all()) | ||
| 27 | - ->endpoint(ApiEndpoint::create()) | ||
| 28 | - ->endpoint(ApiEndpoint::find()) | ||
| 29 | - ->endpoint(ApiEndpoint::update()) | ||
| 30 | - ->endpoint(ApiEndpoint::remove()); | ||
| 31 | - } | ||
| 32 | -} |
app/library/App/Resources/ProjectResource.php
| @@ -8,12 +8,13 @@ | @@ -8,12 +8,13 @@ | ||
| 8 | 8 | ||
| 9 | namespace App\Resources; | 9 | namespace App\Resources; |
| 10 | 10 | ||
| 11 | +use App\Controllers\ProjectController; | ||
| 12 | +use PhalconApi\Constants\HttpMethods; | ||
| 11 | use PhalconRest\Api\ApiEndpoint; | 13 | use PhalconRest\Api\ApiEndpoint; |
| 12 | use PhalconRest\Api\ApiResource; | 14 | use PhalconRest\Api\ApiResource; |
| 13 | use App\Model\Project; | 15 | use App\Model\Project; |
| 14 | use PhalconRest\Transformers\ModelTransformer; | 16 | use PhalconRest\Transformers\ModelTransformer; |
| 15 | use App\Constants\AclRoles; | 17 | use App\Constants\AclRoles; |
| 16 | -use PhalconRest\Mvc\Controllers\CrudResourceController; | ||
| 17 | 18 | ||
| 18 | class ProjectResource extends ApiResource { | 19 | class ProjectResource extends ApiResource { |
| 19 | 20 | ||
| @@ -26,14 +27,60 @@ class ProjectResource extends ApiResource { | @@ -26,14 +27,60 @@ class ProjectResource extends ApiResource { | ||
| 26 | ->transformer(ModelTransformer::class) | 27 | ->transformer(ModelTransformer::class) |
| 27 | ->itemKey('project') | 28 | ->itemKey('project') |
| 28 | ->collectionKey('projects') | 29 | ->collectionKey('projects') |
| 29 | - ->deny(AclRoles::UNAUTHORIZED) | ||
| 30 | - ->handler(CrudResourceController::class) | ||
| 31 | - | ||
| 32 | - ->endpoint(ApiEndpoint::all()) | ||
| 33 | - ->endpoint(ApiEndpoint::create()) | ||
| 34 | - ->endpoint(ApiEndpoint::find()) | ||
| 35 | - ->endpoint(ApiEndpoint::update()) | ||
| 36 | - ->endpoint(ApiEndpoint::remove()); | 30 | + ->deny(AclRoles::ALL_ROLES) |
| 31 | + ->handler(ProjectController::class) | ||
| 32 | + | ||
| 33 | + /** -------------------- [GET] projects ----------------------------- **/ | ||
| 34 | + ->endpoint(ApiEndpoint::factory('/', HttpMethods::GET, 'allAction') | ||
| 35 | + ->name(ApiEndpoint::ALL) | ||
| 36 | + ->description('Returns all items') | ||
| 37 | + ->allow( | ||
| 38 | + AclRoles::ADMINISTRATOR, | ||
| 39 | + AclRoles::USER, | ||
| 40 | + AclRoles::EDITOR, | ||
| 41 | + AclRoles::AUTHOR | ||
| 42 | + ) | ||
| 43 | + ) | ||
| 44 | + /** ----------------------------------------------------------------- **/ | ||
| 45 | + | ||
| 46 | + /** -------------------- [POST] projects ---------------------------- **/ | ||
| 47 | + ->endpoint(ApiEndpoint::factory('/', HttpMethods::POST, 'create') | ||
| 48 | + ->name(ApiEndpoint::CREATE) | ||
| 49 | + ->description('Creates a new item using the posted data') | ||
| 50 | + ->allow( | ||
| 51 | + AclRoles::ADMINISTRATOR, | ||
| 52 | + AclRoles::USER | ||
| 53 | + ) | ||
| 54 | + ) | ||
| 55 | + /** ----------------------------------------------------------------- **/ | ||
| 56 | + | ||
| 57 | + /** -------------------- [GET] projects/{id} ------------------------ **/ | ||
| 58 | + ->endpoint(ApiEndpoint::find() | ||
| 59 | + ->allow(AclRoles::ADMINISTRATOR) | ||
| 60 | + ) | ||
| 61 | + /** ----------------------------------------------------------------- **/ | ||
| 62 | + | ||
| 63 | + /** -------------------- [PUT] projects/{id} ------------------------ **/ | ||
| 64 | + ->endpoint(ApiEndpoint::factory('/{id}', HttpMethods::PUT, 'update') | ||
| 65 | + ->name(ApiEndpoint::UPDATE) | ||
| 66 | + ->description('Updates an existing item identified by {id}, using the posted data') | ||
| 67 | + ->allow( | ||
| 68 | + AclRoles::ADMINISTRATOR, | ||
| 69 | + AclRoles::USER | ||
| 70 | + ) | ||
| 71 | + ) | ||
| 72 | + /** ----------------------------------------------------------------- **/ | ||
| 73 | + | ||
| 74 | + /** -------------------- [DELETE] projects/{id} --------------------- **/ | ||
| 75 | + ->endpoint(ApiEndpoint::factory('/{id}', HttpMethods::DELETE, 'remove') | ||
| 76 | + ->name(ApiEndpoint::REMOVE) | ||
| 77 | + ->description('Removes the item identified by {id}') | ||
| 78 | + ->allow( | ||
| 79 | + AclRoles::ADMINISTRATOR, | ||
| 80 | + AclRoles::USER | ||
| 81 | + ) | ||
| 82 | + ); | ||
| 83 | + /** ----------------------------------------------------------------- **/ | ||
| 37 | } | 84 | } |
| 38 | 85 | ||
| 39 | } | 86 | } |
| 40 | \ No newline at end of file | 87 | \ No newline at end of file |
app/library/App/Resources/UserResource.php
| @@ -21,53 +21,132 @@ class UserResource extends ApiResource { | @@ -21,53 +21,132 @@ class UserResource extends ApiResource { | ||
| 21 | ->transformer(UserTransformer::class) | 21 | ->transformer(UserTransformer::class) |
| 22 | ->itemKey('user') | 22 | ->itemKey('user') |
| 23 | ->collectionKey('users') | 23 | ->collectionKey('users') |
| 24 | - ->deny(AclRoles::UNAUTHORIZED, AclRoles::USER) | ||
| 25 | ->handler(UserController::class) | 24 | ->handler(UserController::class) |
| 25 | + ->deny(AclRoles::ALL_ROLES) | ||
| 26 | 26 | ||
| 27 | /** -------------------- [GET] users -------------------------------- **/ | 27 | /** -------------------- [GET] users -------------------------------- **/ |
| 28 | ->endpoint(ApiEndpoint::all() | 28 | ->endpoint(ApiEndpoint::all() |
| 29 | - ->allow(AclRoles::USER) | ||
| 30 | ->name('all') | 29 | ->name('all') |
| 31 | ->description('ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน') | 30 | ->description('ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน') |
| 31 | + ->allow( | ||
| 32 | + AclRoles::ADMINISTRATOR | ||
| 33 | + ) | ||
| 34 | + ) | ||
| 35 | + /** ----------------------------------------------------------------- **/ | ||
| 36 | + | ||
| 37 | + /** -------------------- [GET] users/editors ------------------------ **/ | ||
| 38 | + ->endpoint(ApiEndpoint::factory('/editors', HttpMethods::GET, 'editorsAction') | ||
| 39 | + ->name('all editors') | ||
| 40 | + ->description('ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน c ัะพะปัั "'.AclRoles::EDITOR.'" ะฟะพ ะบะฐะถะดะพะผั ะฟัะพัะบัั') | ||
| 41 | + ->allow( | ||
| 42 | + AclRoles::ADMINISTRATOR, | ||
| 43 | + AclRoles::USER | ||
| 44 | + ) | ||
| 45 | + ->exampleResponse([ | ||
| 46 | + "68" => [ | ||
| 47 | + [ | ||
| 48 | + "id" => 4, | ||
| 49 | + "username" => "Tim2", | ||
| 50 | + "email" => "timTEST2@awd.awd", | ||
| 51 | + "role" => "Editor", | ||
| 52 | + "createdAt" => "2017-02-16 19:05:18", | ||
| 53 | + "updatedAt" => "2017-03-21 14:31:48" | ||
| 54 | + ], | ||
| 55 | + [ | ||
| 56 | + "id" => 5, | ||
| 57 | + "username" => "Tim3", | ||
| 58 | + "email" => "timTEST3@awd.awd", | ||
| 59 | + "role" => "Editor", | ||
| 60 | + "createdAt" => "2017-02-16 19:05:18", | ||
| 61 | + "updatedAt" => "2017-03-21 14:31:48" | ||
| 62 | + ] | ||
| 63 | + ] | ||
| 64 | + ]) | ||
| 65 | + ) | ||
| 66 | + /** ----------------------------------------------------------------- **/ | ||
| 67 | + | ||
| 68 | + /** -------------------- [GET] users/authors ------------------------ **/ | ||
| 69 | + ->endpoint(ApiEndpoint::factory('/authors', HttpMethods::GET, 'authorsAction') | ||
| 70 | + ->name('all authors') | ||
| 71 | + ->description('ะะพะทะฒัะฐัะฐะตั ะฒัะตั ะทะฐัะตะณะธัััะธัะพะฒะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปะตะน c ัะพะปัั "'.AclRoles::AUTHOR.'" ะฟะพ ะบะฐะถะดะพะผั ะฟัะพัะบัั') | ||
| 72 | + ->allow( | ||
| 73 | + AclRoles::ADMINISTRATOR, | ||
| 74 | + AclRoles::USER, | ||
| 75 | + AclRoles::EDITOR | ||
| 76 | + ) | ||
| 77 | + ->exampleResponse([ | ||
| 78 | + "68" => [ | ||
| 79 | + [ | ||
| 80 | + "id" => 4, | ||
| 81 | + "username" => "Tim2", | ||
| 82 | + "email" => "timTEST2@awd.awd", | ||
| 83 | + "role" => "Author", | ||
| 84 | + "createdAt" => "2017-02-16 19:05:18", | ||
| 85 | + "updatedAt" => "2017-03-21 14:31:48" | ||
| 86 | + ], | ||
| 87 | + [ | ||
| 88 | + "id" => 5, | ||
| 89 | + "username" => "Tim3", | ||
| 90 | + "email" => "timTEST3@awd.awd", | ||
| 91 | + "role" => "Author", | ||
| 92 | + "createdAt" => "2017-02-16 19:05:18", | ||
| 93 | + "updatedAt" => "2017-03-21 14:31:48" | ||
| 94 | + ] | ||
| 95 | + ] | ||
| 96 | + ]) | ||
| 32 | ) | 97 | ) |
| 33 | /** ----------------------------------------------------------------- **/ | 98 | /** ----------------------------------------------------------------- **/ |
| 34 | 99 | ||
| 35 | /** -------------------- [GET] users/me ----------------------------- **/ | 100 | /** -------------------- [GET] users/me ----------------------------- **/ |
| 36 | ->endpoint(ApiEndpoint::factory('/me', HttpMethods::GET, 'meAction') | 101 | ->endpoint(ApiEndpoint::factory('/me', HttpMethods::GET, 'meAction') |
| 37 | - ->name('me') | ||
| 38 | - ->description('ะะพะทะฒัะฐัะฐะตั ัะตะบััะตะณะพ ะทะฐะปะพะณะธะฝะตะฝะฝะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั') | ||
| 39 | - ->allow(AclRoles::USER) | ||
| 40 | - ) | 102 | + ->name('me') |
| 103 | + ->description('ะะพะทะฒัะฐัะฐะตั ัะตะบััะตะณะพ ะทะฐะปะพะณะธะฝะตะฝะฝะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั') | ||
| 104 | + ->allow( | ||
| 105 | + AclRoles::ADMINISTRATOR, | ||
| 106 | + AclRoles::USER, | ||
| 107 | + AclRoles::EDITOR, | ||
| 108 | + AclRoles::AUTHOR | ||
| 109 | + ) | ||
| 110 | + ) | ||
| 41 | /** ----------------------------------------------------------------- **/ | 111 | /** ----------------------------------------------------------------- **/ |
| 42 | 112 | ||
| 43 | /** -------------------- [PUT] users/{id} -------------------------- **/ | 113 | /** -------------------- [PUT] users/{id} -------------------------- **/ |
| 44 | - ->endpoint(ApiEndpoint::update() | ||
| 45 | - ->name('update') | ||
| 46 | - ->description('ะะทะผะตะฝะตะฝะธะต ะดะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปั') | ||
| 47 | - ->allow(AclRoles::ADMINISTRATOR) | ||
| 48 | - ->deny(AclRoles::MANAGER) | ||
| 49 | - ->exampleRequest([ | ||
| 50 | - 'role' => 'Manager' | ||
| 51 | - ]) | ||
| 52 | - ->exampleResponse([ | ||
| 53 | - "result" => "OK", | ||
| 54 | - "user" => [ | ||
| 55 | - "id" => 101, | ||
| 56 | - "username" => "qwerty", | ||
| 57 | - "email" => "1a23@awd.awd", | ||
| 58 | - "role" => "Manager", | ||
| 59 | - "createdAt" => "2017-02-16 19:05:18", | ||
| 60 | - "updatedAt" => "2017-03-21 14:31:48" | ||
| 61 | - ] | ||
| 62 | - ]) | ||
| 63 | - ) | 114 | + ->endpoint(ApiEndpoint::factory('/{id}', HttpMethods::PUT, 'updateAction') |
| 115 | + ->name('update') | ||
| 116 | + ->description('ะะทะผะตะฝะตะฝะธะต ะดะฐะฝะฝัั ะฟะพะปัะทะพะฒะฐัะตะปั') | ||
| 117 | + ->allow( | ||
| 118 | + AclRoles::ADMINISTRATOR, | ||
| 119 | + AclRoles::USER, | ||
| 120 | + AclRoles::EDITOR, | ||
| 121 | + AclRoles::AUTHOR | ||
| 122 | + ) | ||
| 123 | + ->exampleRequest([ | ||
| 124 | + 'role' => 'User' | ||
| 125 | + ]) | ||
| 126 | + ->exampleResponse([ | ||
| 127 | + "result" => "OK", | ||
| 128 | + "user" => [ | ||
| 129 | + "id" => 101, | ||
| 130 | + "username" => "qwerty", | ||
| 131 | + "email" => "1a23@awd.awd", | ||
| 132 | + "role" => "User", | ||
| 133 | + "createdAt" => "2017-02-16 19:05:18", | ||
| 134 | + "updatedAt" => "2017-03-21 14:31:48" | ||
| 135 | + ] | ||
| 136 | + ]) | ||
| 137 | + ) | ||
| 64 | /** ----------------------------------------------------------------- **/ | 138 | /** ----------------------------------------------------------------- **/ |
| 65 | 139 | ||
| 66 | /** -------------------- [DELETE] users/{id} ------------------------ **/ | 140 | /** -------------------- [DELETE] users/{id} ------------------------ **/ |
| 67 | - ->endpoint(ApiEndpoint::remove() | 141 | + ->endpoint(ApiEndpoint::factory('/{id}', HttpMethods::DELETE, 'removeAction') |
| 68 | ->name('remove') | 142 | ->name('remove') |
| 69 | ->description('ะฃะดะฐะปะตะฝะธะต ะฟะพะปัะทะพะฒะฐัะตะปั') | 143 | ->description('ะฃะดะฐะปะตะฝะธะต ะฟะพะปัะทะพะฒะฐัะตะปั') |
| 70 | - ->allow(AclRoles::USER) | 144 | + ->allow( |
| 145 | + AclRoles::ADMINISTRATOR, | ||
| 146 | + AclRoles::USER, | ||
| 147 | + AclRoles::EDITOR, | ||
| 148 | + AclRoles::AUTHOR | ||
| 149 | + ) | ||
| 71 | ->exampleResponse([ | 150 | ->exampleResponse([ |
| 72 | "result" => "OK" | 151 | "result" => "OK" |
| 73 | ]) | 152 | ]) |
| @@ -79,7 +158,6 @@ class UserResource extends ApiResource { | @@ -79,7 +158,6 @@ class UserResource extends ApiResource { | ||
| 79 | ->name('authenticate') | 158 | ->name('authenticate') |
| 80 | ->description('ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ') | 159 | ->description('ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ') |
| 81 | ->allow(AclRoles::UNAUTHORIZED) | 160 | ->allow(AclRoles::UNAUTHORIZED) |
| 82 | - ->deny(AclRoles::AUTHORIZED) | ||
| 83 | ->exampleResponse([ | 161 | ->exampleResponse([ |
| 84 | 'data' => [ | 162 | 'data' => [ |
| 85 | 'token' => 'co126bbm40wqp41i3bo7pj1gfsvt9lp6', | 163 | 'token' => 'co126bbm40wqp41i3bo7pj1gfsvt9lp6', |
| @@ -99,12 +177,11 @@ class UserResource extends ApiResource { | @@ -99,12 +177,11 @@ class UserResource extends ApiResource { | ||
| 99 | ) | 177 | ) |
| 100 | /** ----------------------------------------------------------------- **/ | 178 | /** ----------------------------------------------------------------- **/ |
| 101 | 179 | ||
| 102 | - /** -------------------- [POST] users -------------------------------- **/ | 180 | + /** -------------------- [POST] users ------------------------------- **/ |
| 103 | ->endpoint(ApiEndpoint::factory('/', HttpMethods::POST, 'registerAction') | 181 | ->endpoint(ApiEndpoint::factory('/', HttpMethods::POST, 'registerAction') |
| 104 | ->name('register') | 182 | ->name('register') |
| 105 | ->description('ะ ะตะณะธัััะฐัะธั ะฝะพะฒะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั') | 183 | ->description('ะ ะตะณะธัััะฐัะธั ะฝะพะฒะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั') |
| 106 | ->allow(AclRoles::UNAUTHORIZED) | 184 | ->allow(AclRoles::UNAUTHORIZED) |
| 107 | - ->deny(AclRoles::AUTHORIZED) | ||
| 108 | ->exampleResponse([ | 185 | ->exampleResponse([ |
| 109 | "result" => "OK", | 186 | "result" => "OK", |
| 110 | "user" => [ | 187 | "user" => [ |
| @@ -118,6 +195,29 @@ class UserResource extends ApiResource { | @@ -118,6 +195,29 @@ class UserResource extends ApiResource { | ||
| 118 | ]) | 195 | ]) |
| 119 | ) | 196 | ) |
| 120 | /** ----------------------------------------------------------------- **/ | 197 | /** ----------------------------------------------------------------- **/ |
| 198 | + | ||
| 199 | + /** -------------------- [POST] users/invite ------------------------ **/ | ||
| 200 | + ->endpoint(ApiEndpoint::factory('/invite', HttpMethods::POST, 'inviteAction') | ||
| 201 | + ->name('invite') | ||
| 202 | + ->description('ะัะธะณะปะฐัะตะฝะธะต ัััะตััะฒัััะตะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั ะฒ ะฟัะพัะบั') | ||
| 203 | + ->allow( | ||
| 204 | + AclRoles::ADMINISTRATOR, | ||
| 205 | + AclRoles::USER, | ||
| 206 | + AclRoles::EDITOR | ||
| 207 | + ) | ||
| 208 | + ->exampleResponse([ | ||
| 209 | + "result" => "OK", | ||
| 210 | + "user" => [ | ||
| 211 | + "id" => "95", | ||
| 212 | + "username" => "MyLogin", | ||
| 213 | + "email" => "myGmail@gmail.com", | ||
| 214 | + "role" => "User", | ||
| 215 | + "createdAt" => "2017-02-16 17:57:52", | ||
| 216 | + "updatedAt" => "2017-02-16 17:57:52" | ||
| 217 | + ] | ||
| 218 | + ]) | ||
| 219 | + ) | ||
| 220 | + /** ----------------------------------------------------------------- **/ | ||
| 121 | ; | 221 | ; |
| 122 | } | 222 | } |
| 123 | } | 223 | } |
| 124 | \ No newline at end of file | 224 | \ No newline at end of file |
app/library/App/Transformers/AlbumTransformer.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Transformers; | ||
| 4 | - | ||
| 5 | -use App\Model\Album; | ||
| 6 | -use PhalconRest\Transformers\Transformer; | ||
| 7 | - | ||
| 8 | -class AlbumTransformer extends Transformer | ||
| 9 | -{ | ||
| 10 | - protected $availableIncludes = [ | ||
| 11 | - 'photos' | ||
| 12 | - ]; | ||
| 13 | - | ||
| 14 | - public function includePhotos($album) | ||
| 15 | - { | ||
| 16 | - return $this->collection($album->getPhotos(), new PhotoTransformer); | ||
| 17 | - } | ||
| 18 | - | ||
| 19 | - public function transform(Album $album) | ||
| 20 | - { | ||
| 21 | - return [ | ||
| 22 | - 'id' => $this->int($album->id), | ||
| 23 | - 'title' => $album->title, | ||
| 24 | - 'updated_at' => $album->updatedAt, | ||
| 25 | - 'created_at' => $album->createdAt | ||
| 26 | - ]; | ||
| 27 | - } | ||
| 28 | -} |
app/library/App/Transformers/PhotoTransformer.php deleted
| 1 | -<?php | ||
| 2 | - | ||
| 3 | -namespace App\Transformers; | ||
| 4 | - | ||
| 5 | -use App\Model\Photo; | ||
| 6 | -use PhalconRest\Transformers\ModelTransformer; | ||
| 7 | - | ||
| 8 | -class PhotoTransformer extends ModelTransformer | ||
| 9 | -{ | ||
| 10 | - /** | ||
| 11 | - * Transforms are automatically handled | ||
| 12 | - * based on your model when you extend ModelTransformer | ||
| 13 | - * and assign the modelClass property | ||
| 14 | - */ | ||
| 15 | - protected $modelClass = Photo::class; | ||
| 16 | - | ||
| 17 | - protected $availableIncludes = [ | ||
| 18 | - 'album' | ||
| 19 | - ]; | ||
| 20 | - | ||
| 21 | - public function includeAlbum($photo) | ||
| 22 | - { | ||
| 23 | - return $this->item($photo->getAlbum(), new AlbumTransformer()); | ||
| 24 | - } | ||
| 25 | - | ||
| 26 | - /** | ||
| 27 | - * You can always transform manually by using | ||
| 28 | - * the following code (below): | ||
| 29 | - * | ||
| 30 | - public function transform(Photo $photo) | ||
| 31 | - { | ||
| 32 | - return [ | ||
| 33 | - 'id' => $this->int($photo->id), | ||
| 34 | - 'title' => $photo->title, | ||
| 35 | - 'albumId' => $this->int($photo->albumId) | ||
| 36 | - ]; | ||
| 37 | - } | ||
| 38 | - */ | ||
| 39 | -} |