// packages/storage/src/keys.ts —— 对象键布局的跨服务权威段(P4a Task 3 起)。 // 此前 OBJECT_KEY_ROOT 在 api uploads/support.ts 与 worker publish.service.ts // 各持一份字面量;水印引入第三处消费方(ov 公开侧模式键推导,无任何 DB 行可 // 依赖),收敛到存储包单一出处,杜绝多环境前缀化时(P5)三处漂移。 // P1a 单环境(env=dev)硬编码;多环境前缀化属 P5 部署事项。 /** 对象键根(与各 test/reset.ts 的 MinIO 清理前缀一致)。 */ export const OBJECT_KEY_ROOT = 'photo-live/dev'; /** photo_variants 变体名(与 db-cn photo_variants.variant 取值一致)。 */ export type PhotoVariantName = 'thumb' | 'browse' | 'watermark'; /** 变体对象键(worker 写入位 / ov 模式键推导位,同一实现)。 */ export function variantsObjectKey( albumId: string, photoId: string, version: number, variant: PhotoVariantName, ): string { return `${OBJECT_KEY_ROOT}/albums/${albumId}/variants/${photoId}/${version}/${variant}.jpg`; } /** * 水印变体键的便捷推导(P4a Task 3 ov 侧核心约定):键由 (albumId, photoId, * configVersion) 确定性构成——ov 副本不逐照片同步变体键,公开侧按相册有效 * watermarkConfigVersion 直接推导(对象存在性由 cn 侧有效版本语义保证,见 * packages/contracts/src/watermark.ts)。 */ export function watermarkVariantObjectKey( albumId: string, photoId: string, configVersion: number, ): string { return variantsObjectKey(albumId, photoId, configVersion, 'watermark'); }