feat: 新增用户信息获取功能及相关模型

- 在APIEndpoints.swift中新增getUserInfo端点以支持获取用户信息。
- 在APIModels.swift中实现获取用户信息请求和响应模型,处理用户信息的请求与解析。
- 在UserInfoManager中新增方法以从服务器获取用户信息,并在登录成功后自动获取用户信息。
- 在SettingFeature中新增用户信息刷新状态管理,支持用户信息的刷新操作。
- 在SettingView中集成用户信息刷新按钮,提升用户体验。
- 在SplashFeature中实现自动获取用户信息的逻辑,优化用户登录流程。
- 在yanaAPITests中添加用户信息相关的单元测试,确保功能的正确性。
This commit is contained in:
edwinQQQ
2025-07-23 11:46:46 +08:00
parent 8362142c49
commit 0fe3b6cb7a
10 changed files with 358 additions and 14 deletions

View File

@@ -22,6 +22,7 @@ enum APIEndpoint: String, CaseIterable {
case latestDynamics = "/dynamic/square/latestDynamics" //
case tcToken = "/tencent/cos/getToken" // COS Token
case publishFeed = "/dynamic/square/publish" //
case getUserInfo = "/user/get" //
// Web
case userAgreement = "/modules/rule/protocol.html"

View File

@@ -722,3 +722,124 @@ struct TcTokenData: Codable, Equatable {
}
}
// MARK: - User Info API Management
extension UserInfoManager {
///
/// - Parameters:
/// - uid: IDnil使ID
/// - apiService: API
/// - Returns: nil
static func fetchUserInfoFromServer(
uid: String? = nil,
apiService: APIServiceProtocol
) async -> UserInfo? {
// ID
let targetUid: String
if let uid = uid {
targetUid = uid
} else {
// 使ID
guard let currentUid = await getCurrentUserId() else {
debugErrorSync("❌ 无法获取用户信息:当前用户未登录")
return nil
}
targetUid = currentUid
}
debugInfoSync("👤 开始获取用户信息")
debugInfoSync(" 目标UID: \(targetUid)")
do {
let request = UserInfoHelper.createGetUserInfoRequest(uid: targetUid)
let response = try await apiService.request(request)
if response.isSuccess {
debugInfoSync("✅ 用户信息获取成功")
if let userInfo = response.data {
//
await saveUserInfo(userInfo)
debugInfoSync("💾 用户信息已保存到本地")
return userInfo
} else {
debugErrorSync("❌ 用户信息为空")
return nil
}
} else {
debugErrorSync("❌ 获取用户信息失败: \(response.errorMessage)")
return nil
}
} catch {
debugErrorSync("❌ 获取用户信息异常: \(error.localizedDescription)")
return nil
}
}
///
/// - Parameter apiService: API
/// - Returns:
static func refreshCurrentUserInfo(apiService: APIServiceProtocol) async -> Bool {
guard let currentUid = await getCurrentUserId() else {
debugErrorSync("❌ 无法刷新用户信息:当前用户未登录")
return false
}
debugInfoSync("🔄 开始刷新当前用户信息")
debugInfoSync(" 当前UID: \(currentUid)")
if let userInfo = await fetchUserInfoFromServer(uid: currentUid, apiService: apiService) {
debugInfoSync("✅ 用户信息刷新成功")
return true
} else {
debugErrorSync("❌ 用户信息刷新失败")
return false
}
}
///
/// - Parameters:
/// - uid: ID
/// - apiService: API
/// - forceRefresh: false
/// - Returns: nil
static func getUserInfoWithCache(
uid: String,
apiService: APIServiceProtocol,
forceRefresh: Bool = false
) async -> UserInfo? {
//
if !forceRefresh {
if let cachedUserInfo = await getUserInfo() {
debugInfoSync("📱 使用本地缓存的用户信息")
return cachedUserInfo
}
}
//
debugInfoSync("🌐 从服务器获取用户信息")
return await fetchUserInfoFromServer(uid: uid, apiService: apiService)
}
/// APP
/// - Parameter apiService: API
/// - Returns:
static func autoFetchUserInfoOnAppLaunch(apiService: APIServiceProtocol) async -> Bool {
//
let authStatus = await checkAuthenticationStatus()
guard authStatus.canAutoLogin else {
debugInfoSync("🔍 APP启动用户未登录跳过用户信息获取")
return false
}
//
if let cachedUserInfo = await getUserInfo() {
debugInfoSync("📱 APP启动使用现有用户信息缓存")
return true
}
//
debugInfoSync("🔄 APP启动自动获取用户信息")
return await refreshCurrentUserInfo(apiService: apiService)
}
}

View File

@@ -413,3 +413,66 @@ extension LoginHelper {
return EmailLoginRequest(email: encryptedEmail, code: code)
}
}
// MARK: - User Info API Models
///
struct GetUserInfoRequest: APIRequestProtocol {
typealias Response = GetUserInfoResponse
let endpoint = APIEndpoint.getUserInfo.path
let method: HTTPMethod = .GET
let includeBaseParameters = true
let queryParameters: [String: String]?
var bodyParameters: [String: Any]? { nil }
let timeout: TimeInterval = 30.0
let shouldShowLoading: Bool = false // loading
let shouldShowError: Bool = false //
///
/// - Parameter uid: ID
init(uid: String) {
self.queryParameters = [
"uid": uid
]
}
}
///
struct GetUserInfoResponse: Codable, Equatable {
let code: Int?
let message: String?
let timestamp: Int64?
let data: UserInfo?
///
var isSuccess: Bool {
return code == 200
}
///
var errorMessage: String {
return message ?? "获取用户信息失败,请重试"
}
}
// MARK: - User Info Helper
struct UserInfoHelper {
///
/// - Parameter uid: ID
/// - Returns: API
static func createGetUserInfoRequest(uid: String) -> GetUserInfoRequest {
return GetUserInfoRequest(uid: uid)
}
///
/// - Parameter uid: ID
static func debugGetUserInfoRequest(uid: String) {
debugInfoSync("👤 获取用户信息请求调试")
debugInfoSync(" UID: \(uid)")
debugInfoSync(" Endpoint: /user/get")
debugInfoSync(" Method: GET")
debugInfoSync(" Parameters: uid=\(uid)")
}
}