diff options
Diffstat (limited to 'src/Wallabag/GroupBundle/Controller/ManageController.php')
-rw-r--r-- | src/Wallabag/GroupBundle/Controller/ManageController.php | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/Wallabag/GroupBundle/Controller/ManageController.php b/src/Wallabag/GroupBundle/Controller/ManageController.php index 31a0c7b1..7214d899 100644 --- a/src/Wallabag/GroupBundle/Controller/ManageController.php +++ b/src/Wallabag/GroupBundle/Controller/ManageController.php | |||
@@ -2,6 +2,7 @@ | |||
2 | 2 | ||
3 | namespace Wallabag\GroupBundle\Controller; | 3 | namespace Wallabag\GroupBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\ArrayAdapter; | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 6 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 7 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Pagerfanta\Pagerfanta; | 8 | use Pagerfanta\Pagerfanta; |
@@ -15,6 +16,7 @@ use Wallabag\GroupBundle\Entity\Group; | |||
15 | use Wallabag\GroupBundle\Entity\UserGroup; | 16 | use Wallabag\GroupBundle\Entity\UserGroup; |
16 | use Wallabag\GroupBundle\Form\GroupType; | 17 | use Wallabag\GroupBundle\Form\GroupType; |
17 | use Wallabag\GroupBundle\Form\NewGroupType; | 18 | use Wallabag\GroupBundle\Form\NewGroupType; |
19 | use Wallabag\GroupBundle\Form\UserGroupType; | ||
18 | use Wallabag\UserBundle\Entity\User; | 20 | use Wallabag\UserBundle\Entity\User; |
19 | 21 | ||
20 | /** | 22 | /** |
@@ -210,4 +212,186 @@ class ManageController extends Controller | |||
210 | } | 212 | } |
211 | throw $this->createAccessDeniedException(); | 213 | throw $this->createAccessDeniedException(); |
212 | } | 214 | } |
215 | |||
216 | /** | ||
217 | * @Route("/join/{group}", name="group_join") | ||
218 | * @param Group $group | ||
219 | * @return Response | ||
220 | */ | ||
221 | public function joinGroupAction(Group $group): Response | ||
222 | { | ||
223 | $em = $this->getDoctrine()->getManager(); | ||
224 | |||
225 | if ($group->getAcceptSystem() === Group::ACCESS_PASSWORD) { | ||
226 | return $this->redirectToRoute('group_password', ['group' => $group->getId()]); | ||
227 | } | ||
228 | $this->getUser()->addAGroup($group, $group->getDefaultRole()); | ||
229 | |||
230 | $em->flush(); | ||
231 | |||
232 | return $this->redirect($this->generateUrl('group_index'), 302); | ||
233 | } | ||
234 | |||
235 | /** | ||
236 | * @Route("/manage/{group}/{page}", name="group-manage", defaults={"page" = "1"}) | ||
237 | * @param Group $group | ||
238 | * @return Response | ||
239 | */ | ||
240 | public function manageGroupUsersAction(Group $group, int $page): Response | ||
241 | { | ||
242 | if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) { | ||
243 | $this->createAccessDeniedException(); | ||
244 | } | ||
245 | |||
246 | $members = $this->get('wallabag_user.user_repository')->findGroupMembers($group->getId()); | ||
247 | |||
248 | $pagerAdapter = new DoctrineORMAdapter($members->getQuery(), true, false); | ||
249 | $pagerFanta = new Pagerfanta($pagerAdapter); | ||
250 | $pagerFanta->setMaxPerPage(9); | ||
251 | |||
252 | try { | ||
253 | $pagerFanta->setCurrentPage($page); | ||
254 | } catch (OutOfRangeCurrentPageException $e) { | ||
255 | if ($page > 1) { | ||
256 | return $this->redirect($this->generateUrl('groups', ['page' => $pagerFanta->getNbPages()]), 302); | ||
257 | } | ||
258 | } | ||
259 | |||
260 | return $this->render('WallabagGroupBundle:Manage:manage.html.twig', [ | ||
261 | 'members' => $pagerFanta, | ||
262 | 'group' => $group, | ||
263 | 'currentPage' => $page, | ||
264 | ]); | ||
265 | } | ||
266 | |||
267 | /** | ||
268 | * @Route("/leave/{group}", name="group_leave") | ||
269 | * @param Group $group | ||
270 | * @return Response | ||
271 | */ | ||
272 | public function leaveGroupAction(Group $group): Response | ||
273 | { | ||
274 | $logger = $this->get('logger'); | ||
275 | $em = $this->getDoctrine()->getManager(); | ||
276 | $removeGroup = false; | ||
277 | |||
278 | if ($this->getUser()->getGroupRoleForUser($group) == Group::ROLE_ADMIN) { | ||
279 | $logger->info('User ' . $this->getUser()->getUsername() . ' is the admin for group ' . $group->getName()); | ||
280 | $newUser = $group->getUsers()->first(); | ||
281 | $newUser->setGroupRole($group, Group::ROLE_ADMIN); | ||
282 | $logger->info('The new admin for group ' . $group->getName() . ' is user ' . $newUser->getUsername()); | ||
283 | } | ||
284 | |||
285 | if ($group->getUsers()->count() <= 1) { | ||
286 | $logger->info('User ' . $this->getUser()->getUsername() . ' was the last one on the group ' . $group->getName() . ' so it will be deleted'); | ||
287 | $removeGroup = true; | ||
288 | } | ||
289 | |||
290 | $logger->info('Removing user ' . $this->getUser()->getUsername() . ' from group ' . $group->getName()); | ||
291 | $em->remove($this->getUser()->getUserGroupFromGroup($group)); | ||
292 | |||
293 | if ($removeGroup) { | ||
294 | $logger->info("Removing group " . $group->getName() . " as it doesn't contains users anymore"); | ||
295 | $em->remove($group); | ||
296 | } | ||
297 | |||
298 | $em->flush(); | ||
299 | return $this->redirect($this->generateUrl('groups'), 302); | ||
300 | } | ||
301 | |||
302 | /** | ||
303 | * @Route("/requests/{group}/{page}", name="group-requests", defaults={"page" = "1"}) | ||
304 | * @param Request $request | ||
305 | * @param int $page | ||
306 | * @return Response | ||
307 | */ | ||
308 | public function showRequestsAction(Group $group, int $page): Response | ||
309 | { | ||
310 | if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) { | ||
311 | $this->createAccessDeniedException(); | ||
312 | } | ||
313 | |||
314 | $requests = $group->getRequests(); | ||
315 | $pagerAdapter = new ArrayAdapter($requests->toArray()); | ||
316 | |||
317 | $pagerFanta = new Pagerfanta($pagerAdapter); | ||
318 | $pagerFanta->setMaxPerPage(9); | ||
319 | |||
320 | try { | ||
321 | $pagerFanta->setCurrentPage($page); | ||
322 | } catch (OutOfRangeCurrentPageException $e) { | ||
323 | if ($page > 1) { | ||
324 | return $this->redirect($this->generateUrl('groups', ['page' => $pagerFanta->getNbPages()]), 302); | ||
325 | } | ||
326 | } | ||
327 | |||
328 | return $this->render('WallabagGroupBundle:Manage:requests.html.twig', [ | ||
329 | 'requests' => $pagerFanta, | ||
330 | 'group' => $group, | ||
331 | 'currentPage' => $page, | ||
332 | ]); | ||
333 | } | ||
334 | |||
335 | /** | ||
336 | * @Route("/activate/{group}/{user}/{accept}", name="group-activate", requirements={"accept" = "\d+"}) | ||
337 | * @param Group $group | ||
338 | * @param User $user | ||
339 | * @param $accept | ||
340 | * @return Response | ||
341 | */ | ||
342 | public function postRequestAction(Group $group, User $user, $accept): Response | ||
343 | { | ||
344 | if (!$this->getUser() < Group::ROLE_MANAGE_USERS) { | ||
345 | $this->createAccessDeniedException("You don't have the rights to do this"); | ||
346 | } | ||
347 | |||
348 | $em = $this->getDoctrine()->getManager(); | ||
349 | |||
350 | $accept = $accept == 1; | ||
351 | $user->getUserGroupFromGroup($group)->setAccepted($accept); | ||
352 | if (!$accept) { | ||
353 | $em->remove($user->getUserGroupFromGroup($group)); | ||
354 | } | ||
355 | |||
356 | $em->flush(); | ||
357 | |||
358 | return $this->redirectToRoute('group_index'); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * @Route("/user-edit/{group}/{user}", name="group-user-edit") | ||
363 | * @param Request $request | ||
364 | * @param Group $group | ||
365 | * @param User $user | ||
366 | * @return Response | ||
367 | */ | ||
368 | public function editGroupUsersAction(Request $request, Group $group, User $user): Response | ||
369 | { | ||
370 | if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) { | ||
371 | $this->createAccessDeniedException(); | ||
372 | } | ||
373 | |||
374 | $groupUser = $user->getUserGroupFromGroup($group); | ||
375 | $editForm = $this->createForm(UserGroupType::class, $groupUser); | ||
376 | $editForm->handleRequest($request); | ||
377 | |||
378 | if ($editForm->isSubmitted() && $editForm->isValid()) { | ||
379 | $em = $this->getDoctrine()->getManager(); | ||
380 | $em->persist($groupUser); | ||
381 | $em->flush(); | ||
382 | |||
383 | $this->get('session')->getFlashBag()->add( | ||
384 | 'notice', | ||
385 | $this->get('translator')->trans('flashes.group.notice.user.edited', ['%user%' => $user->getUsername(), '%group%' => $group->getName()]) | ||
386 | ); | ||
387 | |||
388 | return $this->redirectToRoute('group-manage', ['group' => $group->getId()]); | ||
389 | } | ||
390 | |||
391 | return $this->render('WallabagGroupBundle:Manage:edit_user.html.twig', array( | ||
392 | 'user' => $user, | ||
393 | 'group' => $group, | ||
394 | 'edit_form' => $editForm->createView(), | ||
395 | )); | ||
396 | } | ||
213 | } | 397 | } |