| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- <?php
- namespace App\Module\Friend\Logics;
- use App\Module\Friend\Enums\ERROR_CODE;
- use App\Module\Friend\Enums\READ_STATUS;
- use App\Module\Friend\Enums\REQUEST_STATUS;
- use App\Module\Friend\Models\FriendRequest;
- use App\Module\User\Models\User;
- use Carbon\Carbon;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- /**
- * 好友申请逻辑类
- *
- * 实现好友申请的核心业务逻辑,包括申请发送、处理等功能。
- * 该类仅供内部使用,不对外提供服务。
- */
- class Request
- {
- /**
- * 申请有效期(天)
- *
- * @var int
- */
- protected $requestExpireDays = 30;
- /**
- * 发送好友申请
- *
- * @param int $senderId 发送者ID
- * @param int $receiverId 接收者ID
- * @param string|null $message 申请消息
- * @return array 操作结果
- */
- public function sendFriendRequest(int $senderId, int $receiverId, ?string $message = null): array
- {
- try {
- // 检查接收者是否存在
- $receiver = User::find($receiverId);
- if (!$receiver) {
- return [
- 'success' => 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' => '拒绝好友申请失败'
- ];
- }
- }
- }
|