feat: media 域最小闭环——存储适配层 + MinIO 预签名两步上传(ADR-016/017,T3-03)
- ObjectStorage 适配层(供应商唯一缝)+ S3ObjectStorage(AWS SDK v2, path-style,内网/公网双端点分离签发);endpoint 未配置时服务可启动、 media 端点 500(沿 JWT 公钥先例) - POST /api/v1/media/uploads:白名单校验(purpose/mime/byteSize 全配置项) → uploading 行(objectKey 服务端生成不含用户输入)→ 预签名 PUT 凭据 (requiredHeaders 定型仅 Content-Type,TTL 10m) - complete:HEAD 校验存在性/大小/类型 → uploading→ready(guarded UPDATE 并发幂等);对象缺失保持 uploading 可重试,内容不符置 failed 终态; 防枚举 40405;新错误码 40405/42205 - 读取侧预签名 GET(TTL 1h),桶保持私有 - compose 纳入 minio 第六容器(镜像与 Testcontainer 同 tag,桶初始化走 应用启动 ensureBucket,三环境零分叉);init-secrets.sh 幂等追加 MinIO 根凭证到 .env(凭证零入库,ADR-021) - MediaUploadIntegrationTest 12 例:MinIO Testcontainer 全链路直传取回 + 六类失败路径 + 库层约束一致性;uploading 超时清理只记方案(报告 13 §6) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -71,6 +71,12 @@
|
||||
<version>0.12.6</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- ADR-016:对象存储适配层的 S3 兼容实现(自托管 MinIO / 迁云同一套代码)。
|
||||
版本经根 pom 的 awssdk bom 管理。 -->
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>s3</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
@@ -86,6 +92,13 @@
|
||||
<artifactId>postgresql</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- 媒体链路集成测试:MinIO Testcontainer,与 docker-compose 钉同一镜像
|
||||
tag(ADR-016 三环境零分叉),CI 无外部依赖。 -->
|
||||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
|
||||
Reference in New Issue
Block a user