Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs. Co-authored-by: Cursor <cursoragent@cursor.com>
64 lines
1.8 KiB
Swift
64 lines
1.8 KiB
Swift
//
|
||
// TravelAlbumMaterialUploader.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/29.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 旅拍相册素材上传器,实现 OSS 上传 + 后端 upload-material 登记。
|
||
@MainActor
|
||
final class TravelAlbumMaterialUploader: CameraAssetUploadSink {
|
||
private let api: any TravelAlbumServing
|
||
private let ossService: any OSSUploadServing
|
||
private let albumID: Int
|
||
private let scenicID: Int
|
||
|
||
/// 初始化上传器,注入 API、OSS 与业务上下文。
|
||
init(api: any TravelAlbumServing, ossService: any OSSUploadServing, albumID: Int, scenicID: Int) {
|
||
self.api = api
|
||
self.ossService = ossService
|
||
self.albumID = albumID
|
||
self.scenicID = scenicID
|
||
}
|
||
|
||
/// 上传本地文件到 OSS 并登记到旅拍相册。
|
||
func upload(
|
||
localURL: URL,
|
||
fileName: String,
|
||
fileType: Int,
|
||
progress: @escaping @Sendable (Int) -> Void
|
||
) async throws -> String {
|
||
guard albumID > 0 else {
|
||
throw APIError.serverCode(0, "请先选择有效的相册")
|
||
}
|
||
guard FileManager.default.fileExists(atPath: localURL.path) else {
|
||
throw APIError.serverCode(0, "相机文件读取失败")
|
||
}
|
||
|
||
let data = try Data(contentsOf: localURL)
|
||
guard !data.isEmpty else {
|
||
throw APIError.serverCode(0, "相机文件读取失败")
|
||
}
|
||
|
||
let remoteURL = try await ossService.uploadAlbumFile(
|
||
data: data,
|
||
fileName: fileName,
|
||
fileType: fileType,
|
||
scenicId: scenicID,
|
||
onProgress: progress
|
||
)
|
||
|
||
_ = try await api.uploadMaterial(
|
||
TravelAlbumUploadMaterialRequest(
|
||
userEquityTravelId: albumID,
|
||
fileName: fileName,
|
||
fileURL: remoteURL
|
||
)
|
||
)
|
||
|
||
return remoteURL
|
||
}
|
||
}
|