ERROR_CODE::USER_NOT_EXIST ]); } // 检查是否已经是好友 $isFriend = DB::table('friend_relations') ->where('user_id', $senderId) ->where('friend_id', $receiverId) ->exists(); if ($isFriend) { return \UCore\Dto\Res::error('已经是好友关系', [ 'code' => ERROR_CODE::ALREADY_FRIEND ]); } // 检查是否已经发送过申请且未处理 $existingRequest = FriendRequest::where('sender_id', $senderId) ->where('receiver_id', $receiverId) ->where('status', REQUEST_STATUS::PENDING) ->first(); if ($existingRequest) { return \UCore\Dto\Res::error('已发送过申请,请等待对方处理', [ 'code' => ERROR_CODE::REQUEST_ALREADY_SENT ]); } // 创建新的申请 $request = FriendRequest::create([ 'sender_id' => $senderId, 'receiver_id' => $receiverId, 'message' => $message, 'status' => REQUEST_STATUS::PENDING, 'read_status' => READ_STATUS::UNREAD, 'expired_at' => Carbon::now()->addDays($this->requestExpireDays), ]); // TODO: 发送通知给接收者 return \UCore\Dto\Res::success('好友申请发送成功', [ 'request' => $request ]); } catch (\Exception $e) { Log::error('发送好友申请失败: ' . $e->getMessage()); return \UCore\Dto\Res::error('发送好友申请失败', [ 'code' => ERROR_CODE::PARAM_ERROR, 'error' => $e->getMessage() ]); } } /** * 获取收到的好友申请列表 * * @param int $userId 用户ID * @param int $page 页码 * @param int $limit 每页数量 * @return array 申请列表数据 */ public function getReceivedRequests(int $userId, int $page = 1, int $limit = 20): array { // 查询收到的申请 $requests = FriendRequest::where('receiver_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->where('expired_at', '>', Carbon::now()) ->with('sender') ->orderBy('id', 'desc') ->paginate($limit, ['*'], 'page', $page); // 更新为已读状态 FriendRequest::where('receiver_id', $userId) ->where('read_status', READ_STATUS::UNREAD) ->update(['read_status' => READ_STATUS::READ]); // 格式化数据 $items = []; foreach ($requests as $request) { if (!$request->sender) { continue; } $items[] = [ 'id' => $request->id, 'sender_id' => $request->sender_id, 'nickname' => $request->sender->nickname ?? '', 'avatar' => $request->sender->avatar ?? '', 'level' => $request->sender->level ?? 1, 'message' => $request->message, 'apply_time' => $request->created_at->timestamp, ]; } return [ 'total' => $requests->total(), 'per_page' => $requests->perPage(), 'current_page' => $requests->currentPage(), 'last_page' => $requests->lastPage(), 'items' => $items ]; } /** * 获取发送的好友申请列表 * * @param int $userId 用户ID * @param int $page 页码 * @param int $limit 每页数量 * @return array 申请列表数据 */ public function getSentRequests(int $userId, int $page = 1, int $limit = 20): array { // 查询发送的申请 $requests = FriendRequest::where('sender_id', $userId) ->where(function($query) { $query->where('status', REQUEST_STATUS::PENDING) ->orWhere('created_at', '>', Carbon::now()->subDays(7)); }) ->with('receiver') ->orderBy('id', 'desc') ->paginate($limit, ['*'], 'page', $page); // 格式化数据 $items = []; foreach ($requests as $request) { if (!$request->receiver) { continue; } $items[] = [ 'id' => $request->id, 'receiver_id' => $request->receiver_id, 'nickname' => $request->receiver->nickname ?? '', 'avatar' => $request->receiver->avatar ?? '', 'level' => $request->receiver->level ?? 1, 'message' => $request->message, 'status' => $request->status, 'apply_time' => $request->created_at->timestamp, ]; } return [ 'total' => $requests->total(), 'per_page' => $requests->perPage(), 'current_page' => $requests->currentPage(), 'last_page' => $requests->lastPage(), 'items' => $items ]; } /** * 获取已发送申请的用户ID列表 * * @param int $userId 用户ID * @return array 用户ID数组 */ public function getSentRequestUserIds(int $userId): array { return FriendRequest::where('sender_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->where('expired_at', '>', Carbon::now()) ->pluck('receiver_id') ->toArray(); } /** * 同意好友申请 * * @param int $userId 当前用户ID * @param int $requestId 申请ID * @return \UCore\Dto\Res 操作结果 */ public function acceptFriendRequest(int $userId, int $requestId): \UCore\Dto\Res { try { // 查询申请记录 $request = FriendRequest::where('id', $requestId) ->where('receiver_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->where('expired_at', '>', Carbon::now()) ->first(); if (!$request) { return \UCore\Dto\Res::error('申请不存在或已过期', [ 'code' => ERROR_CODE::REQUEST_NOT_EXIST ]); } // 检查事务是否已开启 \UCore\Db\Helper::check_tr(); // 更新申请状态 $request->status = REQUEST_STATUS::ACCEPTED; $request->save(); // 创建好友关系 $friendLogic = new FriendLogic(); $result = $friendLogic->createFriendRelation($userId, $request->sender_id); if (!$result['success']) { return \UCore\Dto\Res::error($result['message'] ?? '创建好友关系失败', [ 'code' => $result['code'] ?? ERROR_CODE::PARAM_ERROR ]); } // 获取好友信息 $friend = User::find($request->sender_id); $friendData = null; if ($friend) { $friendData = [ 'user_id' => $friend->id, 'nickname' => $friend->nickname ?? '', 'avatar' => $friend->avatar ?? '', 'level' => $friend->level ?? 1, 'status' => 2, // 默认离线 'last_login' => $friend->last_login_at ?? 0, 'remark' => null, 'intimacy' => 0, ]; } // TODO: 发送通知给申请者 return \UCore\Dto\Res::success('好友申请已接受', [ 'friend' => $friendData ]); } catch (\Exception $e) { DB::rollBack(); Log::error('同意好友申请失败: ' . $e->getMessage()); return \UCore\Dto\Res::error('同意好友申请失败', [ 'code' => ERROR_CODE::PARAM_ERROR, 'error' => $e->getMessage() ]); } } /** * 拒绝好友申请 * * @param int $userId 当前用户ID * @param int $requestId 申请ID * @return \UCore\Dto\Res 操作结果 */ public function rejectFriendRequest(int $userId, int $requestId): \UCore\Dto\Res { try { // 查询申请记录 $request = FriendRequest::where('id', $requestId) ->where('receiver_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->first(); if (!$request) { return \UCore\Dto\Res::error('申请不存在或已处理', [ 'code' => ERROR_CODE::REQUEST_NOT_EXIST ]); } // 更新申请状态 $request->status = REQUEST_STATUS::REJECTED; $request->save(); // TODO: 发送通知给申请者 return \UCore\Dto\Res::success('好友申请已拒绝'); } catch (\Exception $e) { Log::error('拒绝好友申请失败: ' . $e->getMessage()); return \UCore\Dto\Res::error('拒绝好友申请失败', [ 'code' => ERROR_CODE::PARAM_ERROR, 'error' => $e->getMessage() ]); } } }