字段添加评审
storagePluginId
建议保留。
它表示“这个照片由哪个插件实现负责”,和 storageSourceId 不是一回事:
- storageSourceId:具体的存储源实例
- storagePluginId:该存储源使用的插件
不能安全复用 storageProvider:
- 旧值是 local、github、s3
- 当前桌面上传代码虽然暂时把插件 ID 写进了 storageProvider,这是兼容性复用,不是稳定契约
- Web 端仍会把 storageProvider 当作 provider 类型使用
- 同一个 S3 类型可能存在多个不同插件实现
如果以后切换插件、审计插件来源或判断插件兼容性,没有 storagePluginId 会缺少明确记录。
thumbnailStorageKey
建议保留。
现有 thumbnailUrl 不能完全替代它:
- Web 旧存储可以根据 storageKey 推导缩略图 key
- 插件上传的是两个独立对象,缩略图 key 不保证遵循旧的文件名规则
- URL 可能是签名 URL、临时 URL,不能可靠地从 URL 反推对象 key
- 当前 Desktop 删除照片时已经优先使用该字段,/D:/Projects/mo-gallery/mo-gallery-web/desktop/app.go:613
- Web 存储清理保护逻辑也已经查询该字段,/D:/Projects/mo-gallery/mo-gallery-web/hono/storage.ts:159
因此这个字段是实际对象操作所需的,不只是冗余缓存。
storageUrlType
当前版本可以不加。
它的用途是区分:
public
但当前 Desktop 插件上传代码明确拒绝非 public URL:
桌面存储插件必须返回稳定的 public URL
对应逻辑在 /D:/Projects/mo-gallery/mo-gallery-web/desktop/services/upload.go:562 和 /D:/Projects/mo-gallery/mo-gallery-web/ desktop/services/upload.go:590。
目前系统也没有根据 storageUrlType 做 URL 刷新或访问策略判断。现阶段所有已接受的插件照片都应该是稳定公开 URL,因此这列暂时没有实 际行为价值。
storageUrlExpiresAt
它只有在允许 signed 或 temporary URL 时才有意义,用于判断 URL 何时需要通过插件重新生成。
目前:
- 非公开 URL 会在上传阶段被拒绝
- 没有 URL 自动刷新逻辑
- url 和 thumbnailUrl 都没有分别记录过期时间
所以现在加这列只是提前为尚未实现的能力留字段。
而且未来如果原图和缩略图可能有不同过期时间,单独一个 storageUrlExpiresAt 也未必是最终最好的模型。
推荐的初始迁移
我建议把初版迁移缩减为:
ALTER TABLE “Photo” ADD COLUMN “storageRuntime” TEXT NOT NULL DEFAULT ‘web’, ADD COLUMN “storagePluginId” TEXT, ADD COLUMN “thumbnailStorageKey” TEXT;
保留:
- storageRuntime
- storagePluginId
- thumbnailStorageKey
暂时删除:
- storageUrlType
- storageUrlExpiresAt
同时:
- storageRuntime 的规范值改为 web | plugin
- 旧照片回填为 storageRuntime = ‘web’
- 旧照片的 storagePluginId 和 thumbnailStorageKey 保持 NULL
- Desktop 插件上传登记时不再提交两个 URL 字段
- API DTO、Go DTO、Prisma schema 和文档同步移除这两个字段
如果以后真正支持签名 URL 或临时 URL,再单独增加一次迁移,并同时实现:
- URL 刷新机制
- 过期判断
- 原图与缩略图的 URL 生命周期
- Web 展示和 Desktop 代理策略
- 相关测试
这样数据库字段和实际行为是一致的,不会先存一组当前没有消费者的数据。a
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!