src/AppBundle/Controller/GroupController.php line 169

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Controller;
  3. use AppBundle\Common\ArrayToolkit;
  4. use AppBundle\Common\Paginator;
  5. use Biz\Common\CommonException;
  6. use Biz\Content\Service\FileService;
  7. use Biz\Group\GroupException;
  8. use Biz\Group\Service\GroupService;
  9. use Biz\Group\Service\ThreadService;
  10. use Biz\System\Service\SettingService;
  11. use Biz\User\Service\NotificationService;
  12. use Biz\User\Service\UserService;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. class GroupController extends BaseController
  16. {
  17.     public function indexAction()
  18.     {
  19.         $activeGroup $this->getGroupService()->searchGroups(['status' => 'open'], ['recommended' => 'DESC''recommendedSeq' => 'ASC''recommendedTime' => 'DESC''memberNum' => 'DESC'], 012);
  20.         $recentlyThread $this->getThreadService()->searchThreads(
  21.             [
  22.                 'createdTime' => time() - 30 24 60 60,
  23.                 'status' => 'open',
  24.                 'excludeAuditStatus' => 'illegal',
  25.             ],
  26.             $this->filterSort('byStick'), 025
  27.         );
  28.         $ownerIds ArrayToolkit::column($recentlyThread'userId');
  29.         $groupIds ArrayToolkit::column($recentlyThread'groupId');
  30.         $userIds ArrayToolkit::column($recentlyThread'lastPostMemberId');
  31.         $lastPostMembers $this->getUserService()->findUsersByIds($userIds);
  32.         $owners $this->getUserService()->findUsersByIds($ownerIds);
  33.         $groups $this->getGroupService()->getGroupsByids($groupIds);
  34.         list($user$myJoinGroup$newGroups) = $this->_getGroupList();
  35.         return $this->render('group/index.html.twig', [
  36.             'activeGroup' => $activeGroup,
  37.             'myJoinGroup' => $myJoinGroup,
  38.             'lastPostMembers' => $lastPostMembers,
  39.             'owners' => $owners,
  40.             'newGroups' => $newGroups,
  41.             'groupinfo' => $groups,
  42.             'user' => $user,
  43.             'recentlyThread' => $recentlyThread,
  44.         ]);
  45.     }
  46.     public function addGroupAction(Request $request)
  47.     {
  48.         if (true !== $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
  49.             return $this->createMessageResponse('info''目前只允许管理员创建小组!');
  50.         }
  51.         $user $this->getCurrentUser();
  52.         if ('POST' == $request->getMethod()) {
  53.             $mygroup $request->request->all();
  54.             $group = [
  55.                 'title' => $mygroup['group']['grouptitle'],
  56.                 'about' => $mygroup['group']['about'],
  57.             ];
  58.             $group $this->getGroupService()->addGroup($user$group);
  59.             return $this->redirect($this->generateUrl('group_logo_set', ['id' => $group['id']]));
  60.         }
  61.         return $this->render('group/groupadd.html.twig');
  62.     }
  63.     public function searchAction(Request $request)
  64.     {
  65.         $keyWord $request->query->get('keyWord') ?: '';
  66.         $paginator = new Paginator(
  67.             $this->get('request'),
  68.             $this->getGroupService()->searchGroupsCount(['title' => $keyWord'status' => 'open']),
  69.             24
  70.         );
  71.         $groups $this->getGroupService()->searchGroups(
  72.             ['title' => $keyWord'status' => 'open'],
  73.             ['recommended' => 'DESC''recommendedSeq' => 'ASC''recommendedTime' => 'DESC''createdTime' => 'DESC'], $paginator->getOffsetCount(),
  74.             $paginator->getPerPageCount()
  75.         );
  76.         list($user$myJoinGroup$newGroups) = $this->_getGroupList();
  77.         return $this->render('group/search.html.twig', [
  78.             'paginator' => $paginator,
  79.             'groups' => $groups,
  80.             'user' => $user,
  81.             'myJoinGroup' => $myJoinGroup,
  82.             'newGroups' => $newGroups,
  83.             'keyWord' => $keyWord,
  84.         ]);
  85.     }
  86.     public function groupIndexAction(Request $request$id)
  87.     {
  88.         $group $this->getGroupService()->getGroup($id);
  89.         if (empty($group)) {
  90.             $this->createNewException(GroupException::NOTFOUND_GROUP());
  91.         }
  92.         if ('close' == $group['status']) {
  93.             return $this->createMessageResponse('info''该小组已被关闭');
  94.         }
  95.         list($user$groupOwner$recentlyJoinMember$recentlyMembers$userIsGroupMember) = $this->_getMemberList($group);
  96.         $filters $this->getThreadSearchFilters($request);
  97.         $conditions $this->convertFiltersToConditions($id$filters);
  98.         $conditions['excludeAuditStatus'] = 'illegal';
  99.         $threadSetting $this->getSettingService()->get('ugc_thread', []);
  100.         if (empty($threadSetting['enable_thread']) || empty(($threadSetting['enable_group_thread']))) {
  101.             return $this->redirect($this->generateUrl('group_member', ['id' => $group['id']]));
  102.         }
  103.         $paginator = new Paginator(
  104.             $request,
  105.             $this->getThreadService()->countThreads($conditions),
  106.             $conditions['num']
  107.         );
  108.         $threads $this->getThreadService()->searchThreads(
  109.             $conditions,
  110.             $this->filterSort($filters['sort']),
  111.             $paginator->getOffsetCount(),
  112.             $paginator->getPerPageCount()
  113.         );
  114.         $ownerIds ArrayToolkit::column($threads'userId');
  115.         $userIds ArrayToolkit::column($threads'lastPostMemberId');
  116.         $owners $this->getUserService()->findUsersByIds($ownerIds);
  117.         $lastPostMembers $this->getUserService()->findUsersByIds($userIds);
  118.         $groupAbout strip_tags($group['about'], '');
  119.         $groupAbout preg_replace('/ /'''$groupAbout);
  120.         return $this->render('group/groupindex.html.twig', [
  121.             'groupinfo' => $group,
  122.             'is_groupmember' => $this->getGroupMemberRole($id),
  123.             'recentlyJoinMember' => $recentlyJoinMember,
  124.             'owner' => $owners,
  125.             'user' => $user,
  126.             'groupOwner' => $groupOwner,
  127.             'id' => $id,
  128.             'threads' => $threads,
  129.             'paginator' => $paginator,
  130.             'condition' => $filters,
  131.             'lastPostMembers' => $lastPostMembers,
  132.             'userIsGroupMember' => $userIsGroupMember,
  133.             'members' => $recentlyMembers,
  134.             'groupAbout' => $groupAbout,
  135.         ]);
  136.     }
  137.     public function groupMemberAction(Request $request$id)
  138.     {
  139.         $group $this->getGroupService()->getGroup($id);
  140.         if (empty($group)) {
  141.             $this->createNewException(GroupException::NOTFOUND_GROUP());
  142.         }
  143.         if ('close' == $group['status']) {
  144.             return $this->createMessageResponse('info''该小组已被关闭');
  145.         }
  146.         list($user$groupOwner$recentlyJoinMember$recentlyMembers$userIsGroupMember) = $this->_getMemberList($group);
  147.         $paginator = new Paginator(
  148.             $this->get('request'),
  149.             $this->getGroupService()->countMembers(['groupId' => $id'role' => 'member']),
  150.             30
  151.         );
  152.         $members $this->getGroupService()->searchMembers(['groupId' => $id'role' => 'member'],
  153.             ['createdTime' => 'DESC'],
  154.             $paginator->getOffsetCount(),
  155.             $paginator->getPerPageCount());
  156.         $memberIds ArrayToolkit::column($members'userId');
  157.         $users $this->getUserService()->findUsersByIds($memberIds);
  158.         $owner $this->getUserService()->getUser($group['ownerId']);
  159.         $groupAdmin $this->getGroupService()->searchMembers(['groupId' => $id'role' => 'admin'],
  160.             ['createdTime' => 'DESC'],
  161.             0,
  162.             1000);
  163.         $groupAdminIds ArrayToolkit::column($groupAdmin'userId');
  164.         $usersLikeAdmin $this->getUserService()->findUsersByIds($groupAdminIds);
  165.         return $this->render('group/groupmember.html.twig', [
  166.             'groupinfo' => $group,
  167.             'is_groupmember' => $this->getGroupMemberRole($id),
  168.             'groupmember_info' => $members,
  169.             'owner_info' => $owner,
  170.             'paginator' => $paginator,
  171.             'members' => $users,
  172.             'usersLikeAdmin' => $usersLikeAdmin,
  173.             'groupAdmin' => $groupAdmin,
  174.             'user' => $user,
  175.             'userIsGroupMember' => $userIsGroupMember,
  176.             'groupOwner' => $groupOwner,
  177.             'recentlyJoinMember' => $recentlyJoinMember,
  178.             'recentlyMembers' => $recentlyMembers,
  179.         ]);
  180.     }
  181.     protected function checkManagePermission($id)
  182.     {
  183.         $user $this->getCurrentUser();
  184.         if (true == $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
  185.             return true;
  186.         }
  187.         if ($this->getGroupService()->isOwner($id$user['id'])) {
  188.             return true;
  189.         }
  190.         if ($this->getGroupService()->isAdmin($id$user['id'])) {
  191.             return true;
  192.         }
  193.         return false;
  194.     }
  195.     protected function checkOwnerPermission($id)
  196.     {
  197.         $user $this->getCurrentUser();
  198.         if (true == $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
  199.             return true;
  200.         }
  201.         if ($this->getGroupService()->isOwner($id$user['id'])) {
  202.             return true;
  203.         }
  204.         return false;
  205.     }
  206.     public function deleteMembersAction(Request $request$id)
  207.     {
  208.         if (!$this->checkManagePermission($id)) {
  209.             return $this->createMessageResponse('info''您没有权限!');
  210.         }
  211.         $deleteMemberIds $request->request->all();
  212.         $group $this->getGroupService()->getGroup($id);
  213.         if (isset($deleteMemberIds['memberId'])) {
  214.             $deleteMemberIds $deleteMemberIds['memberId'];
  215.             foreach ($deleteMemberIds as $memberId) {
  216.                 $this->getGroupService()->deleteMemberByGroupIdAndUserId($id$memberId);
  217.                 $message = [
  218.                     'id' => $id,
  219.                     'title' => $group['title'],
  220.                     'type' => 'remove', ];
  221.                 $this->getNotifiactionService()->notify($memberId'group-profile'$message);
  222.             }
  223.         }
  224.         return new Response('success');
  225.     }
  226.     public function setAdminAction(Request $request$id)
  227.     {
  228.         if (!$this->checkOwnerPermission($id)) {
  229.             return $this->createMessageResponse('info''您没有权限!');
  230.         }
  231.         $memberIds $request->request->all();
  232.         $group $this->getGroupService()->getGroup($id);
  233.         if (isset($memberIds['memberId'])) {
  234.             $memberIds $memberIds['memberId'];
  235.             foreach ($memberIds as $memberId) {
  236.                 $member $this->getGroupService()->getMemberByGroupIdAndUserId($id$memberId);
  237.                 $this->getGroupService()->updateMember($member['id'], ['role' => 'admin']);
  238.                 $message = [
  239.                     'id' => $id,
  240.                     'title' => $group['title'],
  241.                     'type' => 'setAdmin', ];
  242.                 $this->getNotifiactionService()->notify($memberId'group-profile'$message);
  243.             }
  244.         }
  245.         return new Response('success');
  246.     }
  247.     public function removeAdminAction(Request $request$id)
  248.     {
  249.         if (!$this->checkOwnerPermission($id)) {
  250.             return $this->createMessageResponse('info''您没有权限!');
  251.         }
  252.         $memberIds $request->request->all();
  253.         $group $this->getGroupService()->getGroup($id);
  254.         if (isset($memberIds['adminId'])) {
  255.             $memberIds $memberIds['adminId'];
  256.             $message = [
  257.                 'id' => $id,
  258.                 'title' => $group['title'],
  259.                 'type' => 'removeAdmin', ];
  260.             foreach ($memberIds as $memberId) {
  261.                 $member $this->getGroupService()->getMemberByGroupIdAndUserId($id$memberId);
  262.                 $this->getGroupService()->updateMember($member['id'], ['role' => 'member']);
  263.                 $this->getNotifiactionService()->notify($memberId'group-profile'$message);
  264.             }
  265.         }
  266.         return new Response('success');
  267.     }
  268.     public function groupSetAction(Request $request$id)
  269.     {
  270.         $group $this->getGroupService()->getGroup($id);
  271.         if (!$this->checkManagePermission($id)) {
  272.             return $this->createMessageResponse('info''您没有权限!');
  273.         }
  274.         return $this->render('group/setting-info.html.twig', [
  275.             'groupinfo' => $group,
  276.             'is_groupmember' => $this->getGroupMemberRole($id),
  277.             'id' => $id,
  278.             'logo' => $group['logo'],
  279.             'backgroundLogo' => $group['backgroundLogo'], ]
  280.         );
  281.     }
  282.     public function logoCropAction(Request $request$id)
  283.     {
  284.         $group $this->getGroupService()->getGroup($id);
  285.         if (!$this->checkManagePermission($id)) {
  286.             return $this->createMessageResponse('info''您没有权限!');
  287.         }
  288.         if ('POST' == $request->getMethod()) {
  289.             $options $request->request->all();
  290.             if ('backGroundLogoCrop' == $request->query->get('page')) {
  291.                 $this->getGroupService()->changeGroupImg($id'backgroundLogo'$options['images']);
  292.             } else {
  293.                 $this->getGroupService()->changeGroupImg($id'logo'$options['images']);
  294.             }
  295.             return $this->redirect($this->generateUrl('group_show', [
  296.                 'id' => $id,
  297.             ]));
  298.         }
  299.         $fileId $request->getSession()->get('fileId');
  300.         list($pictureUrl$naturalSize$scaledSize) = $this->getFileService()->getImgFileMetaInfo($fileId1140150);
  301.         return $this->render('group/setting-logo-crop.html.twig', [
  302.             'groupinfo' => $group,
  303.             'is_groupmember' => $this->getGroupMemberRole($id),
  304.             'pictureUrl' => $pictureUrl,
  305.             'naturalSize' => $naturalSize,
  306.             'scaledSize' => $scaledSize,
  307.         ]);
  308.     }
  309.     public function setGroupLogoAction(Request $request$id)
  310.     {
  311.         $group $this->getGroupService()->getGroup($id);
  312.         if (!$this->checkManagePermission($id)) {
  313.             return $this->createMessageResponse('info''您没有权限!');
  314.         }
  315.         return $this->render('group/setting-logo.html.twig', [
  316.             'groupinfo' => $group,
  317.             'is_groupmember' => $this->getGroupMemberRole($id),
  318.             'id' => $id,
  319.             'logo' => $group['logo'],
  320.             'backgroundLogo' => $group['backgroundLogo'], ]
  321.         );
  322.     }
  323.     public function setGroupBackgroundLogoAction(Request $request$id)
  324.     {
  325.         $group $this->getGroupService()->getGroup($id);
  326.         if (!$this->checkManagePermission($id)) {
  327.             return $this->createMessageResponse('info''您没有权限!');
  328.         }
  329.         return $this->render('group/setting-background.html.twig', [
  330.             'groupinfo' => $group,
  331.             'is_groupmember' => $this->getGroupMemberRole($id),
  332.             'id' => $id,
  333.             'logo' => $group['backgroundLogo'], ]
  334.         );
  335.     }
  336.     public function hotGroupAction($count 15$colNum 4)
  337.     {
  338.         $hotGroups $this->getGroupService()->searchGroups(['status' => 'open'], ['memberNum' => 'DESC'], 0$count);
  339.         return $this->render('group/groups-ul.html.twig', [
  340.             'groups' => $hotGroups,
  341.             'colNum' => $colNum,
  342.         ]
  343.         );
  344.     }
  345.     public function hotThreadAction($textNum 15)
  346.     {
  347.         $groupSetting $this->getSettingService()->get('group', []);
  348.         $time 24 60 60;
  349.         if (isset($groupSetting['threadTime_range'])) {
  350.             $time $groupSetting['threadTime_range'] * 24 60 60;
  351.         }
  352.         $hotThreads $this->getThreadService()->searchThreads(
  353.             [
  354.                 'createdTime' => time() - $time,
  355.                 'status' => 'open',
  356.             ],
  357.             $this->filterSort('byPostNum'), 011
  358.         );
  359.         return $this->render('group/hot-thread.html.twig', [
  360.             'hotThreads' => $hotThreads,
  361.             'textNum' => $textNum,
  362.         ]
  363.         );
  364.     }
  365.     protected function getGroupMemberRole($userId)
  366.     {
  367.         $user $this->getCurrentUser();
  368.         if (!$user['id']) {
  369.             return 0;
  370.         }
  371.         if ($this->getGroupService()->isOwner($userId$user['id'])) {
  372.             return 2;
  373.         }
  374.         if ($this->getGroupService()->isAdmin($userId$user['id'])) {
  375.             return 3;
  376.         }
  377.         if ($this->getGroupService()->isMember($userId$user['id'])) {
  378.             return 1;
  379.         }
  380.         return 0;
  381.     }
  382.     public function groupJoinAction($id)
  383.     {
  384.         $user $this->getCurrentUser();
  385.         if (!$user->isLogin()) {
  386.             return $this->createJsonResponse([
  387.                 'status' => 'error',
  388.                 'message' => 'json_response.not_login.message',
  389.             ]);
  390.         }
  391.         $isMember $this->getGroupService()->isMember($id$user['id']);
  392.         if ($isMember) {
  393.             return $this->createJsonResponse([
  394.                 'status' => 'error',
  395.                 'message' => 'json_response.have_joined_group.message',
  396.             ]);
  397.         }
  398.         try {
  399.             $this->getGroupService()->joinGroup($user$id);
  400.         } catch (\Exception $e) {
  401.             return $this->createJsonResponse([
  402.                 'status' => 'error',
  403.                 'message' => 'json_response.join_group_failed.message',
  404.             ]);
  405.         }
  406.         return $this->createJsonResponse([
  407.             'status' => 'success',
  408.         ]);
  409.     }
  410.     public function groupExitAction($id)
  411.     {
  412.         $user $this->getCurrentUser();
  413.         $this->getGroupService()->exitGroup($user$id);
  414.         return $this->createJsonResponse([
  415.             'status' => 'success',
  416.         ]);
  417.     }
  418.     public function groupEditAction(Request $request$id)
  419.     {
  420.         if (!$this->checkManagePermission($id)) {
  421.             return $this->createMessageResponse('info''您没有权限!');
  422.         }
  423.         $groupinfo $request->request->all();
  424.         $group = [];
  425.         if ($groupinfo) {
  426.             $group = [
  427.                 'title' => $groupinfo['group']['grouptitle'],
  428.                 'about' => $groupinfo['group']['about'], ];
  429.         }
  430.         $this->getGroupService()->updateGroup($id$group);
  431.         return $this->redirect($this->generateUrl('group_show', [
  432.             'id' => $id,
  433.         ]));
  434.     }
  435.     protected function filterSort($sort)
  436.     {
  437.         switch ($sort) {
  438.             case 'byPostNum':
  439.                 $orderBys = ['isStick' => 'DESC''postNum' => 'DESC''createdTime' => 'DESC'];
  440.                 break;
  441.             case 'byStick':
  442.             case 'byCreatedTime':
  443.                 $orderBys = ['isStick' => 'DESC''createdTime' => 'DESC'];
  444.                 break;
  445.             case 'byLastPostTime':
  446.                 $orderBys = ['isStick' => 'DESC''lastPostTime' => 'DESC'];
  447.                 break;
  448.             case 'byCreatedTimeOnly':
  449.                 $orderBys = ['createdTime' => 'DESC'];
  450.                 break;
  451.             default:
  452.                 $this->createNewException(CommonException::ERROR_PARAMETER());
  453.         }
  454.         return $orderBys;
  455.     }
  456.     protected function getThreadSearchFilters($request)
  457.     {
  458.         $filters = [];
  459.         $filters['type'] = $request->query->get('type');
  460.         if (!in_array($filters['type'], ['all''elite''reward'])) {
  461.             $filters['type'] = 'all';
  462.         }
  463.         $filters['sort'] = $request->query->get('sort');
  464.         if (!in_array($filters['sort'], ['byCreatedTime''byLastPostTime''byPostNum'])) {
  465.             $filters['sort'] = 'byCreatedTime';
  466.         }
  467.         $filters['num'] = $request->query->get('num');
  468.         if (!in_array($filters['num'], [25])) {
  469.             $filters['num'] = 25;
  470.         }
  471.         return $filters;
  472.     }
  473.     protected function convertFiltersToConditions($id$filters)
  474.     {
  475.         $conditions = ['groupId' => $id'num' => 10'status' => 'open'];
  476.         switch ($filters['type']) {
  477.             case 'elite':
  478.                 $conditions['isElite'] = 1;
  479.                 break;
  480.             case 'reward':
  481.                 $conditions['type'] = 'reward';
  482.                 break;
  483.             default:
  484.                 break;
  485.         }
  486.         $conditions['num'] = $filters['num'];
  487.         return $conditions;
  488.     }
  489.     protected function _getGroupList()
  490.     {
  491.         $user $this->getCurrentUser();
  492.         $myJoinGroup = [];
  493.         if ($user['id']) {
  494.             $membersCount $this->getGroupService()->countMembers(['userId' => $user['id']]);
  495.             $start $membersCount 12 rand(0$membersCount 12) : 0;
  496.             $members $this->getGroupService()->searchMembers(['userId' => $user['id']], ['createdTime' => 'DESC'], $start12);
  497.             $groupIds ArrayToolkit::column($members'groupId');
  498.             $myJoinGroup $this->getGroupService()->getGroupsByids($groupIds);
  499.         }
  500.         $newGroups $this->getGroupService()->searchGroups(['status' => 'open'], ['createdTime' => 'DESC'], 08);
  501.         return [$user$myJoinGroup$newGroups];
  502.     }
  503.     protected function _getMemberList($group)
  504.     {
  505.         $user $this->getCurrentUser();
  506.         $groupOwner $this->getUserService()->getUser($group['ownerId']);
  507.         $recentlyJoinMember $this->getGroupService()->searchMembers(['groupId' => $group['id']], ['createdTime' => 'DESC'], 020);
  508.         $memberIds ArrayToolkit::column($recentlyJoinMember'userId');
  509.         $recentlyMembers $this->getUserService()->findUsersByIds($memberIds);
  510.         $userIsGroupMember $this->getGroupService()->getMemberByGroupIdAndUserId($group['id'], $user['id']);
  511.         return [$user$groupOwner$recentlyJoinMember$recentlyMembers$userIsGroupMember];
  512.     }
  513.     /**
  514.      * @return ThreadService
  515.      */
  516.     protected function getThreadService()
  517.     {
  518.         return $this->getBiz()->service('Group:ThreadService');
  519.     }
  520.     /**
  521.      * @return GroupService
  522.      */
  523.     protected function getGroupService()
  524.     {
  525.         return $this->getBiz()->service('Group:GroupService');
  526.     }
  527.     /**
  528.      * @return NotificationService
  529.      */
  530.     protected function getNotifiactionService()
  531.     {
  532.         return $this->getBiz()->service('User:NotificationService');
  533.     }
  534.     /**
  535.      * @return SettingService
  536.      */
  537.     protected function getSettingService()
  538.     {
  539.         return $this->getBiz()->service('System:SettingService');
  540.     }
  541.     /**
  542.      * @return UserService
  543.      */
  544.     protected function getUserService()
  545.     {
  546.         return $this->getBiz()->service('User:UserService');
  547.     }
  548.     /**
  549.      * @return FileService
  550.      */
  551.     protected function getFileService()
  552.     {
  553.         return $this->getBiz()->service('Content:FileService');
  554.     }
  555. }