feat(assets): album asset status — show current banner/cover/logo in admin branding tab

- 契约 listAlbumAssetStatus(GET /albums/{albumId}/assets):每 (kind,locale)
  最新 effective 行 + 现签 URL;权限同详情(可见即读);deleted → 404
- 服务端 AssetsService.status(createdAt,id DESC 组内取首;presignGet 现签)
- Admin 品牌资产页签改造:进入即加载现状——三种 kind 卡片(预览图/未设置
  空态/设置时间),banner 分全局/zh/en 槽位;上传成功自动刷新(替换语义)
- API 56/56、admin 87/87 + build 全绿

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-23 10:51:53 +08:00
parent d678c8d38d
commit 2618ad3163
14 changed files with 711 additions and 28 deletions
@@ -9,11 +9,13 @@ import {
Controller,
HttpCode,
HttpStatus,
Get,
Param,
Post,
Req,
UseGuards,
} from '@nestjs/common';
import type { components } from '@photo/contracts';
import { AuthenticatedRequest, SessionGuard } from '../auth/session.guard';
import { userOf } from './albums.controller';
import { AssetInitRequestDto } from './dto';
@@ -29,6 +31,14 @@ export class AssetsController {
constructor(private readonly assetsService: AssetsService) {}
/** 契约 201:会话行已建(每次 init 新行新键,无幂等键)。 */
@Get()
listStatus(
@Param('albumId') albumId: string,
@Req() req: AuthenticatedRequest,
): Promise<components['schemas']['AssetStatusResponse']> {
return this.assetsService.status(userOf(req), albumId);
}
@Post()
initAlbumAssetUpload(
@Param('albumId') albumId: string,