Files
e-party-iOS/yana/APIs/DynamicsModels.swift
edwinQQQ 8b4eb9cb7e feat: 更新API相关逻辑及视图结构
- 在Info.plist中新增API签名密钥配置。
- 将Splash视图替换为SplashV2,优化启动逻辑和用户体验。
- 更新API请求中的User-Agent逻辑,使用UserAgentProvider提供的动态值。
- 在APILogger中添加敏感信息脱敏处理,增强安全性。
- 新增CreateFeedPage视图,支持用户发布动态功能。
- 更新MainPage和Splash视图的导航逻辑,整合统一的AppRoute管理。
- 移除冗余的SplashFeature视图,提升代码整洁性和可维护性。
2025-09-17 16:37:21 +08:00

425 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.

import Foundation
// MARK: -
///
struct MomentsLatestResponse: Codable, Equatable, Sendable {
let code: Int
let message: String
let data: MomentsListData?
let timestamp: Int?
}
///
struct MomentsListData: Codable, Equatable, Sendable {
let dynamicList: [MomentsInfo]
let nextDynamicId: Int
}
///
public struct MomentsInfo: Codable, Equatable, Sendable {
let dynamicId: Int
let uid: Int
let nick: String
let avatar: String
let type: Int
let content: String
let likeCount: Int
let isLike: Bool
let commentCount: Int
let publishTime: Int
let worldId: Int
let status: Int
// data.md
let playCount: Int?
let dynamicResList: [MomentsPicture]?
//
let gender: Int?
let squareTop: Int?
let topicTop: Int?
let newUser: Bool?
let defUser: Int?
let scene: String?
let userVipInfoVO: UserVipInfo?
let headwearPic: String?
let headwearEffect: String?
let headwearType: Int?
let headwearName: String?
let headwearId: Int?
let experLevelPic: String?
let charmLevelPic: String?
let isCustomWord: Bool?
let labelList: [String]?
//
var isSquareTop: Bool { (squareTop ?? 0) != 0 }
var isTopicTop: Bool { (topicTop ?? 0) != 0 }
var formattedPublishTime: Date {
Date(timeIntervalSince1970: TimeInterval(publishTime) / 1000.0)
}
}
///
struct MomentsPicture: Codable, Equatable, Sendable {
let id: Int?
let resUrl: String?
let format: String?
let width: Int?
let height: Int?
let resDuration: Int? //
}
/// VIP -
struct UserVipInfo: Codable, Equatable, Sendable {
let vipLevel: Int?
let vipName: String?
let vipIcon: String?
let vipLogo: String?
let nameplateId: Int?
let nameplateUrl: String?
let userCardBG: String?
let expireTime: Int?
let preventKick: Bool?
let preventTrace: Bool?
let preventFollow: Bool?
let micNickColour: String?
let micCircle: String?
let enterRoomEffects: String?
let medalSeat: Int?
let friendNickColour: String?
let visitHide: Bool?
let visitListView: Bool?
let privateChatLimit: Bool?
let roomPicScreen: Bool?
let uploadGifAvatar: Bool?
let enterHide: Bool?
}
// MARK: -
///
enum MomentsContentType: Int, CaseIterable {
case text = 0 //
case picture = 2 //
/// API
static func toAPIParameter(_ types: [MomentsContentType]) -> String {
return types.map { String($0.rawValue) }.joined(separator: ",")
}
}
// MARK: - API
/// API
struct LatestDynamicsRequest: APIRequestProtocol {
typealias Response = MomentsLatestResponse
let endpoint: String = APIEndpoint.latestDynamics.path
let method: HTTPMethod = .GET
let dynamicId: String
let pageSize: Int
let types: [MomentsContentType]
///
/// - Parameters:
/// - dynamicId: ID
/// - pageSize: 20
/// - types:
init(
dynamicId: String = "",
pageSize: Int = 20,
types: [MomentsContentType] = [.text, .picture]
) {
self.dynamicId = dynamicId
self.pageSize = pageSize
self.types = types
}
var queryParameters: [String: String]? {
return [
"dynamicId": dynamicId,
"pageSize": String(pageSize),
"types": MomentsContentType.toAPIParameter(types)
]
}
var bodyParameters: [String: Any]? { nil }
var includeBaseParameters: Bool { true }
// Loading
var shouldShowLoading: Bool { true }
var shouldShowError: Bool { true }
}
// MARK: - API
///
struct ResListItem: Codable, Equatable {
let resUrl: String
let width: Int
let height: Int
let format: String
}
///
struct PublishFeedRequest: APIRequestProtocol {
typealias Response = PublishFeedResponse
let endpoint: String = APIEndpoint.publishFeed.path
let method: HTTPMethod = .POST
let content: String
let uid: String
let type: String
var pub_sign: String
let resList: [ResListItem]?
var queryParameters: [String: String]? { nil }
var bodyParameters: [String: Any]? {
var params: [String: Any] = [
"content": content,
"uid": uid,
"type": type,
"pub_sign": pub_sign
]
if let resList = resList, !resList.isEmpty {
params["resList"] = resList.map { [
"resUrl": $0.resUrl,
"width": $0.width,
"height": $0.height,
"format": $0.format
] }
}
return params
}
var includeBaseParameters: Bool { true }
var shouldShowLoading: Bool { true }
var shouldShowError: Bool { true }
/// async 线 pub_sign
static func make(content: String, uid: String, type: String = "0", resList: [ResListItem]? = nil) async -> PublishFeedRequest {
let base = await MainActor.run { BaseRequest() }
var mutableBase = base
mutableBase.generateSignature(with: [
"content": content,
"uid": uid,
"type": type
])
return PublishFeedRequest(
content: content,
uid: uid,
type: type,
pub_sign: mutableBase.pubSign,
resList: resList
)
}
///
private init(content: String, uid: String, type: String, pub_sign: String, resList: [ResListItem]?) {
self.content = content
self.uid = uid
self.type = type
self.pub_sign = pub_sign
self.resList = resList
}
}
///
struct PublishFeedResponse: Codable, Equatable {
let code: Int
let message: String
let data: PublishFeedData?
let timestamp: Int?
}
///
struct PublishFeedData: Codable, Equatable {
let dynamicId: Int?
}
// MARK: - API
/// - /dynamic/getMyDynamic
struct MyMomentInfo: Codable, Equatable, Sendable {
let content: String
let uid: Int
let publishTime: Int64
let type: Int
// MomentsInfo
func toMomentsInfo() -> MomentsInfo {
return MomentsInfo(
dynamicId: 0, // dynamicId
uid: uid,
nick: "", //
avatar: "", //
type: type,
content: content,
likeCount: 0, //
isLike: false, //
commentCount: 0, //
publishTime: Int(publishTime / 1000), //
worldId: 0, // worldId
status: 1, //
playCount: nil,
dynamicResList: nil,
gender: nil,
squareTop: nil,
topicTop: nil,
newUser: nil,
defUser: nil,
scene: nil,
userVipInfoVO: nil,
headwearPic: nil,
headwearEffect: nil,
headwearType: nil,
headwearName: nil,
headwearId: nil,
experLevelPic: nil,
charmLevelPic: nil,
isCustomWord: nil,
labelList: nil
)
}
}
///
struct MyMomentsResponse: Codable, Equatable, Sendable {
let code: Int
let message: String
let data: [MyMomentInfo]?
let timestamp: Int64?
}
struct GetMyDynamicRequest: APIRequestProtocol {
typealias Response = MyMomentsResponse
let endpoint: String = APIEndpoint.getMyDynamic.path
let method: HTTPMethod = .POST
let fromUid: Int
let uid: Int
let page: Int
let pageSize: Int
init(fromUid: Int, uid: Int, page: Int = 1, pageSize: Int = 20) {
self.fromUid = fromUid
self.uid = uid
self.page = page
self.pageSize = pageSize
}
var queryParameters: [String: String]? {
[
"fromUid": String(fromUid),
"uid": String(uid),
"page": String(page),
"pageSize": String(pageSize)
]
}
var bodyParameters: [String: Any]? { nil }
var includeBaseParameters: Bool { true }
var shouldShowLoading: Bool { true }
var shouldShowError: Bool { true }
}
// MARK: - API
///
struct LikeDynamicResponse: Codable, Equatable, Sendable {
let code: Int
let message: String
let data: LikeDynamicData?
let timestamp: Int?
}
///
struct LikeDynamicData: Codable, Equatable, Sendable {
let success: Bool?
let likeCount: Int?
}
///
struct LikeDynamicRequest: APIRequestProtocol {
typealias Response = LikeDynamicResponse
let endpoint: String = APIEndpoint.dynamicLike.path
let method: HTTPMethod = .POST
let dynamicId: Int
let uid: Int
let status: Int // 0: , 1:
let likedUid: Int
let worldId: Int
init(dynamicId: Int, uid: Int, status: Int, likedUid: Int, worldId: Int) {
self.dynamicId = dynamicId
self.uid = uid
self.status = status
self.likedUid = likedUid
self.worldId = worldId
}
var bodyParameters: [String: Any]? { nil }
var queryParameters: [String: String]? {
return [
"dynamicId": String(dynamicId),
"uid": String(uid),
"status": String(status),
"likedUid": String(likedUid),
"worldId": String(worldId)
]
}
var includeBaseParameters: Bool { true }
var shouldShowLoading: Bool { true }
var shouldShowError: Bool { true }
}
// MARK: - API
///
struct DeleteDynamicResponse: Codable, Equatable, Sendable {
let code: Int
let message: String
let data: DeleteDynamicData?
let timestamp: Int?
}
///
struct DeleteDynamicData: Codable, Equatable, Sendable {
let success: Bool?
}
///
struct DeleteDynamicRequest: APIRequestProtocol {
typealias Response = DeleteDynamicResponse
let endpoint: String = APIEndpoint.deleteDynamic.path
let method: HTTPMethod = .POST
let dynamicId: Int
let uid: Int
init(dynamicId: Int, uid: Int) {
self.dynamicId = dynamicId
self.uid = uid
}
var queryParameters: [String: String]? { nil }
var bodyParameters: [String: Any]? {
return [
"dynamicId": dynamicId,
"uid": uid
]
}
var includeBaseParameters: Bool { true }
var shouldShowLoading: Bool { true }
var shouldShowError: Bool { true }
}