/twake/backend/core/src/Twake/Workspaces/Services/WorkspaceLevels.php

https://github.com/TwakeApp/Twake · PHP · 415 lines · 294 code · 115 blank · 6 comment · 68 complexity · aa59f9cd28bdf992383d96aeba911e4c MD5 · raw file

  1. <?php
  2. namespace Twake\Workspaces\Services;
  3. use Twake\Workspaces\Entity\WorkspaceLevel;
  4. use Twake\Workspaces\Model\WorkspaceLevelsInterface;
  5. use App\App;
  6. class WorkspaceLevels
  7. {
  8. private $doctrine;
  9. private $pusher;
  10. public function __construct(App $app)
  11. {
  12. $this->doctrine = $app->getServices()->get("app.twake_doctrine");
  13. $this->pusher = $app->getServices()->get("app.pusher");
  14. }
  15. public function getLevel($workspaceId, $userId, $currentUserId = null)
  16. {
  17. if ($currentUserId == null
  18. || $currentUserId == $userId
  19. || $this->can($workspaceId, $currentUserId, "")
  20. ) {
  21. $userRepository = $this->doctrine->getRepository("Twake\Users:User");
  22. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  23. $workspaceUserRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceUser");
  24. $user = $userRepository->find($userId);
  25. $workspace = $workspaceRepository->find($workspaceId);
  26. $link = $workspaceUserRepository->findOneBy(Array("workspace_id" => $workspace->getId(), "user_id" => $user->getId()));
  27. if (!$link) {
  28. return null; //No level because no member
  29. }
  30. $level = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel")->findOneBy(Array("workspace" => $workspace->getId(), "id" => $link->getLevelId()));
  31. return $level;
  32. }
  33. return null; //Cant look this info
  34. }
  35. public function can($workspaceId, $userId, $action)
  36. {
  37. if (!$userId) {
  38. return false;
  39. }
  40. //Load rights for this users
  41. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  42. $workspaceUserRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceUser");
  43. $user = $this->convertToEntity($userId, "Twake\Users:User");
  44. $workspace = $workspaceRepository->find($workspaceId);
  45. if (!$user || !$workspace) {
  46. error_log("no user / ws ");
  47. return false;
  48. }
  49. if ($workspace->getUser() != null && $workspace->getUser()->getId() == $user->getId()) {
  50. return true;
  51. }
  52. $link = $workspaceUserRepository->findOneBy(Array("workspace_id" => $workspace->getId(), "user_id" => $user->getId()));
  53. if ($link) {
  54. $level = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel")->findOneBy(Array("workspace" => $workspace->getId(), "id" => $link->getLevelId()));
  55. if (!$link || !$level) {
  56. return false;
  57. }
  58. $workspace->setTotalActivity($workspace->getTotalActivity() + 1);
  59. $this->doctrine->persist($workspace);
  60. //No flush, if this is just a read we don't count the activity
  61. if ($level->getIsAdmin()) {
  62. return true; //Admin can do everything
  63. }
  64. if ($action == "" || $action == null) {
  65. return true;
  66. }
  67. $rights = $level->getRights();
  68. //Compare with action asked
  69. $actions = explode(":", $action);
  70. $object = $actions[0];
  71. $value = intval(str_replace(Array("none", "read", "write", "manage"), Array(0, 1, 2, 3), $actions[1]));
  72. if (!isset($rights[$object]) || intval(str_replace(Array("none", "read", "write", "manage"), Array(0, 1, 2, 3), $rights[$object])) < $value) {
  73. return false;
  74. }
  75. }
  76. return true;
  77. }
  78. private function convertToEntity($var, $repository)
  79. {
  80. if (is_string($var)) {
  81. $var = $var; // Cassandra id do nothing
  82. }
  83. if (is_int($var) || is_string($var) || get_class($var) == "Ramsey\Uuid\Uuid") {
  84. return $this->doctrine->getRepository($repository)->find($var);
  85. } else if (is_object($var)) {
  86. return $var;
  87. } else {
  88. return null;
  89. }
  90. }
  91. public function updateLevel($workspaceId, $levelId, $label, $rights, $currentUserId = null)
  92. {
  93. if ($currentUserId == null
  94. || $this->can($workspaceId, $currentUserId, "workspace:write")
  95. ) {
  96. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  97. $level = $levelRepository->findBy(Array("workspace" => $workspaceId, "level" => $levelId));
  98. if (!$level) {
  99. return false;
  100. }
  101. if ($level->getWorkspace()->getId() != $workspaceId) {
  102. return false;
  103. }
  104. $level->setRights($rights);
  105. $level->setLabel($label);
  106. $this->doctrine->persist($level);
  107. $this->doctrine->flush();
  108. $datatopush = Array(
  109. "type" => "CHANGE_LEVEL",
  110. "data" => Array(
  111. "workspaceId" => $workspaceId,
  112. )
  113. );
  114. $this->pusher->push($datatopush, "group/" . $workspaceId);
  115. return true;
  116. }
  117. return false;
  118. }
  119. public function getDefaultLevel($workspaceId)
  120. {
  121. $choosen = null;
  122. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  123. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  124. $workspace = $workspaceRepository->find($workspaceId);
  125. $levels = $levelRepository->findBy(Array("workspace" => $workspace));
  126. foreach ($levels as $level) {
  127. if ($level->getIsDefault()) {
  128. $choosen = $level;
  129. }
  130. }
  131. //No default level !
  132. if (!$choosen) {
  133. $levelD = new WorkspaceLevel();
  134. $levelD->setWorkspace($workspace);
  135. $levelD->setLabel("Default");
  136. $levelD->setIsAdmin(false);
  137. $levelD->setIsDefault(true);
  138. $this->doctrine->persist($levelD);
  139. $this->doctrine->flush();
  140. $choosen = $levelD;
  141. }
  142. return $choosen;
  143. }
  144. public function setDefaultLevel($workspaceId, $levelId, $currentUserId = null)
  145. {
  146. if ($currentUserId == null
  147. || $this->can($workspaceId, $currentUserId, "workspace:write")
  148. ) {
  149. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  150. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  151. $workspace = $workspaceRepository->find($workspaceId);
  152. $oldLevelDefault = $levelRepository->findOneBy(Array("workspace" => $workspace, "isdefault" => true));
  153. if ($oldLevelDefault) {
  154. $oldLevelDefault->setisDefault(false);
  155. $this->doctrine->persist($oldLevelDefault);
  156. }
  157. $levelDefault = $levelRepository->find($levelId);
  158. if (!$levelDefault) {
  159. return false;
  160. }
  161. if ($levelDefault->getWorkspace()->getId() != $workspaceId) {
  162. return false;
  163. }
  164. $levelDefault->setisDefault(true);
  165. $this->doctrine->persist($levelDefault);
  166. $this->doctrine->flush();
  167. return true;
  168. }
  169. return false;
  170. }
  171. public function addLevel($workspaceId, $label, $rights, $currentUserId = null)
  172. {
  173. if ($currentUserId == null
  174. || $this->can($workspaceId, $currentUserId, "workspace:write")
  175. ) {
  176. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  177. $workspace = $workspaceRepository->find($workspaceId);
  178. $level = new WorkspaceLevel();
  179. $level->setWorkspace($workspace);
  180. $level->setRights($rights);
  181. $level->setLabel($label);
  182. $this->doctrine->persist($level);
  183. $this->doctrine->flush();
  184. return true;
  185. }
  186. return false;
  187. }
  188. public function removeLevel($workspaceId, $levelId, $currentUserId = null)
  189. {
  190. if ($currentUserId == null
  191. || $this->can($workspaceId, $currentUserId, "workspace:write")
  192. ) {
  193. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  194. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  195. $workspaceUserRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceUser");
  196. $level = $levelRepository->findBy(Array("workspace" => $workspaceId, "level" => $levelId));
  197. if ($level->getWorkspace()->getId() != $workspaceId) {
  198. return false;
  199. }
  200. if ($level->getIsDefault()) {
  201. return false; //Can't remove default level
  202. }
  203. if ($level->getIsAdmin()) {
  204. return false; //Can't remove admin level
  205. }
  206. $workspace = $workspaceRepository->find($workspaceId);
  207. $levelDefault = $levelRepository->findOneBy(Array("workspace" => $workspace, "isdefault" => true));
  208. if (!$levelDefault) {
  209. return false;
  210. }
  211. $affectedUsers = $workspaceUserRepository->findBy(Array("workspace_id" => $workspace->getId(), "level" => $level));
  212. foreach ($affectedUsers as $affectedUser) {
  213. $affectedUser->setLevel($levelDefault);
  214. $this->doctrine->persist($affectedUser);
  215. }
  216. $this->doctrine->remove($level);
  217. $this->doctrine->flush();
  218. $datatopush = Array(
  219. "type" => "CHANGE_LEVEL",
  220. "data" => Array(
  221. "workspaceId" => $workspace->getId(),
  222. )
  223. );
  224. $this->pusher->push($datatopush, "group/" . $workspace->getId());
  225. return true;
  226. }
  227. return false;
  228. }
  229. public function getUsers($workspaceId, $levelId, $currentUserId = null)
  230. {
  231. if ($currentUserId == null
  232. || $this->can($workspaceId, $currentUserId, "workspace:read")
  233. ) {
  234. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  235. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  236. $workspaceUserRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceUser");
  237. $level = $levelRepository->findBy(Array("workspace" => $workspaceId, "level" => $levelId));
  238. $workspace = $workspaceRepository->find($workspaceId);
  239. if (!$level || !$workspace) {
  240. return false;
  241. }
  242. $link = $workspaceUserRepository->findBy(Array("level" => $level, "workspace" => $workspace));
  243. $users = Array();
  244. foreach ($link as $user) {
  245. $users[] = $user->getUser($this->doctrine);
  246. }
  247. return $users;
  248. }
  249. return false;
  250. }
  251. public function getLevels($workspaceId, $currentUserId = null)
  252. {
  253. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  254. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  255. $workspace = $workspaceRepository->find($workspaceId);
  256. if (!$workspace) {
  257. return false;
  258. }
  259. $levels = $levelRepository->findBy(Array("workspace" => $workspace));
  260. return $levels;
  261. }
  262. public function getByLabel($workspaceId, $label, $currentUserId = null)
  263. {
  264. if ($currentUserId == null
  265. || $this->can($workspaceId, $currentUserId, "workspace:read")
  266. ) {
  267. $levelRepository = $this->doctrine->getRepository("Twake\Workspaces:WorkspaceLevel");
  268. $workspaceRepository = $this->doctrine->getRepository("Twake\Workspaces:Workspace");
  269. $workspace = $workspaceRepository->find($workspaceId);
  270. if (!$workspace) {
  271. return false;
  272. }
  273. $levels = $levelRepository->findBy(["label" => $label, "workspace" => $workspace]);
  274. return $levels;
  275. }
  276. return false;
  277. }
  278. // @Depreciated
  279. public function hasRight($userId, $workspaceId, $rightAsked)
  280. {
  281. $userId = $this->convertToEntity($userId, "Twake\Users:User");
  282. $userId = $userId->getId();
  283. $workspaceId = $this->convertToEntity($workspaceId, "Twake\Workspaces:Workspace");
  284. $workspaceId = $workspaceId->getId();
  285. return $this->can($workspaceId, $userId, $rightAsked);
  286. }
  287. // @Depreciated
  288. public function errorsAccess($userId, $workspaceId, $right)
  289. {
  290. $userId = $this->convertToEntity($userId, "Twake\Users:User");
  291. $userId = $userId->getId();
  292. $workspaceId = $this->convertToEntity($workspaceId, "Twake\Workspaces:Workspace");
  293. $workspaceId = $workspaceId->getId();
  294. if ($this->can($workspaceId, $userId, $right)) {
  295. return [];
  296. }
  297. return ["notallowed"];
  298. }
  299. }
  300. ?>