| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- <?php
- namespace Modules\Api\Controllers;
- use App\Constants\AdConstrant;
- use App\Constants\CommonConstant;
- use App\Model\CommentModel;
- use App\Model\Mongo\MessageModel;
- use App\Model\Mongo\UserRelationModel;
- use App\Model\Mongo\VideoLikeModel;
- use App\Model\UserModel;
- use App\Model\VideoModel;
- use App\Repositories\ConfigRepoistory;
- use App\Repositories\MessageRepository;
- use App\Repositories\Utils\M3u8CacheRepository;
- use Carbon\Carbon;
- use Hyperf\Validation\Contract\ValidatorFactoryInterface;
- use Modules\Api\Services\VideoService;
- class MessageController extends BaseController
- {
- use \Hyperf\Di\Aop\ProxyTrait;
- use \Hyperf\Di\Aop\PropertyHandlerTrait;
- function __construct()
- {
- if (method_exists(parent::class, '__construct')) {
- parent::__construct(...func_get_args());
- }
- $this->__handlePropertyHandler(__CLASS__);
- }
- public function index()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $configRepo = make(ConfigRepoistory::class);
- $videoService = make(VideoService::class);
- $adList = $videoService->getAdList(AdConstrant::MESSAGE_INDEX);
- $ad = null;
- if (!empty($adList[0])) {
- $link = M3u8CacheRepository::getLinkUrl($adList[0]['link'], ['user_code' => $userCode]);
- $ad = ['position' => $adList[0]['position'], 'title' => $adList[0]['title'], 'cover' => !empty($adList[0]['cover']) ? M3u8CacheRepository::getImageUrl($adList[0]['cover']) : '', 'link' => $link, 'scheme' => $adList[0]['scheme'], 'type' => $adList[0]['type'], 'play' => !empty($adList[0]['play']) ? M3u8CacheRepository::getM3u8Url($adList[0]['play']) : '', 'resolution' => $adList[0]['resolution'] ?? ''];
- if (!empty($ad['link'])) {
- $ad['link'] = M3u8CacheRepository::getLinkUrl($ad['link'], ['user_code' => $userCode]);
- }
- }
- $kefuUrl = $configRepo->get('server_link', 'sys', '');
- if (strripos($kefuUrl, '?')) {
- $kefuUrl .= '&user_code=' . $userCode;
- } else {
- $kefuUrl .= '?user_code=' . $userCode;
- }
- // 系统消息的第一条,包含统计
- $sysMsg = make(MessageRepository::class)->firstSys($userCode);
- $arrData = ['ad' => $ad, 'kefu' => ['url' => $kefuUrl, 'description' => '亲,有什么可以帮助您的?'], 'sys' => $sysMsg, 'talk' => null];
- // 私聊消息
- $shopsMsg = make(MessageRepository::class)->firstSys($userCode, 'user');
- $arrData['count_unread'] = $shopsMsg['count_unread'];
- return json_success($arrData);
- }
- /**
- * 系统消息分页.
- * @return mixed
- */
- public function sysPages()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $previousDate = isset($inputData['previous_date']) ? trim($inputData['previous_date']) : '';
- if (empty($previousDate)) {
- $previousDate = Carbon::now()->toDateTimeString();
- }
- $limitNum = 20;
- $result = ['previous_date' => $previousDate, 'data' => null];
- $items = make(MessageRepository::class)->previousSysPages($userCode, $previousDate, $limitNum, true);
- if (!empty($items)) {
- $result['data'] = $items;
- }
- return json_success($result);
- }
- /**
- * 标记消息为已读.
- * @return mixed|void
- */
- public function doRead()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $msgId = isset($inputData['msg_id']) ? trim($inputData['msg_id']) : '';
- if (empty($msgId)) {
- return json_fail('参数有误1');
- }
- if (!preg_match('/^[a-z0-9]{16,32}$/i', $msgId)) {
- return json_fail('参数有误2');
- }
- $result = make(MessageRepository::class)->doRead($msgId, $userCode);
- if (!$result) {
- return json_fail('不能正确操作已读');
- }
- return json_success(['result' => 'success']);
- }
- /**
- * 删除自己的消息.
- * @return mixed
- */
- public function deleteMyself()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $msgIds = isset($inputData['msg_ids']) ? trim($inputData['msg_ids']) : '';
- $receiveUid = $userCode;
- if (empty($msgIds)) {
- return json_fail('缺少参数1');
- }
- $arrMsgIds = [];
- if (is_string($msgIds)) {
- if (stripos($msgIds, ',') !== false) {
- $arrMsgIds = explode(',', $msgIds);
- } else {
- $arrMsgIds[] = $msgIds;
- }
- } else {
- $arrMsgIds = $msgIds;
- }
- $result = make(MessageRepository::class)->slientDelete($arrMsgIds, $userCode);
- if (!$result) {
- return json_fail('删除消息有误.');
- }
- return json_success(['result' => 'success']);
- }
- /**
- * 被关注分页列表
- */
- public function followedPages()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $validatorFactory = make(ValidatorFactoryInterface::class);
- $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $page = $inputData['page'] ?? 1;
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 100) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($page);
- $pageSize = intval($pageSize);
- $relationRepo = make(UserRelationModel::class);
- $filters = ['to_user_id' => $userCode];
- $amount = $relationRepo->db()->countDocuments($filters);
- $skip = ($page - 1) * $pageSize;
- $options = ['skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1]];
- $temItems = $relationRepo->db()->find($filters, $options)->toArray();
- $data = [];
- $result = ['current_page' => $page, 'per_page' => $pageSize, 'total' => $amount, 'data' => []];
- if (!empty($temItems)) {
- foreach ($temItems as $item) {
- $fromUserCode = $item['from_user_id'];
- $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']);
- if ($fromUser) {
- $fromUser = $fromUser->toArray();
- $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']);
- $fromUser['date'] = Carbon::parse($item['date'])->toDateTimeString();
- unset($fromUser['id']);
- $data[] = $fromUser;
- }
- }
- }
- $result['data'] = $data;
- return json_success($result);
- }
- /**
- * 被点赞视频分页列表
- */
- public function likedPages()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $validatorFactory = make(ValidatorFactoryInterface::class);
- $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $page = $inputData['page'] ?? 1;
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 100) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($page);
- $pageSize = intval($pageSize);
- $relationRepo = make(VideoLikeModel::class);
- $filters = ['uid' => $userCode];
- $amount = $relationRepo->db()->countDocuments($filters);
- $skip = ($page - 1) * $pageSize;
- $options = ['skip' => $skip, 'limit' => $pageSize, 'sort' => ['date' => -1]];
- $temItems = $relationRepo->db()->find($filters, $options)->toArray();
- $data = [];
- $result = ['current_page' => $page, 'per_page' => $pageSize, 'total' => $amount, 'data' => []];
- $cacheVideo = [];
- if (!empty($temItems)) {
- $videoColumns = ['id', 'uid', 'title', 'cover'];
- foreach ($temItems as $item) {
- $fromUserCode = $item['uid'];
- $videoId = $item['vid'];
- if (empty($cacheVideo[$videoId])) {
- $videoInfo = VideoModel::query()->where(['status' => 1])->find($videoId, $videoColumns);
- if (empty($videoInfo)) {
- break;
- }
- $videoInfo = $videoInfo->toArray();
- $cacheVideo[$videoId] = $videoInfo;
- } else {
- $videoInfo = $cacheVideo[$videoId];
- }
- $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']);
- if ($fromUser) {
- $fromUser = $fromUser->toArray();
- $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']);
- $fromUser['date'] = Carbon::parse($item['date'])->toDateTimeString();
- $fromUser['video'] = ['id' => $videoInfo['id'], 'title' => $videoInfo['title'], 'cover' => M3u8CacheRepository::getImageUrl($videoInfo['cover']), 'uid' => $videoInfo['uid']];
- unset($fromUser['id']);
- $data[] = $fromUser;
- }
- }
- }
- $result['data'] = $data;
- return json_success($result);
- }
- /**
- * 被评论分页列表
- */
- public function commentedPages()
- {
- $userCode = $this->getUserId();
- $inputData = $this->getJsonData();
- $validatorFactory = make(ValidatorFactoryInterface::class);
- $rules = ['page' => 'nullable|int', 'page_size' => 'nullable|int'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $page = $inputData['page'] ?? 1;
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 100) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($page);
- $pageSize = intval($pageSize);
- if ($pageSize <= 0) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $columns = ['id', 'user_id', 'module', 'svalue', 'content', 'created_at'];
- $items = CommentModel::query()->where(['module_user_uid' => $userCode])->orderByDesc('created_at')->paginate($pageSize, $columns, 'page', $page);
- $result = $items->toArray();
- $cacheData = ['video' => []];
- if (!empty($result['data'])) {
- $videoColumns = ['id', 'uid', 'title', 'cover'];
- foreach ($result['data'] as $k => &$v) {
- $fromUserCode = $v['user_id'];
- $moduleInfo = [];
- if ($v['module'] == 'video') {
- $videoId = $v['svalue'];
- if (empty($cacheData['video'][$videoId])) {
- $videoInfo = VideoModel::query()->where(['status' => 1])->find($videoId, $videoColumns);
- if (!empty($videoInfo)) {
- $videoInfo = $videoInfo->toArray();
- $cacheData['video'][$videoId] = $videoInfo;
- }
- } else {
- $videoInfo = $cacheData['video'][$videoId];
- }
- $moduleInfo = [
- 'module' => $v['module'],
- 'id' => !empty($videoInfo['id']) ? (string) $videoInfo['id'] : '',
- // 强语言,统一转换字符串.
- 'title' => !empty($videoInfo['title']) ? $videoInfo['title'] : '视频已下架',
- 'cover' => !empty($videoInfo['cover']) ? M3u8CacheRepository::getImageUrl($videoInfo['cover']) : '',
- 'uid' => !empty($videoInfo['uid']) ? $videoInfo['uid'] : '',
- ];
- }
- $fromUser = UserModel::query()->where('code', $fromUserCode)->first(['id', 'code', 'nick', 'avatar']);
- if ($fromUser) {
- $fromUser = $fromUser->toArray();
- $fromUser['avatar'] = M3u8CacheRepository::getImageUrl($fromUser['avatar']);
- $fromUser['date'] = $v['created_at'];
- $fromUser['module_info'] = $moduleInfo;
- unset($fromUser['id']);
- } else {
- $fromUser = null;
- }
- $result['data'][$k] = $fromUser;
- }
- }
- return json_success($result);
- }
- /**
- * 私聊用户列表
- *
- * @param ValidatorFactoryInterface $validatorFactory
- * @return mixed
- */
- public function privateChatLists(ValidatorFactoryInterface $validatorFactory)
- {
- $inputData = $this->getJsonData();
- $rules = ['page' => 'required|integer', 'page_size' => 'required|integer'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 500) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($inputData['page'] ?? 1);
- $result = make(MessageModel::class)->db()->aggregate([['$match' => ['receive_uid' => $this->getUserId(), 'from_type' => 'user']], ['$group' => ["_id" => ['from_uid' => '$from_uid'], 'struct_type' => ['$last' => '$struct_type'], 'from_uid' => ['$last' => '$from_uid'], 'from_nick' => ['$last' => '$from_nick'], 'from_avatar' => ['$last' => '$from_avatar'], 'content' => ['$last' => '$content'], 'created_at' => ['$last' => '$created_at']]], ['$sort' => ["created_at" => -1]], ['$limit' => $pageSize * $page], ['$skip' => ($page - 1) * $pageSize]]);
- $res = $result->toArray();
- if (!empty($res)) {
- foreach ($res as &$val) {
- $content = json_decode($val['content'], true);
- $message = structureHandle($content['message'], $val['struct_type']);
- $val['message'] = json_encode($message);
- $val['created_at'] = mongoIsoDateToCarbonTime($val['created_at'])->toDateTimeString();
- $val['from_avatar'] = M3u8CacheRepository::getImageUrl($val['from_avatar']);
- $val['msg_type'] = $val['struct_type'];
- unset($val['_id'], $val['content'], $val['struct_type']);
- }
- }
- return json_success($res);
- }
- /**
- * 我的页面红点数量
- * @return mixed
- */
- public function myRed()
- {
- $result = [];
- $userCode = $this->getUserId();
- // 系统消息的第一条,包含统计
- $sysMsg = make(MessageRepository::class)->firstSys($userCode);
- $result['count_sys_unread'] = $sysMsg['count_unread'];
- // 私聊消息
- $shopsMsg = make(MessageRepository::class)->firstSys($userCode, 'user');
- $result['count_p2p_unread'] = $shopsMsg['count_unread'];
- return json_success($result);
- }
- }
|