false, 'code' => ERROR_CODE::USER_NOT_EXIST, 'message' => '用户不存在' ]; } // 检查是否已经是好友 $isFriend = DB::table('friend_relations') ->where('user_id', $senderId) ->where('friend_id', $receiverId) ->exists(); if ($isFriend) { return [ 'success' => false, 'code' => ERROR_CODE::ALREADY_FRIEND, 'message' => '已经是好友关系' ]; } // 检查是否已经发送过申请且未处理 $existingRequest = FriendRequest::where('sender_id', $senderId) ->where('receiver_id', $receiverId) ->where('status', REQUEST_STATUS::PENDING) ->first(); if ($existingRequest) { return [ 'success' => false, 'code' => ERROR_CODE::REQUEST_ALREADY_SENT, 'message' => '已发送过申请,请等待对方处理' ]; } // 创建新的申请 $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 [ 'success' => true, 'data' => $request ]; } catch (\Exception $e) { Log::error('发送好友申请失败: ' . $e->getMessage()); return [ 'success' => false, 'code' => ERROR_CODE::PARAM_ERROR, 'message' => '发送好友申请失败' ]; } } /** * 获取收到的好友申请列表 * * @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 array 操作结果 */ public function acceptFriendRequest(int $userId, int $requestId): array { try { // 查询申请记录 $request = FriendRequest::where('id', $requestId) ->where('receiver_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->where('expired_at', '>', Carbon::now()) ->first(); if (!$request) { return [ 'success' => false, 'code' => ERROR_CODE::REQUEST_NOT_EXIST, 'message' => '申请不存在或已过期' ]; } // 开启事务 DB::beginTransaction(); // 更新申请状态 $request->status = REQUEST_STATUS::ACCEPTED; $request->save(); // 创建好友关系 $friendLogic = new Friend(); $result = $friendLogic->createFriendRelation($userId, $request->sender_id); if (!$result['success']) { DB::rollBack(); return $result; } // 提交事务 DB::commit(); // 获取好友信息 $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 [ 'success' => true, 'data' => $friendData ]; } catch (\Exception $e) { DB::rollBack(); Log::error('同意好友申请失败: ' . $e->getMessage()); return [ 'success' => false, 'code' => ERROR_CODE::PARAM_ERROR, 'message' => '同意好友申请失败' ]; } } /** * 拒绝好友申请 * * @param int $userId 当前用户ID * @param int $requestId 申请ID * @return array 操作结果 */ public function rejectFriendRequest(int $userId, int $requestId): array { try { // 查询申请记录 $request = FriendRequest::where('id', $requestId) ->where('receiver_id', $userId) ->where('status', REQUEST_STATUS::PENDING) ->first(); if (!$request) { return [ 'success' => false, 'code' => ERROR_CODE::REQUEST_NOT_EXIST, 'message' => '申请不存在或已处理' ]; } // 更新申请状态 $request->status = REQUEST_STATUS::REJECTED; $request->save(); // TODO: 发送通知给申请者 return [ 'success' => true ]; } catch (\Exception $e) { Log::error('拒绝好友申请失败: ' . $e->getMessage()); return [ 'success' => false, 'code' => ERROR_CODE::PARAM_ERROR, 'message' => '拒绝好友申请失败' ]; } } }