* @link https://github.com/gzydong/hyperf-chat */ namespace App\Service; use App\Model\User; use App\Model\UsersFriend; use App\Model\UsersFriendsApply; use App\Traits\PagingTrait; use Hyperf\DbConnection\Db; use Exception; /** * ContactsService * 注:联系人服务层 * * @package App\Service */ class ContactsService extends BaseService { use PagingTrait; /** * 获取联系人列表 * * @param int $user_id 用户ID * @return array */ public function getContacts(int $user_id): array { $prefix = config('databases.default.prefix'); $sql = <<where('friend_id', $friend_id) ->orderBy('id', 'desc')->first(); if (!$result) { $result = UsersFriendsApply::create([ 'user_id' => $user_id, 'friend_id' => $friend_id, 'status' => 0, 'remarks' => $remarks, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') ]); return $result ? true : false; } else if ($result->status == 0) { $result->remarks = $remarks; $result->updated_at = date('Y-m-d H:i:s'); $result->save(); return true; } return false; } /** * 删除联系人 * * @param int $user_id 用户ID * @param int $friend_id 好友ID * @return bool */ public function deleteContact(int $user_id, int $friend_id): bool { if (!UsersFriend::isFriend($user_id, $friend_id)) { return false; } $data = ['status' => 0]; // 用户ID比大小交换位置 if ($user_id > $friend_id) { [$user_id, $friend_id] = [$friend_id, $user_id]; } return (bool)UsersFriend::where('user1', $user_id)->where('user2', $friend_id)->update($data); } /** * 同意添加联系人 / 联系人申请 * * @param int $user_id 用户ID * @param int $apply_id 联系人申请ID * @param string $remarks 联系人备注名称 * @return bool */ public function acceptInvitation(int $user_id, int $apply_id, string $remarks = ''): bool { $info = UsersFriendsApply::where('id', $apply_id) ->where('friend_id', $user_id) ->where('status', 0) ->orderBy('id', 'desc') ->first(['user_id', 'friend_id']); if (!$info) return false; Db::beginTransaction(); try { $res = UsersFriendsApply::where('id', $apply_id)->update(['status' => 1, 'updated_at' => date('Y-m-d H:i:s')]); if (!$res) { throw new Exception('更新好友申请表信息失败'); } // 判断大小 交换 user1,user2 的位置 [$user1, $user2] = $info->user_id < $info->friend_id ? [$info->user_id, $info->friend_id] : [$info->friend_id, $info->user_id]; // 查询是否存在好友记录 $friendResult = UsersFriend::where([ ['user1', '=', $user1], ['user2', '=', $user2] ])->first(['id', 'user1', 'user2', 'active', 'status']); if ($friendResult) { $active = ($friendResult->user1 == $info->user_id && $friendResult->user2 == $info->friend_id) ? 1 : 2; UsersFriend::where('id', $friendResult->id)->update(['active' => $active, 'status' => 1]); } else { //好友昵称 $friend_nickname = User::where('id', $info->friend_id)->value('nickname'); UsersFriend::create([ 'user1' => $user1, 'user2' => $user2, 'user1_remark' => $user1 == $user_id ? $remarks : $friend_nickname, 'user2_remark' => $user2 == $user_id ? $remarks : $friend_nickname, 'active' => $user1 == $user_id ? 2 : 1, 'status' => 1, 'agree_time' => date('Y-m-d H:i:s'), 'created_at' => date('Y-m-d H:i:s') ]); } Db::commit(); } catch (Exception $e) { Db::rollBack(); return false; } return true; } /** * 拒绝添加联系人 / 联系人申请 * * @param int $user_id 用户ID * @param int $apply_id 联系人申请ID * @param string $remarks 拒绝申请备注信息 * @return bool */ public function declineInvitation(int $user_id, int $apply_id, string $remarks = ''): bool { $result = UsersFriendsApply::where([ ['id', '=', $apply_id], ['user_id', '=', $user_id], ['status', '=', 2], ])->update([ 'status' => 2, 'remarks' => $remarks, 'updated_at' => date('Y-m-d H:i:s') ]); return $result ? true : false; } /** * 编辑联系人备注 * * @param int $user_id 用户ID * @param int $friend_id 朋友ID * @param string $remarks 好友备注名称 * @return bool */ public function editContactRemark(int $user_id, int $friend_id, string $remarks): bool { $data = []; if ($user_id > $friend_id) { [$user_id, $friend_id] = [$friend_id, $user_id]; $data['user2_remark'] = $remarks; } else { $data['user1_remark'] = $remarks; } return (bool)UsersFriend::where('user1', $user_id)->where('user2', $friend_id)->update($data); } /** * 搜索联系人 * * @param string $mobile 用户手机号/登录账号 * @return array */ public function findContact(string $mobile): array { $user = User::where('mobile', $mobile)->first(['id', 'nickname', 'mobile', 'avatar', 'gender']); return $user ? $user->toArray() : []; } /** * 获取联系人申请记录 * * @param int $user_id 用户ID * @param int $page 当前分页 * @param int $page_size 分页大小 * @return array */ public function getContactApplyRecords(int $user_id, $page = 1, $page_size = 30): array { $rowsSqlObj = UsersFriendsApply::select([ 'users_friends_apply.id', 'users_friends_apply.status', 'users_friends_apply.remarks', 'users.nickname', 'users.avatar', 'users.mobile', 'users_friends_apply.user_id', 'users_friends_apply.friend_id', 'users_friends_apply.created_at' ]); $rowsSqlObj->leftJoin('users', 'users.id', '=', 'users_friends_apply.user_id'); $rowsSqlObj->where('users_friends_apply.friend_id', $user_id); $count = $rowsSqlObj->count(); $rows = []; if ($count > 0) { $rows = $rowsSqlObj->orderBy('users_friends_apply.id', 'desc')->forPage($page, $page_size)->get()->toArray(); } return $this->getPagingRows($rows, $count, $page, $page_size); } /** * 删除联系人申请记录 * * @param int $user_id 用户ID * @param int $apply_id 联系人好友申请ID * @return bool */ public function delContactApplyRecord(int $user_id, int $apply_id): bool { return (bool)UsersFriendsApply::where('id', $apply_id)->where('friend_id', $user_id)->delete(); } }