File storage models, the platform and recorder ports, and the service facade
Dependencies
async test "记录是意图加存储回填的字段,不是调用方自己拼的字符串" {
let draft = @model.FileInfo::draft("local-1", "uploads", "report", "pdf")
assert_eq(draft.url, "")
assert_eq(draft.original_filename, "report")
let stamped = draft.stamped(@model.Stamp::{
platform: None,
path: Some("uploads/2026/10/"),
url: Some("https://files.example.invalid/uploads/2026/10/report.pdf"),
size: Some(4096L),
create_time: Some(1760000000000L),
upload_id: None,
upload_status: None,
user_metadata: None,
})
assert_eq(stamped.ext, "pdf")
assert_eq(stamped.size, Some(4096L))
// 空着的 `platform` 沿用原值:一次只改想改的那几格。
assert_eq(stamped.platform, "local-1")
let keyed = @model.object_key("uploads", "a/b.txt")
assert_eq(keyed, "uploads/a/b.txt")
// ACL 只有三档,参考件那种"不认识的 ACL 返回 false"在这里构造不出来。
assert_eq(@model.CannedAcl::PublicRead.header_value(), "public-read")
assert_true(stamped != draft)
}moon add mldong/moon-file-storageInstall
Download zipFile storage models, the platform and recorder ports, and the service facade
Dependencies