jsdw_ios/QuickLocation/Service/GroupService.swift

275 lines
11 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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(error)
})
.disposed(by: disposeBag)
}
}