TaskSystem/app/common/controller/ImController.php
2023-09-28 10:30:14 +08:00

232 lines
9.1 KiB
PHP

<?php
namespace app\common\controller;
use alioss\alioss;
use app\common\model\im\UserImMessage;
use app\common\model\user\User;
use GatewayClient\Gateway;
use think\response\Json;
class ImController extends BaseLikeAdminController
{
//绑定uid
public function doBindUid(): Json
{
//验证请求方式
if(!$this->request->isPost()){
return $this->fail('请求方式错误');
}
//获取请求参数
$params = $this->request->post(['client_id','user_id']);
if(empty($params['client_id']) || empty($params['user_id'])){
return $this->fail('参数错误');
}
Gateway::bindUid($params['client_id'], $params['user_id']);
return $this->success('绑定成功');
}
//发送消息
public function sendMessage(): Json
{
//验证请求方式
if(!$this->request->isPost()){
return $this->fail('请求方式错误');
}
//获取请求参数
$params = $this->request->post(['msg_id','from_user_id','to_user_id','content','type']);
if(empty($params['msg_id']) || empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['content']) || empty($params['type'])){
return $this->fail('参数错误');
}
if(!in_array($params['type'],['text','image','video'])){
return $this->fail('消息类型错误');
}
//判断消息是否存在
$msgData = UserImMessage::where('msg_id',$params['msg_id'])->findOrEmpty();
if(!$msgData->isEmpty()){
return $this->fail('该消息已发送');
}
//获取发送者信息
$fromUserInfo = User::where('id',$params['from_user_id'])->findOrEmpty();;
if($fromUserInfo->isEmpty()){
return $this->fail('未找到发送者信息');
}
//获取接收者信息
$toUserInfo = User::where('id',$params['to_user_id'])->findOrEmpty();
if($toUserInfo->isEmpty()){
return $this->fail('未找到接收者信息');
}
//存储信息
$saveData = [
'msg_id' => $params['msg_id'],
'from_user_id' => $params['from_user_id'],
'to_user_id' => $params['to_user_id'],
'content' => $params['content'],
'type' => 'type',
'is_read' => 1,
'is_undo' => 0,
'is_delete' => 0,
'create_time' => time(),
'extends' => null,
];
//发送消息
$sendData = [
'msg_id' => $params['msg_id'],
'from_user_id' => $params['from_user_id'],
'from_user_name' => $fromUserInfo['nickname'],
'from_user_avatar' => $fromUserInfo['avatar'],
'to_user_id' => $params['to_user_id'],
'to_user_name' => $toUserInfo['nickname'],
'to_user_avatar' => $toUserInfo['avatar'],
'content' => $params['content'],
'type' => 'type',
'is_read' => 0,
'is_undo' => 0,
'is_delete' => 0,
'create_time' => $saveData['create_time'],
'extends' => null,
];
//保存消息
try {
$model = new UserImMessage();
$result = $model->save($saveData);
if($result){
Gateway::sendToUid($params['to_user_id'], json_encode($sendData));
return $this->success('发送成功');
}else{
return $this->fail('发送失败');
}
}catch (\Exception $e) {
return $this->fail($e->getMessage());
}
}
//上传文件
public function upload(): Json
{
//验证请求方式
if(!$this->request->isPost()){
return $this->fail('请求方式错误');
}
//获取请求参数
$params = $this->request->post(['msg_id','from_user_id','to_user_id','type']);
//获取参数
$file = $this->request->file('file');
if(empty($file) || empty($params['msg_id']) || empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['type'])){
return $this->fail('参数错误');
}
if(!in_array($params['type'],['image','video'])){
return $this->fail('消息类型错误');
}
//判断消息是否存在
$msgData = UserImMessage::where('msg_id',$params['msg_id'])->findOrEmpty();
if(!$msgData->isEmpty()){
return $this->fail('该消息已发送');
}
//获取发送者信息
$fromUserInfo = User::where('id',$params['from_user_id'])->findOrEmpty();;
if($fromUserInfo->isEmpty()){
return $this->fail('未找到发送者信息');
}
//获取接收者信息
$toUserInfo = User::where('id',$params['to_user_id'])->findOrEmpty();
if($toUserInfo->isEmpty()){
return $this->fail('未找到接收者信息');
}
$filePath =$file->getRealPath();
$fileType = $file->extension();
$fileSize = $file->getSize();
$ali_oss = new alioss();
$result = '';
switch ($params['type']) {
case 'image':
$result = $ali_oss -> uploadImg($filePath,$fileType,$fileSize);
break;
case 'video':
$result = $ali_oss -> uploadVideo($filePath,$fileType,$fileSize);
break;
default:
return $this->fail('文件类型错误~');
}
if($result && $result['code'] == 1){
//存储信息
$saveData = [
'msg_id' => $params['msg_id'],
'from_user_id' => $params['from_user_id'],
'to_user_id' => $params['to_user_id'],
'content' => $result['data'],
'type' => 'type',
'is_read' => 1,
'is_undo' => 0,
'is_delete' => 0,
'create_time' => time(),
'extends' => $params['type'] == 'video' ? json_encode(['poster_img'=>$result['data'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png']) : null,
];
//发送消息
$sendData = [
'msg_id' => $params['msg_id'],
'from_user_id' => $params['from_user_id'],
'from_user_name' => $fromUserInfo['nickname'],
'from_user_avatar' => $fromUserInfo['avatar'],
'to_user_id' => $params['to_user_id'],
'to_user_name' => $toUserInfo['nickname'],
'to_user_avatar' => $toUserInfo['avatar'],
'content' => $result['data'],
'type' => 'type',
'is_read' => 0,
'is_undo' => 0,
'is_delete' => 0,
'create_time' => $saveData['create_time'],
'extends' => $params['type'] == 'video' ? json_encode(['poster_img'=>$result['data'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png']) : null,
];
//保存消息
try {
$model = new UserImMessage();
$result = $model->save($saveData);
if($result){
Gateway::sendToUid($params['to_user_id'], json_encode($sendData));
return $this->success('发送成功');
}else{
return $this->fail('发送失败');
}
}catch (\Exception $e) {
return $this->fail($e->getMessage());
}
}else{
return $this->fail($result['msg']);
}
}
//消息列表
public function msgList(): Json
{
//验证请求方式
if(!$this->request->isPost()){
return $this->fail('请求方式错误');
}
//获取请求参数
$params = $this->request->post(['user_id','page_no','page_size']);
if(empty($params['user_id']) || empty($params['page_no']) || empty($params['page_size'])){
return $this->fail('参数错误');
}
//获取用户信息
$userInfo = User::where('id',$params['user_id'])->findOrEmpty();
if($userInfo->isEmpty()){
return $this->fail('未找到用户信息');
}
//获取用户消息
$msgData = UserImMessage::field('id,from_user_id,to_user_id,content,type,is_read,is_undo,is_delete,create_time,extends')
->where('from_user_id',$params['user_id'])
->order('create_time desc')->page($params['page_no'],$params['page_size'])->select()->each(function($item) use($userInfo){
$toUserInfo = User::field('nickname,avatar')->where('id',$item['to_user_id'])->findOrEmpty();
if(!$toUserInfo->isEmpty()){
$item['from_user_name'] = $userInfo['nickname'];
$item['from_user_avatar'] = $userInfo['avatar'];
$item['to_user_name'] = $toUserInfo['nickname'];
$item['to_user_avatar'] = $toUserInfo['avatar'];
}
})->toArray();
//返回数据
return $this->success('请求成功',$msgData);
}
}