239 lines
9.4 KiB
Swift
239 lines
9.4 KiB
Swift
//
|
||
// 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<String> = [
|
||
"create", "join", "setdefault", "editmateinfo", "changeprivilege"
|
||
]
|
||
|
||
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<T>(operation: String,
|
||
requestData: [String: Any]) -> (T) -> Void {
|
||
{ _ in
|
||
postGroupDataChange(operation: operation, requestData: requestData)
|
||
}
|
||
}
|
||
|
||
/// 所有圈子信息
|
||
static func groupInfo() -> Observable<UserGroupResponse> {
|
||
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<GroupTemplateResponse> {
|
||
let api = GroupAPI.groupTemplates.multiTarget
|
||
return APIProvider.request(token: api)
|
||
.map(GroupTemplateResponse.self)
|
||
.asObservable()
|
||
}
|
||
|
||
/// 指定圈子的资料及完整成员列表
|
||
static func groupUsers(groupKey: String) -> Observable<GroupUsersResponse> {
|
||
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<ResponseModel> {
|
||
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<RecommandGroupResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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<ReviewMemberListResponse> {
|
||
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<ResponseModel> {
|
||
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<ResponseModel> {
|
||
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<GroupInfoResponse> {
|
||
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<GroupInfoResponse> {
|
||
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()
|
||
}
|
||
}
|