Files
photo-live/packages/contracts/src/generated/openapi.d.ts
T
浅念 f6448bd006 fix(contracts): quality review fixes for p1a contracts
- status enum active|archived -> active|offline (align requirement docs)
- UploadSessionState session-state semantics documented (no failed state)
- maxLength: clientTaskId 128 / filename 255 / cursor 512
- PublicPhoto width/height required (layout placeholders)
- reusable Unauthorized/InternalError responses (hybrid with inline op-specific codes)
- PublicAlbum.translations -> translation (single resolved object)
- contentType enum [jpeg/png/heic] (heic provisional pending G2)
- minLength 1 on title/name; publicToken pattern ^[0-9a-z]{20,32}$
- CursorPageMeta hasMore/nextCursor invariant documented
- public locale: silent fallback to defaultLocale (tech doc section 11)
- plan: upload_sessions state comment aligned; P1b adds management photo list + account lookup endpoints

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-17 18:06:54 +08:00

1918 lines
67 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* This file was auto-generated by openapi-typescript.
* Do not make direct changes to the file.
*/
export interface paths {
"/auth/password": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 密码登录
* @description 校验账号密码,签发会话令牌。
*/
post: operations["loginWithPassword"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/refresh": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 会话滑动续期
* @description 携带有效 Bearer 令牌滑动续期,返回新的过期时间。
*/
post: operations["refreshSession"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/logout": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 退出登录
* @description 使当前 Bearer 令牌失效。
*/
post: operations["logout"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/albums": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* 相册列表
* @description 当前用户可见(参与)的相册列表;管理员可见全部。按创建时间倒序。
*/
get: operations["listAlbums"];
put?: never;
/**
* 创建相册
* @description 创建相册并写入多语言内容;创建者自动成为 owner 成员。
* 初始默认值:uploadEnabled/publicEnabled/downloadEnabled=true、
* originalDownloadEnabled=false、status=active、watermarkVersion=0。
*/
post: operations["createAlbum"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/albums/{albumId}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
/**
* 相册详情
* @description 相册完整配置、多语言内容与分类列表。
*/
get: operations["getAlbum"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/**
* 更新相册配置
* @description 部分更新:仅提交的字段被修改,各开关互相独立。
* translations 为全量替换(须包含 defaultLocale 对应条目)。
*/
patch: operations["updateAlbum"];
trace?: never;
};
"/albums/{albumId}/members": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
/**
* 相册成员列表
* @description 相册全部成员(含 owner)。
*/
get: operations["listAlbumMembers"];
put?: never;
/**
* 添加相册成员
* @description 将已开通的同事添加为协作者;仅创建者或管理员可操作。
*/
post: operations["addAlbumMember"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/albums/{albumId}/members/{userId}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
/** @description 用户 ID。 */
userId: components["parameters"]["UserId"];
};
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* 移除相册成员
* @description 移除协作者;仅创建者或管理员可操作。不能移除创建者(403)。
* 目标成员不存在时幂等返回 204。
*/
delete: operations["removeAlbumMember"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/albums/{albumId}/categories": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 创建分类
* @description 在相册下创建分类;仅创建者或管理员可操作。
*/
post: operations["createCategory"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/categories/{categoryId}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 分类 ID。 */
categoryId: components["parameters"]["CategoryId"];
};
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* 删除分类
* @description 删除分类(分类下仍有照片时是否允许删除由服务端策略决定,400 拒绝)。
*/
delete: operations["deleteCategory"];
options?: never;
head?: never;
/**
* 更新分类
* @description 部分更新;translations 为全量替换。
*/
patch: operations["updateCategory"];
trace?: never;
};
"/uploads": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* 上传会话记录
* @description 当前用户的上传会话历史(新在前),用于任务队列恢复与状态展示。
*/
get: operations["listUploads"];
put?: never;
/**
* 初始化上传任务
* @description 幂等初始化:预创建上传会话与照片 ID,返回 staging 对象的临时直传凭证。
* 相同 clientTaskId 且参数一致时返回原会话,不重复创建照片;
* 参数不一致时返回 409(UPLOAD_SESSION_CONFLICT)。
*/
post: operations["initUpload"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/uploads/{uploadId}/renew": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 上传会话 ID。 */
uploadId: components["parameters"]["UploadId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 续签上传凭证
* @description 为仍处于 pending 状态的会话重新签发直传凭证(结构同初始化响应)。
*/
post: operations["renewUploadCredential"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/uploads/{uploadId}/complete": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 上传会话 ID。 */
uploadId: components["parameters"]["UploadId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 完成核验
* @description 核验 staging 对象(存在性、字节数与可用完整性信息)后进入处理流水线。
* 幂等:核验通过的会话重复调用返回相同结果。
*/
post: operations["completeUpload"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/photos/{photoId}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 照片 ID。 */
photoId: components["parameters"]["PhotoId"];
};
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* 软删除照片
* @description 标记 deleted(软删除),公开端点即刻不可见;物理删除走独立运维流程。
*/
delete: operations["deletePhoto"];
options?: never;
head?: never;
/**
* 调整照片可见性
* @description 在 hidden 与 published 间切换(隐藏/恢复发布);按相册角色与上传人共同判定权限。
*/
patch: operations["updatePhoto"];
trace?: never;
};
"/public/albums/{token}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
};
cookie?: never;
};
/**
* 公开相册信息
* @description 观众页入口:按「请求 locale → defaultLocale」回退解析为单语言对象。
* publicToken 不可枚举,但持有链接者均可访问。
*/
get: operations["getPublicAlbum"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/albums/{token}/photos": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
};
cookie?: never;
};
/**
* 公开照片列表
* @description 仅返回公开相册中 published 的照片,按 publishedAt 与 ID 稳定倒序游标分页。
* 签名 URL 为短期凭证,过期后凭同一入口刷新。
*/
get: operations["listPublicPhotos"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/public/albums/{token}/photos/{photoId}": {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
/** @description 照片 ID。 */
photoId: components["parameters"]["PhotoId"];
};
cookie?: never;
};
/**
* 公开单图
* @description 深度链接定位单图,同时作为签名 URL 过期后的刷新入口。
* 服务端校验相册与照片归属;隐藏/删除后的旧链接返回 404。
*/
get: operations["getPublicPhoto"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
}
export type webhooks = Record<string, never>;
export interface components {
schemas: {
Error: {
/**
* @description 稳定错误码,与 src/errors.ts 的 ErrorCodes 一一对应。
* @enum {string}
*/
readonly code: "AUTH_INVALID_CREDENTIALS" | "AUTH_TOKEN_EXPIRED" | "AUTH_FORBIDDEN" | "ALBUM_NOT_FOUND" | "ALBUM_NOT_PUBLIC" | "ALBUM_UPLOAD_DISABLED" | "MEMBER_CONFLICT" | "UPLOAD_SESSION_CONFLICT" | "UPLOAD_VERIFY_FAILED" | "PHOTO_NOT_FOUND" | "PHOTO_NOT_PUBLIC" | "VALIDATION_FAILED" | "INTERNAL_ERROR";
/** @description 服务器生成的可读消息(诊断用,不作为客户端展示文案依据)。 */
readonly message: string;
/** @description 请求追踪 ID。 */
readonly requestId: string;
};
/** @description 游标分页元信息;各列表响应以 allOf 内嵌本结构(条目 schema 在业务端点中定义)。不变式:hasMore=true 当且仅当 nextCursor≠null,两者必须成对填充。 */
CursorPageMeta: {
/** @description 下一页游标;null 表示没有更多数据。 */
readonly nextCursor: string | null;
/** @description 是否还有下一页。 */
readonly hasMore: boolean;
};
/**
* @description P1a 支持的语言。
* @enum {string}
*/
Locale: "zh-CN" | "en";
LoginRequest: {
/** @description 账号(用户名或邮箱)。 */
account: string;
/** @description 密码。 */
password: string;
};
LoginResponse: {
/** @description 会话令牌(Bearer)。 */
readonly sessionToken: string;
/**
* Format: date-time
* @description 会话过期时间。
*/
readonly expiresAt: string;
};
RefreshResponse: {
/**
* Format: date-time
* @description 续期后的过期时间。
*/
readonly expiresAt: string;
};
/** @description 相册多语言条目(创建/更新与响应共用;未填的可选字段存储为 null)。 */
AlbumTranslation: {
locale: components["schemas"]["Locale"];
/** @description 相册标题。 */
title: string;
/** @description 相册描述。 */
description?: string | null;
/** @description 场地名称。 */
venue?: string | null;
/** @description 场地地址。 */
address?: string | null;
};
AlbumCreateRequest: {
/** @description 多语言内容;必须包含 defaultLocale 对应条目。 */
translations: components["schemas"]["AlbumTranslation"][];
defaultLocale: components["schemas"]["Locale"];
/**
* Format: date-time
* @description 活动开始时间(UTC 存储,展示按 timezone)。
*/
startAt: string;
/**
* Format: date-time
* @description 活动结束时间;null 或缺省表示未定。
*/
endAt?: string | null;
/**
* @description 活动 IANA 时区。
* @default Asia/Shanghai
* @example Asia/Shanghai
*/
timezone: string;
/**
* @description 允许下载浏览版本。
* @default true
*/
downloadEnabled: boolean;
/**
* @description 允许下载原图。
* @default false
*/
originalDownloadEnabled: boolean;
};
/** @description 部分更新:仅提交的字段被修改,各开关互相独立;endAt 传 null 清除。 */
AlbumUpdateRequest: {
/** @description 全量替换多语言内容;须包含 defaultLocale 对应条目。 */
translations?: components["schemas"]["AlbumTranslation"][];
defaultLocale?: components["schemas"]["Locale"];
/**
* Format: date-time
* @description 活动开始时间。
*/
startAt?: string;
/**
* Format: date-time
* @description 活动结束时间;null 清除。
*/
endAt?: string | null;
/** @description 活动 IANA 时区。 */
timezone?: string;
/** @description 是否允许新上传任务。 */
uploadEnabled?: boolean;
/** @description 是否公开可见。 */
publicEnabled?: boolean;
/** @description 允许下载浏览版本。 */
downloadEnabled?: boolean;
/** @description 允许下载原图。 */
originalDownloadEnabled?: boolean;
};
/** @description 相册列表条目(完整开关与多语言标题,管理列表无需二次请求详情)。 */
AlbumSummary: {
/** @description 相册 ID。 */
readonly id: string;
/** @description 公开访问令牌(不可枚举)。 */
readonly publicToken: string;
/** @description 创建者用户 ID。 */
readonly ownerId: string;
/**
* @description 相册状态;offline 表示下线(停止公开访问与新授权签发)。
* @default active
* @enum {string}
*/
readonly status: "active" | "offline";
defaultLocale: components["schemas"]["Locale"];
/** @description 活动 IANA 时区。 */
timezone: string;
/**
* Format: date-time
* @description 活动开始时间。
*/
startAt: string;
/**
* Format: date-time
* @description 活动结束时间;null 表示未定。
*/
endAt: string | null;
/** @description 是否允许新上传任务。 */
uploadEnabled: boolean;
/** @description 是否公开可见。 */
publicEnabled: boolean;
/** @description 允许下载浏览版本。 */
downloadEnabled: boolean;
/** @description 允许下载原图。 */
originalDownloadEnabled: boolean;
/**
* @description 当前水印配置版本。
* @default 0
*/
readonly watermarkVersion: number;
/** @description 各语言内容。 */
translations: components["schemas"]["AlbumTranslation"][];
/**
* Format: date-time
* @description 创建时间。
*/
readonly createdAt: string;
/**
* Format: date-time
* @description 最近更新时间。
*/
readonly updatedAt: string;
};
AlbumList: components["schemas"]["CursorPageMeta"] & {
items: components["schemas"]["AlbumSummary"][];
};
Album: components["schemas"]["AlbumSummary"] & {
/** @description 相册分类(按 sortOrder 升序)。 */
categories: components["schemas"]["Category"][];
};
MemberAddRequest: {
/** @description 被添加用户的 ID(须为已开通账号)。 */
userId: string;
/**
* @description 成员角色;P1a 仅协作者(owner 由创建流程产生)。
* @default collaborator
* @enum {string}
*/
role: "collaborator";
};
Member: {
/** @description 用户 ID。 */
readonly userId: string;
/** @description 登录账号。 */
readonly account: string;
/** @description 展示姓名(来自用户资料同步)。 */
readonly displayName: string;
/**
* @description 相册角色。
* @enum {string}
*/
readonly role: "owner" | "collaborator";
/**
* @description 成员状态;P1a 仅 active,预留扩展。
* @enum {string}
*/
readonly status: "active";
};
MemberList: components["schemas"]["CursorPageMeta"] & {
items: components["schemas"]["Member"][];
};
CategoryTranslation: {
locale: components["schemas"]["Locale"];
/** @description 分类名称。 */
name: string;
};
CategoryCreateRequest: {
/**
* @description 排序序号(升序)。
* @default 0
*/
sortOrder: number;
/** @description 分类多语言名称。 */
translations: components["schemas"]["CategoryTranslation"][];
};
/** @description 部分更新;translations 为全量替换。 */
CategoryUpdateRequest: {
/** @description 排序序号(升序)。 */
sortOrder?: number;
/** @description 全量替换多语言名称。 */
translations?: components["schemas"]["CategoryTranslation"][];
};
Category: {
/** @description 分类 ID。 */
readonly id: string;
/** @description 所属相册 ID。 */
readonly albumId: string;
/** @description 排序序号(升序)。 */
sortOrder: number;
/** @description 各语言名称。 */
translations: components["schemas"]["CategoryTranslation"][];
};
/**
* @description 上传会话状态(服务端视角;本地任务状态见技术实施方案 §5.5)。
* 会话没有 failed 状态:完成核验失败属于单次请求错误(UPLOAD_VERIFY_FAILED),
* 会话保持 pending 可重试;cancelled 为用户主动取消;
* expired 为超过 expiresAt 未完成(核验时推导或由补偿扫描落定)。
* @enum {string}
*/
UploadSessionState: "pending" | "confirmed" | "cancelled" | "expired";
/**
* @description 照片服务端处理状态(技术实施方案 §5.5「服务端处理」链路)。
* @enum {string}
*/
PhotoProcessingState: "pending_upload" | "uploaded" | "processing" | "ready" | "processing_failed";
/**
* @description 照片对外可见性(技术实施方案 §5.5「对外可见性」;deleted 为软删除)。
* @enum {string}
*/
PhotoVisibility: "unpublished" | "published" | "hidden" | "deleted";
UploadInitRequest: {
/** @description 目标相册 ID。 */
albumId: string;
/** @description 目标分类 ID;缺省为相册默认分类。 */
categoryId?: string;
/** @description 客户端任务幂等键;同一任务的重试必须复用(会话与照片 ID 均复用)。 */
clientTaskId: string;
/** @description 原始文件名(仅元数据,不作对象唯一标识)。 */
filename: string;
/**
* Format: int64
* @description 申明文件字节数;完成核验时逐一比对。
*/
bytes: number;
/**
* @description MIME 类型白名单;image/heic 为暂定项,解码能力待 G2 真机验证后确认。
* @enum {string}
*/
contentType: "image/jpeg" | "image/png" | "image/heic";
};
/** @description staging 对象的临时直传凭证;仅可写入指定 objectKey,不可访问 originals/variants。 */
UploadCredential: {
/**
* @description 凭证模式;P1a 仅预签名 URL,预留 STS 扩展。
* @default presigned
* @enum {string}
*/
readonly mode: "presigned";
/** @description 预签名上传 URL。 */
readonly url: string;
/**
* @description 上传 HTTP 方法。
* @enum {string}
*/
readonly method: "PUT";
/** @description 上传时必须携带的请求头(如 Content-Type)。 */
readonly headers: {
[key: string]: string;
};
/**
* Format: date-time
* @description 凭证过期时间;过期后续签(renew)再重试。
*/
readonly expiresAt: string;
};
UploadInitResponse: {
/** @description 上传会话 ID。 */
readonly uploadId: string;
/** @description 预创建的照片 ID(重试复用,不重复建照片)。 */
readonly photoId: string;
/** @description staging 对象键(photo-live/{env}/staging/{uploadId}/{photoId}.{ext})。 */
readonly objectKey: string;
credential: components["schemas"]["UploadCredential"];
};
UploadCompleteResponse: {
/** @description 照片 ID。 */
readonly photoId: string;
processingState: components["schemas"]["PhotoProcessingState"];
};
/** @description 会话关联照片的当前状态(会话记录内嵌,客户端据此展示服务端进度)。 */
UploadSessionPhoto: {
/** @description 照片 ID。 */
readonly photoId: string;
processingState: components["schemas"]["PhotoProcessingState"];
visibility: components["schemas"]["PhotoVisibility"];
};
UploadSessionRecord: {
/** @description 上传会话 ID。 */
readonly uploadId: string;
/** @description 目标相册 ID。 */
readonly albumId: string;
/** @description 客户端任务幂等键。 */
readonly clientTaskId: string;
state: components["schemas"]["UploadSessionState"];
/**
* Format: int64
* @description 申明文件字节数。
*/
readonly expectedBytes: number;
/** @description 申明 MIME 类型。 */
readonly contentType: string;
/**
* Format: date-time
* @description 会话创建时间。
*/
readonly createdAt: string;
photo: components["schemas"]["UploadSessionPhoto"];
};
UploadSessionList: components["schemas"]["CursorPageMeta"] & {
items: components["schemas"]["UploadSessionRecord"][];
};
PhotoVisibilityUpdateRequest: {
/**
* @description 目标可见性;仅允许 hidden 与 published 间切换。
* @enum {string}
*/
visibility: "hidden" | "published";
};
/** @description 管理端照片记录(技术实施方案 §4 photos 表字段)。 */
PhotoRecord: {
/** @description 照片 ID。 */
readonly photoId: string;
/** @description 所属相册 ID。 */
readonly albumId: string;
/** @description 分类 ID;null 表示未分类。 */
readonly categoryId: string | null;
/** @description 上传人用户 ID。 */
readonly uploaderId: string;
visibility: components["schemas"]["PhotoVisibility"];
processingState: components["schemas"]["PhotoProcessingState"];
/**
* Format: int64
* @description 原图字节数。
*/
readonly bytes: number;
/** @description 原图宽度(像素);处理前为 null。 */
readonly width: number | null;
/** @description 原图高度(像素);处理前为 null。 */
readonly height: number | null;
/**
* Format: date-time
* @description 拍摄时间(EXIF);无有效值时为 null。
*/
readonly shotAt: string | null;
/**
* Format: date-time
* @description 上传完成时间。
*/
readonly uploadedAt: string;
/**
* Format: date-time
* @description 发布时间;未发布为 null。
*/
readonly publishedAt: string | null;
/** @description 累计点赞数。 */
readonly likeCount: number;
};
/** @description 私有对象的短期签名 URL;不得写入持久分享链接,过期后经原入口刷新。 */
SignedUrl: {
/** @description 签名访问 URL。 */
readonly url: string;
/**
* Format: date-time
* @description URL 失效时间。
*/
readonly expiresAt: string;
};
/** @description 按请求 locale 回退解析后的单语言相册内容(locale 为实际返回语言)。 */
PublicAlbumTranslation: {
locale: components["schemas"]["Locale"];
/** @description 相册标题。 */
title: string;
/** @description 相册描述;无内容为 null。 */
description: string | null;
/** @description 场地名称;无内容为 null。 */
venue: string | null;
/** @description 场地地址;无内容为 null。 */
address: string | null;
};
/** @description 公开分类(名称已按请求 locale 回退解析)。 */
PublicCategory: {
/** @description 分类 ID。 */
readonly id: string;
/** @description 分类名称。 */
readonly name: string;
/** @description 排序序号(升序)。 */
readonly sortOrder: number;
};
/** @description 观众端相册信息(不泄露工作人员信息与内部存储键)。 */
PublicAlbum: {
/** @description 相册公开令牌。 */
readonly publicToken: string;
resolvedLocale: components["schemas"]["Locale"];
defaultLocale: components["schemas"]["Locale"];
/** @description 活动 IANA 时区(展示用,不随请求语言变化)。 */
readonly timezone: string;
/**
* Format: date-time
* @description 活动开始时间(UTC,客户端按时区格式化)。
*/
readonly startAt: string;
/**
* Format: date-time
* @description 活动结束时间;未定为 null。
*/
readonly endAt: string | null;
translation: components["schemas"]["PublicAlbumTranslation"];
/** @description 分类列表(按 sortOrder 升序)。 */
categories: components["schemas"]["PublicCategory"][];
/** @description 封面图签名 URL;未设置为 null。 */
banner: components["schemas"]["SignedUrl"] | null;
/** @description P1a 占位 null;浏览计数由后续 /visits 端点提供(技术实施方案 §7.1)。 */
readonly viewCount: null;
};
/** @description 公开照片条目(仅 published 照片,处理完成即有宽高;URL 为短期签名,需在过期前刷新)。 */
PublicPhoto: {
/** @description 照片 ID。 */
readonly photoId: string;
/** @description 浏览图宽度(像素);用于列表占位,减少加载跳动。 */
readonly width: number;
/** @description 浏览图高度(像素)。 */
readonly height: number;
thumb: components["schemas"]["SignedUrl"];
browse: components["schemas"]["SignedUrl"];
/** @description 累计点赞数。 */
readonly likeCount: number;
/**
* Format: date-time
* @description 发布时间(列表排序依据)。
*/
readonly publishedAt: string;
};
PublicPhotoDetail: components["schemas"]["PublicPhoto"] & {
/** @description 所属分类 ID;未分类为 null。 */
readonly categoryId: string | null;
};
PublicPhotoList: components["schemas"]["CursorPageMeta"] & {
items: components["schemas"]["PublicPhoto"][];
};
};
responses: {
/** @description 未认证:令牌缺失、无效或已过期(AUTH_TOKEN_EXPIRED)。 */
Unauthorized: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 服务器内部错误(INTERNAL_ERROR)。 */
InternalError: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
};
parameters: {
/** @description 相册 ID。 */
AlbumId: string;
/** @description 用户 ID。 */
UserId: string;
/** @description 分类 ID。 */
CategoryId: string;
/** @description 上传会话 ID。 */
UploadId: string;
/** @description 照片 ID。 */
PhotoId: string;
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
AlbumPublicToken: string;
/** @description 分页游标(上一页响应的 nextCursor)。 */
CursorQuery: string;
/** @description 请求语言;缺省时按相册 defaultLocale 回退。 */
LocaleQuery: components["schemas"]["Locale"];
};
requestBodies: never;
headers: never;
pathItems: never;
}
export type $defs = Record<string, never>;
export interface operations {
loginWithPassword: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LoginRequest"];
};
};
responses: {
/** @description 登录成功,返回会话令牌与过期时间。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LoginResponse"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED,经全局校验管道)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 账号或密码错误(AUTH_INVALID_CREDENTIALS)。 */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
refreshSession: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 续期成功。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["RefreshResponse"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED,经全局校验管道)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
500: components["responses"]["InternalError"];
};
};
logout: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已退出,无响应体。 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description 请求体不可解析(VALIDATION_FAILED,经全局校验管道)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
500: components["responses"]["InternalError"];
};
};
listAlbums: {
parameters: {
query?: {
/** @description 分页游标(上一页响应的 nextCursor)。 */
cursor?: components["parameters"]["CursorQuery"];
/** @description 每页条数。 */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 相册列表页。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AlbumList"];
};
};
/** @description 查询参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
500: components["responses"]["InternalError"];
};
};
createAlbum: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["AlbumCreateRequest"];
};
};
responses: {
/** @description 相册已创建(新相册 categories 为空数组)。 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Album"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
500: components["responses"]["InternalError"];
};
};
getAlbum: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 相册详情。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Album"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 相册不存在,或当前用户非成员不可见(ALBUM_NOT_FOUND,避免枚举)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
updateAlbum: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["AlbumUpdateRequest"];
};
};
responses: {
/** @description 更新后的相册详情。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Album"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 仅创建者或管理员可修改(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在,或当前用户不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
listAlbumMembers: {
parameters: {
query?: {
/** @description 分页游标(上一页响应的 nextCursor)。 */
cursor?: components["parameters"]["CursorQuery"];
/** @description 每页条数。 */
limit?: number;
};
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 成员列表页。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["MemberList"];
};
};
/** @description 查询参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 相册不存在,或当前用户不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
addAlbumMember: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["MemberAddRequest"];
};
};
responses: {
/** @description 成员已添加。 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Member"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 仅创建者或管理员可管理成员(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在,或当前用户不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 该用户已是相册成员(MEMBER_CONFLICT)。 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
removeAlbumMember: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
/** @description 用户 ID。 */
userId: components["parameters"]["UserId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已移除,无响应体。 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
401: components["responses"]["Unauthorized"];
/** @description 无管理权限,或试图移除创建者(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在,或当前用户不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
createCategory: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册 ID。 */
albumId: components["parameters"]["AlbumId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CategoryCreateRequest"];
};
};
responses: {
/** @description 分类已创建。 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Category"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 仅创建者或管理员可管理分类(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在,或当前用户不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
deleteCategory: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 分类 ID。 */
categoryId: components["parameters"]["CategoryId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除,无响应体。 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
401: components["responses"]["Unauthorized"];
/** @description 无所属相册的管理权限(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 分类不存在,或所属相册不存在/不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
updateCategory: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 分类 ID。 */
categoryId: components["parameters"]["CategoryId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CategoryUpdateRequest"];
};
};
responses: {
/** @description 更新后的分类。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Category"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 无所属相册的管理权限(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 分类不存在,或所属相册不存在/不可见(ALBUM_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
listUploads: {
parameters: {
query?: {
/** @description 分页游标(上一页响应的 nextCursor)。 */
cursor?: components["parameters"]["CursorQuery"];
/** @description 每页条数。 */
limit?: number;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 会话记录列表页。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["UploadSessionList"];
};
};
/** @description 查询参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
500: components["responses"]["InternalError"];
};
};
initUpload: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["UploadInitRequest"];
};
};
responses: {
/** @description 上传会话已创建(幂等重复调用返回原会话)。 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["UploadInitResponse"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED):文件超过大小限额或类型不接受。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 无该相册的上传权限(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/**
* @description 相册已关闭上传(ALBUM_UPLOAD_DISABLED),或同 clientTaskId 已存在
* 且参数不一致(UPLOAD_SESSION_CONFLICT)。
*/
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
renewUploadCredential: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 上传会话 ID。 */
uploadId: components["parameters"]["UploadId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 新凭证已签发(credential 为新值,其余字段回显原会话)。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["UploadInitResponse"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 无权操作该会话或会话不存在(AUTH_FORBIDDEN,不区分以避免枚举)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/**
* @description 相册已关闭上传(ALBUM_UPLOAD_DISABLED),或会话状态不允许续签
* (已完成/取消/过期,UPLOAD_SESSION_CONFLICT)。
*/
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
completeUpload: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 上传会话 ID。 */
uploadId: components["parameters"]["UploadId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 核验通过,照片进入处理流水线。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["UploadCompleteResponse"];
};
};
/**
* @description 核验失败(UPLOAD_VERIFY_FAILED):对象缺失、字节数与申明不符
* 或完整性信息不可用。
*/
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 无权操作该会话或会话不存在(AUTH_FORBIDDEN,不区分以避免枚举)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 会话状态不允许完成(已取消或已过期,UPLOAD_SESSION_CONFLICT)。 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
deletePhoto: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 照片 ID。 */
photoId: components["parameters"]["PhotoId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已软删除,无响应体。 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
401: components["responses"]["Unauthorized"];
/** @description 无该照片的管理权限(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 照片不存在(PHOTO_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
updatePhoto: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 照片 ID。 */
photoId: components["parameters"]["PhotoId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PhotoVisibilityUpdateRequest"];
};
};
responses: {
/** @description 更新后的照片记录。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PhotoRecord"];
};
};
/** @description 参数校验失败(VALIDATION_FAILED,visibility 取值非法)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
401: components["responses"]["Unauthorized"];
/** @description 无该照片的管理权限(AUTH_FORBIDDEN)。 */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 照片不存在(PHOTO_NOT_FOUND)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
getPublicAlbum: {
parameters: {
query?: {
/** @description 请求语言;缺省时按相册 defaultLocale 回退。 */
locale?: components["parameters"]["LocaleQuery"];
};
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 相册公开信息。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PublicAlbum"];
};
};
/** @description 查询参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在或未公开(ALBUM_NOT_PUBLIC,不区分以避免枚举)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
listPublicPhotos: {
parameters: {
query?: {
/** @description 分类 ID 过滤(来自 PublicAlbum.categories 的 id)。 */
category?: string;
/** @description 请求语言;缺省时按相册 defaultLocale 回退。 */
locale?: components["parameters"]["LocaleQuery"];
/** @description 分页游标(上一页响应的 nextCursor)。 */
cursor?: components["parameters"]["CursorQuery"];
/** @description 每页张数(技术实施方案 §7 建议 30-60)。 */
limit?: number;
};
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 公开照片列表页。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PublicPhotoList"];
};
};
/** @description 查询参数校验失败(VALIDATION_FAILED)。 */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
/** @description 相册不存在或未公开(ALBUM_NOT_PUBLIC,不区分以避免枚举)。 */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
getPublicPhoto: {
parameters: {
query?: never;
header?: never;
path: {
/** @description 相册公开令牌(不可枚举,持有即可访问)。 */
token: components["parameters"]["AlbumPublicToken"];
/** @description 照片 ID。 */
photoId: components["parameters"]["PhotoId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 单图信息(含新签名的 thumb/browse URL)。 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PublicPhotoDetail"];
};
};
/**
* @description 相册不存在或未公开(ALBUM_NOT_PUBLIC),或照片不存在、未发布、
* 不属于该相册(PHOTO_NOT_PUBLIC)。
*/
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Error"];
};
};
500: components["responses"]["InternalError"];
};
};
}