diff --git a/app/Caches/ImHotGroupList.php b/app/Caches/ImHotGroupList.php new file mode 100644 index 00000000..b17c2dcc --- /dev/null +++ b/app/Caches/ImHotGroupList.php @@ -0,0 +1,70 @@ +lifetime; + } + + public function getKey($id = null) + { + return 'im_hot_group_list'; + } + + public function getContent($id = null) + { + $limit = 12; + + $groups = $this->findHotGroups($limit); + + if ($groups->count() == 0) { + return []; + } + + return $this->handleContent($groups); + } + + /** + * @param ImChatGroupModel[] $groups + * @return array + */ + protected function handleContent($groups) + { + $result = []; + + foreach ($groups as $group) { + $result[] = [ + 'id' => $group->id, + 'name' => $group->name, + 'avatar' => $group->avatar, + 'about' => $group->about, + ]; + } + + return $result; + } + + /** + * @param int $limit + * @return ResultsetInterface|Resultset|ImChatGroupModel[] + */ + public function findHotGroups($limit = 12) + { + return ImChatGroupModel::query() + ->where('deleted = 0') + ->orderBy('user_count DESC') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Caches/ImHotUserList.php b/app/Caches/ImHotUserList.php new file mode 100644 index 00000000..8662167c --- /dev/null +++ b/app/Caches/ImHotUserList.php @@ -0,0 +1,73 @@ +lifetime; + } + + public function getKey($id = null) + { + return 'im_hot_user_list'; + } + + public function getContent($id = null) + { + $limit = 12; + + $users = $this->findHotUsers($limit); + + if ($users->count() == 0) { + return []; + } + + return $this->handleContent($users); + } + + /** + * @param UserModel[] $users + * @return array + */ + protected function handleContent($users) + { + $result = []; + + foreach ($users as $user) { + $result[] = [ + 'id' => $user->id, + 'name' => $user->name, + 'avatar' => $user->avatar, + 'about' => $user->about, + 'sign' => $user->sign, + 'location' => $user->location, + 'vip' => $user->vip, + ]; + } + + return $result; + } + + /** + * @param int $limit + * @return ResultsetInterface|Resultset|UserModel[] + */ + public function findHotUsers($limit = 12) + { + return UserModel::query() + ->where('deleted = 0') + ->orderBy('follower_count DESC') + ->limit($limit) + ->execute(); + } + +} diff --git a/app/Http/Web/Controllers/MessengerController.php b/app/Http/Web/Controllers/MessengerController.php index f7a69217..0e0cc804 100644 --- a/app/Http/Web/Controllers/MessengerController.php +++ b/app/Http/Web/Controllers/MessengerController.php @@ -15,7 +15,7 @@ class MessengerController extends LayerController use ResponseTrait; /** - * @Get("/init", name="im.init") + * @Get("/init", name="web.im.init") */ public function initAction() { @@ -27,7 +27,7 @@ class MessengerController extends LayerController } /** - * @Get("/group/members", name="im.group_members") + * @Get("/group/members", name="web.im.group_members") */ public function groupMembersAction() { @@ -39,7 +39,7 @@ class MessengerController extends LayerController } /** - * @Get("/msg/box", name="im.msg_box") + * @Get("/msg/box", name="web.im.msg_box") */ public function messageBoxAction() { @@ -47,7 +47,7 @@ class MessengerController extends LayerController } /** - * @Get("/chat/log", name="im.chat_log") + * @Get("/chat/log", name="web.im.chat_log") */ public function chatLogAction() { @@ -61,7 +61,7 @@ class MessengerController extends LayerController } /** - * @Get("/chat/history", name="im.chat_history") + * @Get("/chat/history", name="web.im.chat_history") */ public function chatHistoryAction() { @@ -73,15 +73,47 @@ class MessengerController extends LayerController } /** - * @Get("/find", name="im.find") + * @Get("/find", name="web.im.find") */ public function findAction() { + $service = new MessengerService(); + $usersPager = $service->getHotUsers(); + $groupsPager = $service->getHotGroups(); + + $usersPager->items = kg_array_object($usersPager->items); + $groupsPager->items = kg_array_object($groupsPager->items); + + $this->view->setVar('users_pager', $usersPager); + $this->view->setVar('groups_pager', $groupsPager); } /** - * @Post("/user/bind", name="im.bind_user") + * @Get("/search", name="web.im.search") + */ + public function searchAction() + { + $query = $this->request->getQuery('query', ['trim', 'string']); + $type = $this->request->getQuery('type', ['trim', 'string']); + + $service = new MessengerService(); + + if ($type == 'user') { + $pager = $service->searchUsers($query); + $this->view->pick('messenger/find_users'); + } else { + $pager = $service->searchGroups($query); + $this->view->pick('messenger/find_groups'); + } + + $pager->items = kg_array_object($pager->items); + + $this->view->setVar('pager', $pager); + } + + /** + * @Post("/user/bind", name="web.im.bind_user") */ public function bindUserAction() { @@ -93,7 +125,7 @@ class MessengerController extends LayerController } /** - * @Post("/msg/send", name="im.send_msg") + * @Post("/msg/send", name="web.im.send_msg") */ public function sendMessageAction() { @@ -105,14 +137,14 @@ class MessengerController extends LayerController } /** - * @Post("/img/upload", name="im.upload_img") + * @Post("/img/upload", name="web.im.upload_img") */ public function uploadImageAction() { } /** - * @Post("/file/upload", name="im.upload_file") + * @Post("/file/upload", name="web.im.upload_file") */ public function uploadFileAction() { @@ -120,7 +152,7 @@ class MessengerController extends LayerController } /** - * @Post("/stats/update", name="im.update_stats") + * @Post("/stats/update", name="web.im.update_stats") */ public function updateStatsAction() { @@ -128,30 +160,47 @@ class MessengerController extends LayerController } /** - * @Post("/sign/update", name="im.update_sign") + * @Post("/sign/update", name="web.web.im.update_sign") */ - public function updateSignAction() + public function updateSignatureAction() { + $service = new MessengerService(); + $service->updateSignature(); + + return $this->jsonSuccess(); } /** - * @Post("/friend/apply", name="im.apply_friend") + * @Post("/friend/apply", name="web.im.apply_friend") */ public function applyFriendAction() { + $service = new MessengerService(); + + $service->applyFriend(); + + $content = ['msg' => '发送申请成功,请等待对方通过']; + + return $this->jsonSuccess($content); } /** - * @Post("/group/apply", name="im.apply_group") + * @Post("/group/apply", name="web.im.apply_group") */ public function applyGroupAction() { + $service = new MessengerService(); + $service->applyGroup(); + + $content = ['msg' => '发送申请成功,请等待管理员通过']; + + return $this->jsonSuccess($content); } /** - * @Post("/friend/approve", name="im.approve_friend") + * @Post("/friend/approve", name="web.im.approve_friend") */ public function approveFriendAction() { @@ -159,7 +208,7 @@ class MessengerController extends LayerController } /** - * @Post("/group/approve", name="im.approve_group") + * @Post("/group/approve", name="web.web.im.approve_group") */ public function approveGroupAction() { diff --git a/app/Http/Web/Controllers/PublicController.php b/app/Http/Web/Controllers/PublicController.php index 435d120d..799f074d 100644 --- a/app/Http/Web/Controllers/PublicController.php +++ b/app/Http/Web/Controllers/PublicController.php @@ -2,6 +2,7 @@ namespace App\Http\Web\Controllers; +use App\Library\Security; use App\Models\ContentImage as ContentImageModel; use App\Services\Frontend\Chapter\Learning as LearningService; use App\Services\Storage as StorageService; @@ -52,6 +53,16 @@ class PublicController extends \Phalcon\Mvc\Controller exit; } + /** + * @Post("/token/refresh", name="web.refresh_token") + */ + public function refreshTokenAction() + { + $security = new Security(); + + return $this->jsonSuccess(); + } + /** * @Post("/{id:[0-9]+}/learning", name="web.learning") */ diff --git a/app/Http/Web/Services/Messenger.php b/app/Http/Web/Services/Messenger.php index 47f9c281..db74863e 100644 --- a/app/Http/Web/Services/Messenger.php +++ b/app/Http/Web/Services/Messenger.php @@ -3,14 +3,19 @@ namespace App\Http\Web\Services; use App\Builders\ImMessageList as ImMessageListBuilder; +use App\Caches\ImHotGroupList as ImHotGroupListCache; +use App\Caches\ImHotUserList as ImHotUserListCache; use App\Library\Paginator\Query as PagerQuery; use App\Models\ImFriendMessage as ImFriendMessageModel; +use App\Models\ImFriendUser as ImFriendUserModel; use App\Repos\ImChatGroup as ImChatGroupRepo; use App\Repos\ImFriendMessage as ImFriendMessageRepo; +use App\Repos\ImFriendUser as ImFriendUserRepo; use App\Repos\ImGroupMessage as ImGroupMessageRepo; use App\Repos\User as UserRepo; use App\Validators\ImChatGroup as ImChatGroupValidator; use App\Validators\ImMessage as ImMessageValidator; +use App\Validators\User as UserValidator; use GatewayClient\Gateway; class Messenger extends Service @@ -39,6 +44,46 @@ class Messenger extends Service ]; } + public function searchUsers($query) + { + + } + + public function searchGroups($query) + { + + } + + public function getHotUsers() + { + $cache = new ImHotUserListCache(); + + $items = $cache->get(); + + $pager = new \stdClass(); + + $pager->total_items = count($items); + $pager->total_pages = 1; + $pager->items = $items; + + return $pager; + } + + public function getHotGroups() + { + $cache = new ImHotGroupListCache(); + + $items = $cache->get(); + + $pager = new \stdClass(); + + $pager->total_items = count($items); + $pager->total_pages = 1; + $pager->items = $items; + + return $pager; + } + public function getGroupUsers() { $id = $this->request->getQuery('id'); @@ -194,12 +239,106 @@ class Messenger extends Service } } + public function updateSignature() + { + $sign = $this->request->getPost('sign'); + + $user = $this->getLoginUser(); + + $validator = new UserValidator(); + + $validator->checkSign($sign); + + $user->update(['sign' => $sign]); + + return $user; + } + + public function applyFriend() + { + $friendId = $this->request->getPost('friend_id'); + + $user = $this->getLoginUser(); + + $userValidator = new UserValidator(); + + $friend = $userValidator->checkUser($friendId); + + $friendUserRepo = new ImFriendUserRepo(); + + $friendUser = $friendUserRepo->findFriendUser($user->id, $friend->id); + + if (!$friendUser) { + $model = new ImFriendUserModel(); + $model->user_id = $user->id; + $model->friend_id = $friend->id; + $model->create(); + } + + /** + * @todo 向对方发好友申请的系统消息 + */ + } + + public function approveFriend() + { + $friendId = $this->request->getPost('friend_id'); + + $user = $this->getLoginUser(); + + $userValidator = new UserValidator(); + + $friend = $userValidator->checkUser($friendId); + + $friendUserRepo = new ImFriendUserRepo(); + + $friendUser = $friendUserRepo->findFriendUser($user->id, $friend->id); + + if (!$friendUser) { + $model = new ImFriendUserModel(); + $model->user_id = $user->id; + $model->friend_id = $friend->id; + $model->create(); + } + + /** + * @todo 向对方发通过好友申请的系统消息 + */ + } + + public function refuseFriend() + { + $friendId = $this->request->getPost('friend_id'); + + $user = $this->getLoginUser(); + + $userValidator = new UserValidator(); + + $friend = $userValidator->checkUser($friendId); + + /** + * @todo 向对方发拒绝添加好友的系统消息 + */ + } + + public function applyGroup() + { + } + + public function approveGroup() + { + } + + public function refuseGroup() + { + } + protected function handleFriendList($userId) { $userRepo = new UserRepo(); $friendGroups = $userRepo->findImFriendGroups($userId); - $friends = $userRepo->findImFriends($userId); + $friendUsers = $userRepo->findImFriendUsers($userId); $items = []; @@ -211,11 +350,11 @@ class Messenger extends Service } } - if ($friends->count() == 0) { + if ($friendUsers->count() == 0) { return $items; } - $userIds = kg_array_column($friends->toArray(), 'friend_id'); + $userIds = kg_array_column($friendUsers->toArray(), 'friend_id'); $users = $userRepo->findByIds($userIds); @@ -232,9 +371,9 @@ class Messenger extends Service } foreach ($items as $key => $item) { - foreach ($friends as $friend) { - $userId = $friend->friend_id; - if ($item['id'] == $friend->group_id) { + foreach ($friendUsers as $friendUser) { + $userId = $friendUser->friend_id; + if ($item['id'] == $friendUser->group_id) { $items[$key]['list'][] = $userMappings[$userId]; } else { $items[0]['list'][] = $userMappings[$userId]; diff --git a/app/Http/Web/Views/messenger/find.volt b/app/Http/Web/Views/messenger/find.volt new file mode 100644 index 00000000..91c3adee --- /dev/null +++ b/app/Http/Web/Views/messenger/find.volt @@ -0,0 +1,34 @@ +{% extends 'templates/layer.volt' %} + +{% block content %} + +