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 | 5 | use App\BootstrapInterface; |
| 6 | 6 | use App\Constants\Services; |
| 7 | 7 | use Phalcon\Acl; |
| 8 | +use Phalcon\Acl\Resource; | |
| 9 | +use Phalcon\Acl\Role; | |
| 8 | 10 | use Phalcon\Config; |
| 9 | 11 | use Phalcon\DiInterface; |
| 10 | 12 | use PhalconRest\Api; |
| ... | ... | @@ -17,17 +19,22 @@ class AclBootstrap implements BootstrapInterface |
| 17 | 19 | /** @var \PhalconApi\Acl\MountingEnabledAdapterInterface $acl */ |
| 18 | 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 | 25 | $acl->addRole($unauthorizedRole); |
| 24 | 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 | 39 | $acl->mountMany($api->getCollections()); |
| 33 | 40 | } | ... | ... |
app/library/App/Constants/AclRoles.php
| ... | ... | @@ -9,9 +9,55 @@ class AclRoles |
| 9 | 9 | const AUTHOR = 'Author'; |
| 10 | 10 | const EDITOR = 'Editor'; |
| 11 | 11 | const USER = 'User'; |
| 12 | - const MANAGER = 'Manager'; | |
| 13 | 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 | 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 | 142 | \ No newline at end of file | ... | ... |
app/library/App/Controllers/UserController.php
| ... | ... | @@ -2,6 +2,14 @@ |
| 2 | 2 | |
| 3 | 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 | 13 | use PhalconRest\Mvc\Controllers\CrudResourceController; |
| 6 | 14 | |
| 7 | 15 | 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 | 77 | * @return mixed |
| ... | ... | @@ -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 | 125 | * ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ |
| 36 | 126 | * |
| 37 | 127 | * @return mixed |
| ... | ... | @@ -41,13 +131,13 @@ class UserController extends CrudResourceController |
| 41 | 131 | $username = $this->request->getUsername(); |
| 42 | 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 | 135 | $password); |
| 46 | 136 | |
| 47 | - $transformer = new \App\Transformers\UserTransformer; | |
| 137 | + $transformer = new UserTransformer; | |
| 48 | 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 | 142 | $response = [ |
| 53 | 143 | 'token' => $session->getToken(), |
| ... | ... | @@ -63,7 +153,8 @@ class UserController extends CrudResourceController |
| 63 | 153 | * |
| 64 | 154 | * @return mixed |
| 65 | 155 | */ |
| 66 | - public function registerAction() { | |
| 156 | + public function registerAction() | |
| 157 | + { | |
| 67 | 158 | |
| 68 | 159 | $this->beforeHandle(); |
| 69 | 160 | $this->beforeHandleWrite(); |
| ... | ... | @@ -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 | 245 | * @param $data |
| 112 | 246 | * @return array |
| 247 | + * @throws Exception | |
| 113 | 248 | */ |
| 114 | 249 | protected function transformPostData($data) |
| 115 | 250 | { |
| 116 | 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 | 266 | $result[$key] = $this->transformPostDataValue($key, $value, $data); |
| 120 | 267 | } |
| 121 | 268 | |
| ... | ... | @@ -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 | 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 | 2 | |
| 3 | 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 | 11 | public $id; |
| 8 | 12 | public $name; |
| ... | ... | @@ -31,5 +35,94 @@ class Project extends \App\Mvc\DateTrackingModel |
| 31 | 35 | $this->belongsTo('user_id', User::class, 'id', [ |
| 32 | 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 | 34 | |
| 35 | 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 | 66 | $same_user = User::find(["username = '".$username."'"]); |
| 51 | 67 | if (isset($same_user[0]) && !empty($same_user[0]->username)) |
| 52 | 68 | { |
| ... | ... | @@ -56,45 +72,38 @@ class User extends DateTrackingModel |
| 56 | 72 | elseif (empty($username)) |
| 57 | 73 | { |
| 58 | 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 | 77 | elseif (strlen($username) < 4) |
| 62 | 78 | { |
| 63 | 79 | $msg = 'Post-data is invalid, value of `username` should be more than 4 letters'; |
| 64 | 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 | 92 | if (!filter_var($email, FILTER_VALIDATE_EMAIL)) |
| 80 | 93 | { |
| 81 | 94 | $msg = 'Post-data is invalid, bad email value'; |
| 82 | 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 | 107 | if (!in_array($role, AclRoles::ALL_REAL_ROLES)) |
| 99 | 108 | { |
| 100 | 109 | $msg = 'Post-data is invalid, bad `role` value'; |
| ... | ... | @@ -104,9 +113,27 @@ class User extends DateTrackingModel |
| 104 | 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 | 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 | 8 | |
| 9 | 9 | namespace App\Resources; |
| 10 | 10 | |
| 11 | +use App\Controllers\ProjectController; | |
| 12 | +use PhalconApi\Constants\HttpMethods; | |
| 11 | 13 | use PhalconRest\Api\ApiEndpoint; |
| 12 | 14 | use PhalconRest\Api\ApiResource; |
| 13 | 15 | use App\Model\Project; |
| 14 | 16 | use PhalconRest\Transformers\ModelTransformer; |
| 15 | 17 | use App\Constants\AclRoles; |
| 16 | -use PhalconRest\Mvc\Controllers\CrudResourceController; | |
| 17 | 18 | |
| 18 | 19 | class ProjectResource extends ApiResource { |
| 19 | 20 | |
| ... | ... | @@ -26,14 +27,60 @@ class ProjectResource extends ApiResource { |
| 26 | 27 | ->transformer(ModelTransformer::class) |
| 27 | 28 | ->itemKey('project') |
| 28 | 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 | 87 | \ No newline at end of file | ... | ... |
app/library/App/Resources/UserResource.php
| ... | ... | @@ -21,53 +21,132 @@ class UserResource extends ApiResource { |
| 21 | 21 | ->transformer(UserTransformer::class) |
| 22 | 22 | ->itemKey('user') |
| 23 | 23 | ->collectionKey('users') |
| 24 | - ->deny(AclRoles::UNAUTHORIZED, AclRoles::USER) | |
| 25 | 24 | ->handler(UserController::class) |
| 25 | + ->deny(AclRoles::ALL_ROLES) | |
| 26 | 26 | |
| 27 | 27 | /** -------------------- [GET] users -------------------------------- **/ |
| 28 | 28 | ->endpoint(ApiEndpoint::all() |
| 29 | - ->allow(AclRoles::USER) | |
| 30 | 29 | ->name('all') |
| 31 | 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 | 100 | /** -------------------- [GET] users/me ----------------------------- **/ |
| 36 | 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 | 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 | 140 | /** -------------------- [DELETE] users/{id} ------------------------ **/ |
| 67 | - ->endpoint(ApiEndpoint::remove() | |
| 141 | + ->endpoint(ApiEndpoint::factory('/{id}', HttpMethods::DELETE, 'removeAction') | |
| 68 | 142 | ->name('remove') |
| 69 | 143 | ->description('ะฃะดะฐะปะตะฝะธะต ะฟะพะปัะทะพะฒะฐัะตะปั') |
| 70 | - ->allow(AclRoles::USER) | |
| 144 | + ->allow( | |
| 145 | + AclRoles::ADMINISTRATOR, | |
| 146 | + AclRoles::USER, | |
| 147 | + AclRoles::EDITOR, | |
| 148 | + AclRoles::AUTHOR | |
| 149 | + ) | |
| 71 | 150 | ->exampleResponse([ |
| 72 | 151 | "result" => "OK" |
| 73 | 152 | ]) |
| ... | ... | @@ -79,7 +158,6 @@ class UserResource extends ApiResource { |
| 79 | 158 | ->name('authenticate') |
| 80 | 159 | ->description('ะะฒัะพัะธะทะฐัะธั ะฟะพะปัะทะพะฒะฐัะตะปั ัะตัะตะท BasicAuth ะธ ะฒะพะทะฒัะฐัะฐะตั ัะพะบะตะฝ ะดะพัััะฟะฐ') |
| 81 | 160 | ->allow(AclRoles::UNAUTHORIZED) |
| 82 | - ->deny(AclRoles::AUTHORIZED) | |
| 83 | 161 | ->exampleResponse([ |
| 84 | 162 | 'data' => [ |
| 85 | 163 | 'token' => 'co126bbm40wqp41i3bo7pj1gfsvt9lp6', |
| ... | ... | @@ -99,12 +177,11 @@ class UserResource extends ApiResource { |
| 99 | 177 | ) |
| 100 | 178 | /** ----------------------------------------------------------------- **/ |
| 101 | 179 | |
| 102 | - /** -------------------- [POST] users -------------------------------- **/ | |
| 180 | + /** -------------------- [POST] users ------------------------------- **/ | |
| 103 | 181 | ->endpoint(ApiEndpoint::factory('/', HttpMethods::POST, 'registerAction') |
| 104 | 182 | ->name('register') |
| 105 | 183 | ->description('ะ ะตะณะธัััะฐัะธั ะฝะพะฒะพะณะพ ะฟะพะปัะทะพะฒะฐัะตะปั') |
| 106 | 184 | ->allow(AclRoles::UNAUTHORIZED) |
| 107 | - ->deny(AclRoles::AUTHORIZED) | |
| 108 | 185 | ->exampleResponse([ |
| 109 | 186 | "result" => "OK", |
| 110 | 187 | "user" => [ |
| ... | ... | @@ -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 | 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 | -} |