492 lines
16 KiB
Swift
492 lines
16 KiB
Swift
//
|
||
// UserAPI.swift
|
||
// QuickLocation
|
||
//
|
||
// Created by 八条 on 2026/5/28.
|
||
//
|
||
|
||
import Moya
|
||
import SwiftyUserDefaults
|
||
internal import Alamofire
|
||
|
||
/// 用户相关API
|
||
enum UserAPI {
|
||
/// 登录
|
||
/// - Parameters:
|
||
/// - type: weixin、phone、apple、onekey、device、alipay
|
||
/// - bind:1绑定 2解绑 为空是登录
|
||
case login(type: String,
|
||
bind: String,
|
||
data: [String: Any])
|
||
|
||
/// 用户信息
|
||
case userInfo
|
||
|
||
/// 用户当前状态
|
||
case userStatus
|
||
|
||
/// 成员今日手机使用数据
|
||
case phoneUsageToday(userId: String, groupKey: String)
|
||
|
||
/// 成员 APP 周期使用报告
|
||
case phoneUsagePeriod(userId: String, groupKey: String, period: String)
|
||
|
||
/// 成员手机使用报告
|
||
case phoneUsageReport(userId: String, groupKey: String)
|
||
|
||
/// 成员历史行程
|
||
case phoneUsageTrips(userId: String, date: Int64)
|
||
|
||
/// 查询应用图标是否已存在
|
||
case queryPhoneUsageIcon(package: String)
|
||
|
||
/// 登记应用图标
|
||
case savePhoneUsageIcon(package: String, icon: String)
|
||
|
||
/// 上报本机配对应用
|
||
case phoneLockApp(token: String, icon: String)
|
||
|
||
/// 成员可锁应用列表
|
||
case phoneLockApps(userId: String, groupKey: String)
|
||
|
||
/// 删除本机配对应用;空 token 数组表示全部删除
|
||
case phoneLockAppsDelete(os: String, tokens: [String])
|
||
|
||
/// 锁定成员应用
|
||
case phoneLock(os: String, groupKey: String, userId: String, tokens: [String], iconIndex: Int, message: String)
|
||
|
||
/// 查询自己是否被锁
|
||
case phoneLocked(os: String)
|
||
|
||
/// 发起解锁请求
|
||
case requestPhoneUnlock(os: String, groupKey: String, tokens: [String])
|
||
|
||
/// 拉取解锁请求列表
|
||
case phoneUnlockRequests(os: String)
|
||
|
||
/// 解锁
|
||
case phoneUnlock(os: String, groupKey: String, userId: String, tokens: [String])
|
||
|
||
/// 查询本机离线期间是否允许解锁
|
||
case phoneUnlockAllow(os: String)
|
||
|
||
/// 确认本机已执行解锁
|
||
case phoneUnlockAllowConfirm(os: String, groupKey: String, userId: String, tokens: [String])
|
||
|
||
/// 用户IM Token
|
||
case imToken
|
||
|
||
/// 签到信息
|
||
case signInInfo
|
||
|
||
/// 更换手机号
|
||
case changePhone(timestamp: String, phone: String, code: String)
|
||
|
||
/// 设置头像(预设序号或上传后的图片 URL)
|
||
case setHeadPic(headPic: String)
|
||
|
||
case changeAvater(url: String)
|
||
|
||
/// 昵称
|
||
case setNickName(nick: String)
|
||
|
||
/// 设置心情
|
||
/// - Parameters:
|
||
/// - moodIndex: 表情 json 文件名对应的数字
|
||
case setMood(moodIndex: Int)
|
||
|
||
/// 性别
|
||
/// - Parameters:
|
||
/// - sex: 1 男 2 女
|
||
case setGender(sex: Int)
|
||
|
||
/// 紧急联系人
|
||
/// - Parameters:
|
||
/// - opType: get、add、del
|
||
/// - requestData:[String: Any] 根据操作传入对应的值
|
||
case emergencyContact(opType: String, requestData: [String: Any])
|
||
|
||
/// 删除账号
|
||
case deleteAccount
|
||
|
||
/// 退出登录
|
||
case logout
|
||
|
||
/// 发送快捷消息、表情
|
||
/// - Parameters:
|
||
/// - target_uid: 对方的user_id
|
||
/// - group_key:频道的key
|
||
/// - emote_idx:表情符号的下标
|
||
case sendEmote(emoteIdx: Int, groupKey: String, targetUid: String)
|
||
|
||
/// 公告
|
||
case notice
|
||
|
||
/// 查看关注用户列表
|
||
case followList
|
||
|
||
/// 设置气泡
|
||
/// - Parameters:
|
||
/// - enable:
|
||
/// - keep_time:
|
||
case bubble(enable: Bool, keep_time: Int)
|
||
|
||
/// 紧急人邮箱
|
||
case setEmail(email: String)
|
||
|
||
/// 关系列表
|
||
case relations
|
||
|
||
/// 消息列表
|
||
case mailboxList(page: Int, size: Int)
|
||
|
||
/// 消息详情、清空消息
|
||
case mailboxOperate(opType: String, id: Int?)
|
||
|
||
/// 意见反馈
|
||
case feedback(type: String, content: String, contact: String, images: [String])
|
||
}
|
||
|
||
extension UserAPI: MultiTargetProtocol {
|
||
|
||
var path: String {
|
||
switch self {
|
||
case .login:
|
||
return "api/user/login"
|
||
case .userInfo:
|
||
return "api/user"
|
||
case .userStatus:
|
||
return "mapi/user/status"
|
||
case .phoneUsageToday:
|
||
return "mapi/phone/usage/today"
|
||
case .phoneUsagePeriod:
|
||
return "mapi/phone/usage/period"
|
||
case .phoneUsageReport:
|
||
return "mapi/phone/usage/report"
|
||
case .phoneUsageTrips:
|
||
return "mapi/phone/usage/trips"
|
||
case .queryPhoneUsageIcon, .savePhoneUsageIcon:
|
||
return "mapi/phone/usage/icon"
|
||
case .phoneLockApp:
|
||
return "mapi/phone/lock/app"
|
||
case .phoneLockApps:
|
||
return "mapi/phone/lock/apps"
|
||
case .phoneLockAppsDelete:
|
||
return "mapi/phone/lock/apps/delete"
|
||
case .phoneLock:
|
||
return "mapi/phone/lock"
|
||
case .phoneLocked:
|
||
return "mapi/phone/locked"
|
||
case .requestPhoneUnlock, .phoneUnlockRequests:
|
||
return "mapi/phone/unlock/request"
|
||
case .phoneUnlock:
|
||
return "mapi/phone/unlock"
|
||
case .phoneUnlockAllow, .phoneUnlockAllowConfirm:
|
||
return "mapi/phone/unlock/allow"
|
||
case .imToken:
|
||
return "mapi/openim/user/token/get"
|
||
case .signInInfo:
|
||
return "mapi/user/signin"
|
||
case .changePhone, .changeAvater:
|
||
return "api/user"
|
||
case .setHeadPic:
|
||
return "mapi/user/setheadpic"
|
||
case .setNickName:
|
||
return "mapi/user/setnick"
|
||
case .setMood:
|
||
return "mapi/user/setmood"
|
||
case .setGender:
|
||
return "mapi/user/setsex"
|
||
case .emergencyContact:
|
||
return "mapi/user/emergencycontact"
|
||
case .deleteAccount:
|
||
return "mapi/user/account"
|
||
case .logout:
|
||
return "api/user/logout"
|
||
case .sendEmote:
|
||
return "mapi/user/sendemote"
|
||
case .notice:
|
||
return "api/user/notice"
|
||
case .followList:
|
||
return "mapi/user/followed"
|
||
case .bubble:
|
||
return "mapi/bubble/operate"
|
||
case .setEmail:
|
||
return "mapi/user/signin/setemail"
|
||
case .relations:
|
||
return "mapi/user/relations"
|
||
case .mailboxList:
|
||
return "mapi/user/mailbox/list"
|
||
case .mailboxOperate:
|
||
return "mapi/user/mailbox/operate"
|
||
case .feedback:
|
||
return "api/user/feedback"
|
||
}
|
||
}
|
||
|
||
var method: Moya.Method {
|
||
switch self {
|
||
case .userInfo, .userStatus, .phoneUsageToday, .phoneUsagePeriod, .phoneUsageReport, .phoneUsageTrips, .queryPhoneUsageIcon, .phoneLockApps, .phoneLocked, .phoneUnlockRequests, .phoneUnlockAllow, .signInInfo, .notice, .followList, .relations:
|
||
return .get
|
||
case .changePhone, .setGender, .changeAvater:
|
||
return .put
|
||
case .deleteAccount:
|
||
return .delete
|
||
default:
|
||
return .post
|
||
}
|
||
}
|
||
|
||
var task: Moya.Task {
|
||
switch self {
|
||
case let .login(type, bind, data):
|
||
var params = Parameters()
|
||
params["type"] = type
|
||
params["bind"] = bind
|
||
params["data"] = data
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case .userInfo:
|
||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||
|
||
case .userStatus:
|
||
return .requestPlain
|
||
|
||
case let .phoneUsageToday(userId, groupKey):
|
||
let params: Parameters = [
|
||
"user_id": userId,
|
||
"group_key": groupKey
|
||
]
|
||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||
|
||
case let .phoneUsagePeriod(userId, groupKey, period):
|
||
let params: Parameters = [
|
||
"user_id": userId,
|
||
"group_key": groupKey,
|
||
"period": period
|
||
]
|
||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||
|
||
case let .phoneUsageReport(userId, groupKey):
|
||
let params: Parameters = [
|
||
"user_id": userId,
|
||
"group_key": groupKey
|
||
]
|
||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||
|
||
case let .phoneUsageTrips(userId, date):
|
||
let params: Parameters = [
|
||
"user_id": userId,
|
||
"date": NSNumber(value: date),
|
||
"simplify": "true",
|
||
"include_events": "false"
|
||
]
|
||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||
|
||
case let .queryPhoneUsageIcon(package):
|
||
return .requestParameters(parameters: ["package": package], encoding: URLEncoding.queryString)
|
||
|
||
case let .savePhoneUsageIcon(package, icon):
|
||
return .requestParameters(
|
||
parameters: ["package": package, "icon": icon],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneLockApp(token, icon):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": "ios",
|
||
"token": token,
|
||
"icon": icon
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneLockApps(userId, groupKey):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"user_id": userId,
|
||
"group_key": groupKey
|
||
],
|
||
encoding: URLEncoding.queryString
|
||
)
|
||
|
||
case let .phoneLockAppsDelete(os, tokens):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": os,
|
||
"token": tokens.count > 0 ? tokens : ["cn.zuom8.jisuloca"]
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneLock(os, groupKey, userId, tokens, iconIndex, message):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": os,
|
||
"group_key": groupKey,
|
||
"user_id": userId,
|
||
"token": tokens,
|
||
"icon_index": iconIndex,
|
||
"message": message
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneLocked(os):
|
||
return .requestParameters(
|
||
parameters: ["os": os],
|
||
encoding: URLEncoding.queryString
|
||
)
|
||
|
||
case let .requestPhoneUnlock(os, groupKey, tokens):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": os,
|
||
"group_key": groupKey,
|
||
"token": tokens
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneUnlockRequests(os):
|
||
return .requestParameters(
|
||
parameters: ["os": os],
|
||
encoding: URLEncoding.queryString
|
||
)
|
||
|
||
case let .phoneUnlock(os, groupKey, userId, tokens):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": os,
|
||
"group_key": groupKey,
|
||
"user_id": userId,
|
||
"token": tokens
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .phoneUnlockAllow(os):
|
||
return .requestParameters(
|
||
parameters: ["os": os],
|
||
encoding: URLEncoding.queryString
|
||
)
|
||
|
||
case let .phoneUnlockAllowConfirm(os, groupKey, userId, tokens):
|
||
return .requestParameters(
|
||
parameters: [
|
||
"os": os,
|
||
"group_key": groupKey,
|
||
"user_id": userId,
|
||
"token": tokens
|
||
],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case .imToken:
|
||
var params = Parameters()
|
||
params["platform_id"] = 1
|
||
params["force"] = true
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case .signInInfo:
|
||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||
|
||
case let .changeAvater(url):
|
||
var params = Parameters()
|
||
params["avater"] = url
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .changePhone(timestamp, phone, code):
|
||
var params = Parameters()
|
||
params["phone_timestamp"] = timestamp
|
||
params["phone"] = phone
|
||
params["phone_code"] = code
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .setHeadPic(headPic):
|
||
var params = Parameters()
|
||
params["head_pic_index"] = headPic
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .setNickName(nick):
|
||
var params = Parameters()
|
||
params["nick"] = nick
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .setMood(moodIndex):
|
||
var params = Parameters()
|
||
params["mood_index"] = moodIndex
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .setGender(sex):
|
||
var params = Parameters()
|
||
params["sex"] = sex
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .emergencyContact(opType, requestData):
|
||
var params = Parameters()
|
||
params["op_type"] = opType
|
||
params.merge(requestData) { _, new in new }
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case .deleteAccount:
|
||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||
|
||
case .logout:
|
||
return .requestParameters(parameters: Parameters(), encoding: JSONEncoding())
|
||
|
||
case let .sendEmote(emoteIdx, groupKey, targetUid):
|
||
var params = Parameters()
|
||
params["emote_idx"] = emoteIdx
|
||
params["group_key"] = groupKey
|
||
params["target_uid"] = targetUid
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case .notice:
|
||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||
|
||
case .followList:
|
||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||
|
||
case let .bubble(enable, keep_time):
|
||
var params = Parameters()
|
||
params["enable"] = enable
|
||
if keep_time != -1 {
|
||
params["keep_time"] = keep_time
|
||
}
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .setEmail(email):
|
||
var params = Parameters()
|
||
params["email"] = email
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case .relations:
|
||
return .requestPlain
|
||
|
||
case let .mailboxList(page, size):
|
||
return .requestParameters(
|
||
parameters: ["page": page, "size": size],
|
||
encoding: JSONEncoding()
|
||
)
|
||
|
||
case let .mailboxOperate(opType, id):
|
||
var params: Parameters = ["op_type": opType]
|
||
if let id {
|
||
params["id"] = id
|
||
}
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
|
||
case let .feedback(type, content, contact, images):
|
||
let params: Parameters = [
|
||
"type": type,
|
||
"content": content,
|
||
"contact": contact,
|
||
"images": images
|
||
]
|
||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||
}
|
||
}
|
||
}
|