// // GroupService.swift // QuickLocation // // Created by 八条 on 2026/6/1. // import Foundation import RxSwift import Moya struct GroupService { static let disposeBag = DisposeBag() private static let notifyingOperations: Set = [ "create", "join", "setdefault", "editmateinfo" ] private static func postGroupDataChange(operation: String, requestData: [String: Any], responseData: [String: Any]? = nil) { var userInfo: [AnyHashable: Any] = [ GroupDataChangeUserInfoKey.operation: operation, GroupDataChangeUserInfoKey.source: GroupDataChangeSource.api ] let responseGroupKey = responseData?[GroupDataChangeUserInfoKey.groupKey] as? String if let groupKey = requestData[GroupDataChangeUserInfoKey.groupKey] as? String ?? responseGroupKey, !groupKey.isEmpty { userInfo[GroupDataChangeUserInfoKey.groupKey] = groupKey } let userId = requestData[GroupDataChangeUserInfoKey.userId] as? String ?? requestData["review_userid"] as? String ?? requestData["kick_userid"] as? String ?? (requestData["kick_userid"] as? [String])?.first if let userId, !userId.isEmpty { userInfo[GroupDataChangeUserInfoKey.userId] = userId } let post = { NotificationCenter.default.post( name: .RefreshGroupInfoNotification, object: nil, userInfo: userInfo ) } if Thread.isMainThread { post() } else { DispatchQueue.main.async(execute: post) } } private static func notifyGroupInfoChange(operation: String, requestData: [String: Any]) -> (T) -> Void { { _ in postGroupDataChange(operation: operation, requestData: requestData) } } /// 所有圈子信息 static func groupInfo() -> Observable { let api = GroupAPI.groupInfo.multiTarget return APIProvider.request(token: api) .map(UserGroupResponse.self) .map { response in if let model = response.model { AppContextManager.shared.defaultGroupKey = model.default_group_key } return response } .asObservable() } /// 圈子类型模板 static func groupTemplates() -> Observable { let api = GroupAPI.groupTemplates.multiTarget return APIProvider.request(token: api) .map(GroupTemplateResponse.self) .asObservable() } /// 指定圈子的资料及完整成员列表 static func groupUsers(groupKey: String) -> Observable { let api = GroupAPI.groupUsers(groupKey: groupKey).multiTarget return APIProvider.request(token: api) .map(GroupUsersResponse.self) .asObservable() } /// 圈子操作(创建、解散、设为默认等) /// - Parameters: /// - opType: create、dismiss、setdefault /// - requestData:[String: Any] 根据操作传入对应的值 static func operate(opType: String, requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: opType, requestData: requestData).multiTarget return APIProvider.request(token: api) .map(ResponseModel.self) .map { response in if opType == "setdefault", let key = requestData["group_key"] as? String, !key.isEmpty { AppContextManager.shared.defaultGroupKey = key } return response } .do(onSuccess: { response in guard notifyingOperations.contains(opType) else { return } postGroupDataChange( operation: opType, requestData: requestData, responseData: response.data ) }) .asObservable() } /// 推荐 static func recommand(count: Int) -> Observable { let api = GroupAPI.operate(opType: "recommand", requestData: ["recommand_count": count]).multiTarget return APIProvider.request(token: api) .map(RecommandGroupResponse.self) .asObservable() } /// 根据key查圈子信息 static func groupInfoByKey(_ key: String) -> Observable { let api = GroupAPI.operate(opType: "info", requestData: ["group_key": key]).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .asObservable() } /// 修改名字 /// - Parameters: /// - requestData:group_key group_name static func editName(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "changename", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "changename", requestData: requestData)) .asObservable() } /// 更换图标 /// - Parameters: /// - requestData:group_key icon_index static func changeIcon(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "changeicon", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "changeicon", requestData: requestData)) .asObservable() } /// 修改描述 /// - Parameters: /// - requestData:group_key description static func editDesc(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "changedescription", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "changedescription", requestData: requestData)) .asObservable() } /// 审核开关 /// - Parameters: /// - requestData:group_key review static func changeReview(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "changereview", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "changereview", requestData: requestData)) .asObservable() } /// 更改标签 /// - Parameters: /// - requestData:group_key labels static func editLabels(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "changelabels", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "changelabels", requestData: requestData)) .asObservable() } /// 审核列表 /// - Parameters: /// - requestData:group_key static func reviewlist(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "reviewlist", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(ReviewMemberListResponse.self) .asObservable() } /// 审核成员 static func reviewMember(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "review", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(ResponseModel.self) .do(onSuccess: notifyGroupInfoChange(operation: "review", requestData: requestData)) .asObservable() } /// 踢出群聊 static func kickMember(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "kick", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(ResponseModel.self) .do(onSuccess: notifyGroupInfoChange(operation: "kick", requestData: requestData)) .asObservable() } /// 退出群聊 /// - Parameters: /// - requestData:group_key static func leave(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "leave", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "leave", requestData: requestData)) .asObservable() } /// 解散群聊 static func dismiss(requestData: [String: Any]) -> Observable { let api = GroupAPI.operate(opType: "dismiss", requestData: requestData).multiTarget return APIProvider.request(token: api) .map(GroupInfoResponse.self) .do(onSuccess: notifyGroupInfoChange(operation: "dismiss", requestData: requestData)) .asObservable() } }