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 | -} |