// // 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()) } } }