/** * 群组服务 * 处理群组管理、成员管理、群设置、群公告等功能 * 使用 RESTful API: /api/v1/groups */ import { api } from './api'; import { GroupResponse, GroupMemberResponse, GroupAnnouncementResponse, GroupListResponse, GroupMemberListResponse, GroupAnnouncementListResponse, CreateGroupRequest, InviteMembersRequest, TransferOwnerRequest, SetRoleRequest, SetNicknameRequest, SetMuteAllRequest, SetJoinTypeRequest, CreateAnnouncementRequest, MyMemberInfoResponse, SetGroupAvatarRequest, HandleGroupRequestAction, CursorPaginationRequest, CursorPaginationResponse, } from '../types/dto'; // 群组服务类(纯 API 层) // SQLite/内存缓存编排由 groupManager 统一处理 class GroupService { async fetchGroupsFromApi(page = 1, pageSize = 20): Promise { const response = await api.get('/groups', { page, page_size: pageSize, }); return response.data; } async fetchGroupFromApi(id: number | string): Promise { const response = await api.get(`/groups/${encodeURIComponent(String(id))}`); return response.data; } async fetchMembersFromApi( groupId: number | string, page = 1, pageSize = 50 ): Promise { const response = await api.get( `/groups/${encodeURIComponent(String(groupId))}/members`, { page, page_size: pageSize, } ); return response.data; } // ==================== 群组管理 ==================== /** * 创建群组 * POST /api/v1/groups */ async createGroup(data: CreateGroupRequest): Promise { const response = await api.post('/groups', data); return response.data; } /** * 获取群组列表 * GET /api/v1/groups */ async getGroups(page = 1, pageSize = 20): Promise { return this.fetchGroupsFromApi(page, pageSize); } /** * 获取群组详情 * GET /api/v1/groups/:id */ async getGroup(id: number | string): Promise { return this.fetchGroupFromApi(id); } /** * 获取当前用户在群组中的成员信息 * GET /api/v1/groups/:id/me */ async getMyMemberInfo(groupId: number | string): Promise { const response = await api.get( `/groups/${encodeURIComponent(String(groupId))}/me` ); return response.data; } /** * 解散群组 * DELETE /api/v1/groups/:id */ async dissolveGroup(id: number | string): Promise { await api.delete(`/groups/${encodeURIComponent(String(id))}`); } /** * 转让群主 * POST /api/v1/groups/:id/transfer */ async transferOwner(id: number | string, data: TransferOwnerRequest): Promise { await api.post(`/groups/${encodeURIComponent(String(id))}/transfer`, data); } // ==================== 成员管理 ==================== /** * 邀请成员加入群组 * POST /api/v1/groups/:id/invitations */ async inviteMembers(groupId: number | string, data: InviteMembersRequest): Promise { await api.post(`/groups/${encodeURIComponent(String(groupId))}/invitations`, data); } /** * 申请加入群组 * POST /api/v1/groups/:id/join-requests */ async joinGroup(groupId: number | string): Promise { await api.post(`/groups/${encodeURIComponent(String(groupId))}/join-requests`); } /** * 响应群邀请/申请 * POST /api/v1/groups/:id/join-requests/respond */ async respondInvite(groupId: number | string, data: HandleGroupRequestAction): Promise { await api.post( `/groups/${encodeURIComponent(String(groupId))}/join-requests/respond`, data ); } /** * 审批主动加群申请 * POST /api/v1/groups/:id/join-requests/handle */ async reviewJoinRequest(groupId: number | string, data: HandleGroupRequestAction): Promise { await api.post( `/groups/${encodeURIComponent(String(groupId))}/join-requests/handle`, data ); } /** * 退出群组 * POST /api/v1/groups/:id/leave */ async leaveGroup(groupId: number | string): Promise { await api.post(`/groups/${encodeURIComponent(String(groupId))}/leave`); } /** * 获取群组成员列表 * GET /api/v1/groups/:id/members */ async getMembers(groupId: number | string, page = 1, pageSize = 50): Promise { return this.fetchMembersFromApi(groupId, page, pageSize); } /** * 移除群成员(踢人) * POST /api/v1/groups/:id/members/kick */ async removeMember(groupId: number | string, userId: string): Promise { await api.post(`/groups/${encodeURIComponent(String(groupId))}/members/kick`, { user_id: userId, reject_add_request: false, }); } /** * 设置成员角色(设置/取消管理员) * PUT /api/v1/groups/:id/members/:user_id/admin */ async setMemberRole( groupId: number | string, userId: string, data: SetRoleRequest ): Promise { await api.put( `/groups/${encodeURIComponent(String(groupId))}/members/${encodeURIComponent(userId)}/admin`, { enable: data.role === 'admin', } ); } /** * 设置群昵称 * PUT /api/v1/groups/:id/members/me/nickname */ async setNickname(groupId: number | string, data: SetNicknameRequest): Promise { await api.put(`/groups/${encodeURIComponent(String(groupId))}/members/me/nickname`, data); } /** * 禁言/解禁成员 * POST /api/v1/groups/:id/members/ban * @param groupId 群组ID * @param userId 用户ID * @param duration 禁言时长(秒),0表示解除禁言 */ async muteMember( groupId: number | string, userId: string, duration: number = 0 ): Promise { await api.post(`/groups/${encodeURIComponent(String(groupId))}/members/ban`, { user_id: userId, duration: duration, }); } // ==================== 群设置 ==================== /** * 设置全员禁言 * PUT /api/v1/groups/:id/ban */ async setMuteAll(groupId: number | string, data: SetMuteAllRequest): Promise { await api.put(`/groups/${encodeURIComponent(String(groupId))}/ban`, { enable: data.mute_all, }); } /** * 设置加群方式 * PUT /api/v1/groups/:id/join-type */ async setJoinType(groupId: number | string, data: SetJoinTypeRequest): Promise { await api.put(`/groups/${encodeURIComponent(String(groupId))}/join-type`, data); } /** * 设置群名称 * PUT /api/v1/groups/:id/name */ async setGroupName(groupId: number | string, groupName: string): Promise { await api.put(`/groups/${encodeURIComponent(String(groupId))}/name`, { group_name: groupName, }); } /** * 设置群头像 * PUT /api/v1/groups/:id/avatar */ async setGroupAvatar(groupId: number | string, avatarUrl: string): Promise { const response = await api.put( `/groups/${encodeURIComponent(String(groupId))}/avatar`, { avatar: avatarUrl, } ); return response.data; } // ==================== 群公告 ==================== /** * 创建群公告 * POST /api/v1/groups/:id/announcements */ async createAnnouncement( groupId: number | string, data: CreateAnnouncementRequest ): Promise { const response = await api.post( `/groups/${encodeURIComponent(String(groupId))}/announcements`, data ); return response.data; } /** * 获取群公告列表 * GET /api/v1/groups/:id/announcements */ async getAnnouncements( groupId: number | string, page = 1, pageSize = 20 ): Promise { try { const response = await api.get( `/groups/${encodeURIComponent(String(groupId))}/announcements`, { page, page_size: pageSize, } ); return response.data; } catch (error) { console.error('获取群公告列表失败:', error); return { list: [], total: 0, page: 1, page_size: pageSize, total_pages: 0, }; } } /** * 删除群公告 * DELETE /api/v1/groups/:id/announcements/:announcement_id */ async deleteAnnouncement(groupId: number | string, announcementId: number): Promise { await api.delete( `/groups/${encodeURIComponent(String(groupId))}/announcements/${encodeURIComponent(String(announcementId))}` ); } // ==================== 游标分页方法 ==================== /** * 获取群组列表(游标分页) * GET /api/v1/groups/cursor * @param params 游标分页请求参数 */ async getGroupsCursor( params: CursorPaginationRequest = {} ): Promise> { try { const response = await api.get>('/groups/cursor', { params, }); return response.data; } catch (error) { console.error('获取群组列表失败:', error); return { list: [], next_cursor: null, prev_cursor: null, has_more: false, }; } } /** * 获取群组成员列表(游标分页) * GET /api/v1/groups/:id/members/cursor * @param groupId 群组ID * @param params 游标分页请求参数 */ async getGroupMembersCursor( groupId: number | string, params: CursorPaginationRequest = {} ): Promise> { try { const response = await api.get>( `/groups/${encodeURIComponent(String(groupId))}/members/cursor`, { params } ); return response.data; } catch (error) { console.error('获取群组成员列表失败:', error); return { list: [], next_cursor: null, prev_cursor: null, has_more: false, }; } } /** * 获取群公告列表(游标分页) * GET /api/v1/groups/:id/announcements/cursor * @param groupId 群组ID * @param params 游标分页请求参数 */ async getGroupAnnouncementsCursor( groupId: number | string, params: CursorPaginationRequest = {} ): Promise> { try { const response = await api.get>( `/groups/${encodeURIComponent(String(groupId))}/announcements/cursor`, { params } ); return response.data; } catch (error) { console.error('获取群公告列表失败:', error); return { list: [], next_cursor: null, prev_cursor: null, has_more: false, }; } } } // 导出群组服务实例 export const groupService = new GroupService(); // 导出类型以方便使用 export type { GroupResponse, GroupMemberResponse, GroupAnnouncementResponse, GroupListResponse, GroupMemberListResponse, GroupAnnouncementListResponse, CreateGroupRequest, InviteMembersRequest, TransferOwnerRequest, SetRoleRequest, SetNicknameRequest, SetMuteAllRequest, SetJoinTypeRequest, CreateAnnouncementRequest, SetGroupAvatarRequest, };