Files
suixinkan_ios_new/suixinkan/Features/TravelAlbum/API/TravelAlbumAPI.swift
汉秋 5e620623eb 对齐旅拍相册详情页 Android UI,并修复网格预览与布局问题。
重构相册详情为信息卡片、Tab 筛选、排序、批量删除与底部上传栏;修复网格重叠、禁用按钮蒙层,并支持点击预览大图。同步扩展素材列表 API 与 ViewModel 分页逻辑,并优化有线传图缩略图与传输性能。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 13:53:59 +08:00

147 lines
5.0 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.

//
// TravelAlbumAPI.swift
// suixinkan
//
// Created by Codex on 2026/6/29.
//
import Foundation
private let travelAlbumBase = "/api/yf-handset-app/photog/travel-album"
/// 便 ViewModel
@MainActor
protocol TravelAlbumServing {
func availableOrders() async throws -> [TravelAlbumAvailableOrder]
func createAlbum(_ request: TravelAlbumCreateRequest) async throws -> TravelAlbumCreateResponse
func albumList(page: Int, pageSize: Int) async throws -> ListPayload<TravelAlbumItem>
func albumInfo(id: Int) async throws -> TravelAlbumItem
func editAlbum(_ request: TravelAlbumEditRequest) async throws
func deleteAlbum(_ request: TravelAlbumDeleteRequest) async throws
func materialList(
userEquityTravelId: Int,
page: Int,
pageSize: Int,
orderBy: Int,
isPurchased: Int?
) async throws -> ListPayload<TravelAlbumMaterial>
func uploadMaterial(_ request: TravelAlbumUploadMaterialRequest) async throws -> TravelAlbumMaterial
func deleteMaterial(_ request: TravelAlbumDeleteMaterialRequest) async throws
func mpCode(id: Int) async throws -> TravelAlbumMpCodeResponse
}
/// API travel-album
@MainActor
final class TravelAlbumAPI: TravelAlbumServing {
private let client: APIClient
/// API
init(client: APIClient) {
self.client = client
}
///
func availableOrders() async throws -> [TravelAlbumAvailableOrder] {
try await client.send(
APIRequest(method: .get, path: "\(travelAlbumBase)/available-order")
)
}
///
func createAlbum(_ request: TravelAlbumCreateRequest) async throws -> TravelAlbumCreateResponse {
try await client.send(
APIRequest(method: .post, path: "\(travelAlbumBase)/create", body: request)
)
}
///
func albumList(page: Int, pageSize: Int) async throws -> ListPayload<TravelAlbumItem> {
try await client.send(
APIRequest(
method: .get,
path: "\(travelAlbumBase)/list",
queryItems: [
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))")
]
)
)
}
///
func albumInfo(id: Int) async throws -> TravelAlbumItem {
try await client.send(
APIRequest(
method: .get,
path: "\(travelAlbumBase)/info",
queryItems: [URLQueryItem(name: "id", value: "\(id)")]
)
)
}
///
func editAlbum(_ request: TravelAlbumEditRequest) async throws {
_ = try await client.send(
APIRequest(method: .post, path: "\(travelAlbumBase)/edit", body: request)
) as EmptyPayload
}
///
func deleteAlbum(_ request: TravelAlbumDeleteRequest) async throws {
_ = try await client.send(
APIRequest(method: .post, path: "\(travelAlbumBase)/delete", body: request)
) as EmptyPayload
}
///
func materialList(
userEquityTravelId: Int,
page: Int,
pageSize: Int,
orderBy: Int = 2,
isPurchased: Int? = nil
) async throws -> ListPayload<TravelAlbumMaterial> {
var queryItems = [
URLQueryItem(name: "user_equity_travel_id", value: "\(userEquityTravelId)"),
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))"),
URLQueryItem(name: "order_by", value: "\(max(orderBy, 1))")
]
if let isPurchased {
queryItems.append(URLQueryItem(name: "is_purchased", value: "\(isPurchased)"))
}
return try await client.send(
APIRequest(
method: .get,
path: "\(travelAlbumBase)/material-list",
queryItems: queryItems
)
)
}
/// OSS
func uploadMaterial(_ request: TravelAlbumUploadMaterialRequest) async throws -> TravelAlbumMaterial {
try await client.send(
APIRequest(method: .post, path: "\(travelAlbumBase)/upload-material", body: request)
)
}
///
func deleteMaterial(_ request: TravelAlbumDeleteMaterialRequest) async throws {
_ = try await client.send(
APIRequest(method: .post, path: "\(travelAlbumBase)/delete-material", body: request)
) as EmptyPayload
}
///
func mpCode(id: Int) async throws -> TravelAlbumMpCodeResponse {
try await client.send(
APIRequest(
method: .get,
path: "\(travelAlbumBase)/mp-code",
queryItems: [URLQueryItem(name: "id", value: "\(id)")]
)
)
}
}