275 lines
11 KiB
Swift
275 lines
11 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()
|
||
}
|
||
|
||
/// 提醒对方开启权限
|
||
static func remindPrivilege(
|
||
content: String,
|
||
groupKey: String,
|
||
userId: String,
|
||
title: String = "请开启权限"
|
||
) -> Observable<ResponseModel> {
|
||
let api = GroupAPI.privilegeRemind(
|
||
title: title,
|
||
content: content,
|
||
groupKey: groupKey,
|
||
userId: userId
|
||
).multiTarget
|
||
return APIProvider.request(token: api)
|
||
.map(ResponseModel.self)
|
||
.asObservable()
|
||
}
|
||
|
||
static func sendPrivilegeRemind(content: String, groupKey: String, userId: String) {
|
||
let key = groupKey.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
let uid = userId.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
guard !key.isEmpty, !uid.isEmpty else { return }
|
||
DLToast.showLoading()
|
||
remindPrivilege(content: content, groupKey: key, userId: uid)
|
||
.subscribe(onNext: { response in
|
||
guard response.code == "0" else {
|
||
DLToast.showError(text: response.message ?? "提醒失败")
|
||
return
|
||
}
|
||
DLToast.show(text: "已提醒")
|
||
}, onError: { error in
|
||
DLToast.show(text: error.localizedDescription)
|
||
})
|
||
.disposed(by: disposeBag)
|
||
}
|
||
}
|