tdm_server_rust/entity/oss.rs
1//! OSS 对象存储实体 (OSS Entities)
2//!
3//! 定义腾讯云 COS 对象存储相关的数据传输对象。
4//!
5//! ## 核心类型
6//!
7//! | 类型 | 用途 |
8//! |------|------|
9//! | `OssDto` | 封装文件上传/下载的完整参数(文件名、对象 Key、岗位等) |
10//! | `OssCredential` | 返回给前端的 STS 临时凭证 + 预签名上传 URL |
11//!
12//! ## 数据流
13//!
14//! ```text
15//! 前端请求上传 → OssService 生成 STS 策略 → 返回 OssCredential(预签名 URL)
16//! 前端直接 PUT 到 COS → 回调记录 OssDto → 写入 oss 表
17//! 下载时查询 oss 表 → 生成 CDN 鉴权 URL 或 COS 预签名下载链接
18//! ```
19
20use serde::{Deserialize, Serialize};
21
22/// OSS 文件传输对象
23///
24/// 封装单次文件上传/下载所需的信息。
25/// 包含文件名、对象存储 Key、关联的话数 ID 和岗位名称。
26///
27/// ## 字段说明
28///
29/// | 字段 | 数据库列 | 说明 |
30/// |------|----------|------|
31/// | `id` | `id` | 自增主键,插入前为 `None` |
32/// | `filename` | `filename` | 原始文件名(含后缀) |
33/// | `file_ext` | `fileExt` | 文件后缀,用于 Content-Type 匹配 |
34/// | `object_key` | `objectKey` | COS 上的对象路径 Key |
35/// | `url` | `url` | 下载 URL(CDN 鉴权或 COS 预签名) |
36/// | `episode_id` | `episodeId` | 关联的话数 ID |
37/// | `post_name` | `postName` | 岗位英文名,如 "translator"、"proofreader" |
38///
39/// ## 序列化
40///
41/// JSON 格式(camelCase),用于文件上传回调的请求体。
42///
43/// ## 对应 Java 类
44///
45/// Java `OssDTO`。
46#[derive(Debug, Clone, Deserialize, Serialize)]
47#[serde(rename_all = "camelCase")]
48pub struct OssDto {
49 /// OSS 记录主键,新增时为 `None`
50 pub id: Option<i32>,
51 /// 原始文件名(含后缀)
52 pub filename: String,
53 /// 文件后缀,如 "jpg"、"7z"
54 pub file_ext: Option<String>,
55 /// COS 对象 Key(存储路径)
56 pub object_key: Option<String>,
57 /// 下载 URL(CDN 鉴权或 COS 预签名)
58 pub url: Option<String>,
59 /// 关联的话数 ID
60 pub episode_id: i32,
61 /// 岗位英文名(translator / proofreader / letterer / timer)
62 pub post_name: String,
63}
64
65/// OSS STS 临时凭证 + 预签名上传 URL
66///
67/// 由 `OssService` 生成并返回给前端,前端凭此直接上传文件到 COS。
68///
69/// ## 字段说明
70///
71/// | 字段 | 说明 |
72/// |------|------|
73/// | `presigned_url` | COS 预签名上传 URL(含临时签名),前端 PUT 到此地址 |
74/// | `object_key` | COS 对象 Key,上传成功后前端回调时回传 |
75/// | `original_filename` | 原始文件名(服务端回显,前端可能修改) |
76///
77/// ## 安全性
78///
79/// - STS 临时密钥有效期由配置 `tencent.duration_seconds` 控制
80/// - 预签名 URL 通过 `build_put_policy` 限制单对象写入权限
81/// - 文件大小限制由策略 `content-length` 条件控制
82///
83/// ## 对应 Java 类
84///
85/// Java `OssCredential`。
86#[derive(Debug, Clone, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct OssCredential {
89 /// COS 预签名上传 URL(含临时签名和 x-cos-security-token)
90 pub presigned_url: String,
91 /// COS 对象存储 Key(上传后回调时需回传)
92 pub object_key: Option<String>,
93 /// 原始文件名(服务端回显)
94 pub original_filename: Option<String>,
95}