本文档引用的文件
Cosmoe API 客户端模块是一个基于 TypeScript 的现代化 API 客户端库,专为与 Cosmoe 摄影平台进行交互而设计。该模块提供了完整的认证机制、用户管理、活动管理和预约管理功能,支持通过 Telegram 机器人界面进行用户友好的操作。
该客户端模块采用现代 JavaScript 特性,包括异步/等待模式、接口定义和类型安全,确保了代码的可维护性和可靠性。模块设计遵循单一职责原则,将 API 交互逻辑与业务逻辑分离,便于测试和扩展。
项目采用模块化架构,主要包含以下核心目录和文件:
graph TB
subgraph "客户端层"
C1[src/client/cosmoe.ts<br/>主客户端类]
end
subgraph "命令处理器层"
H1[src/command/handlers/]
H2[login.ts<br/>登录处理]
H3[bookEvent.ts<br/>预约处理]
H4[events.ts<br/>活动列表]
H5[eventDetails.ts<br/>活动详情]
H6[history.ts<br/>历史记录]
H7[cancel.ts<br/>取消处理]
H8[logout.ts<br/>登出处理]
H9[start.ts<br/>启动命令]
end
subgraph "入口点"
E1[src/command/index.ts<br/>命令注册]
E2[src/index.ts<br/>应用入口]
end
subgraph "配置文件"
P1[package.json<br/>依赖管理]
W1[wrangler.jsonc<br/>Cloudflare Workers配置]
end
C1 --> H1
E1 --> H1
E2 --> E1
图表来源
章节来源
CosmoeClient 是整个模块的核心类,提供了所有与 Cosmoe API 交互的功能。该类采用面向对象设计,封装了所有 API 调用逻辑,并提供了清晰的方法接口。
baseUrl: API 基础 URL (https://cos.cx/api/v1)userId: 当前认证用户的 IDtoken: 认证令牌章节来源
系统采用分层架构设计,实现了关注点分离:
graph TB
subgraph "表现层"
UI[Telegram 机器人界面]
CMD[命令处理器]
end
subgraph "业务逻辑层"
BC[CosmoeClient<br/>核心业务逻辑]
UT[工具函数<br/>数据验证]
end
subgraph "数据访问层"
API[Cosmoe API<br/>RESTful 接口]
KV[KV 存储<br/>凭证持久化]
end
subgraph "配置层"
CFG[环境配置]
LOG[日志系统]
end
UI --> CMD
CMD --> BC
BC --> API
BC --> KV
CMD --> KV
BC --> CFG
CMD --> LOG
图表来源
负责用户身份验证,通过用户名和密码获取认证令牌。
方法签名: getToken(username: string, password: string): Promise<ApiResponse<TokenResponse>>
参数:
username: 用户名 (字符串)password: 密码 (字符串)返回值: ApiResponse<TokenResponse>
code: HTTP 状态码msg: 错误消息 (可选)data: 包含 user_id 和 token 的响应数据错误处理:
Error("Authentication required")使用示例路径:
章节来源
提供手动设置和获取用户凭证的功能。
setCredentials 方法:
userId: number, token: stringvoidgetCredentials 方法:
{ userId: number, token: string } | nullisAuthenticated 方法:
boolean章节来源
获取用户个人信息和统计信息。
方法签名: getUserProfile(): Promise<ApiResponse<UserProfile>>
返回值: ApiResponse<UserProfile>
user_info: 用户基本信息statistics: 预约统计信息UserProfile 接口:
user_info: UserInfo 对象statistics: Statistics 对象章节来源
修改用户密码。
方法签名: changePassword(currentPassword: string, newPassword: string): Promise<ApiResponse<any>>
参数:
currentPassword: 当前密码newPassword: 新密码 (至少6个字符)错误处理:
Error("New password must be at least 6 characters")章节来源
注册新用户。
方法签名: register(key: string, username: string, email: string, password: string, userIdentity: string = "photographer"): Promise<ApiResponse<{ user_id: number, username: string }>>
参数:
key: 权限密钥 (联系管理员获取)username: 用户名 (2-10字符,仅允许字母数字和下划线)email: 邮箱地址password: 密码 (至少6个字符)userIdentity: 用户身份 (默认: "photographer")返回值: 注册成功的用户信息
章节来源
获取活动列表。
方法签名: getEvents(): Promise<ApiResponse<Event[]>>
返回值: ApiResponse<Event[]>
Event 接口包含活动的基本信息Event 接口字段:
id: 活动ID (字符串)name: 活动名称description: 活动描述event_date: 活动日期cover_image_url: 封面图片URLdescription_brief: 简短描述章节来源
获取活动详细信息。
方法签名: getEventDetail(eventId: number | string): Promise<ApiResponse<EventDetail>>
返回值: ApiResponse<EventDetail>
EventDetail 接口包含活动的完整信息EventDetail 接口字段:
id: 活动ID (数字)name: 活动名称description: 活动描述event_date: 活动日期time_slots_with_prices: 时间段价格字符串cover_image_url: 封面图片URLdetail_image_urls: 详情图片URL数组slots: TimeSlot 数组allow_coupons: 是否允许使用优惠券TimeSlot 接口字段:
range: 时间段范围 (如 "13:30-14:30")price: 价格 (字符串格式)capacity: 总容量remaining: 剩余位置章节来源
获取用户的预约历史。
方法签名: getMyBookings(): Promise<ApiResponse<Booking[]>>
返回值: ApiResponse<Booking[]>
Booking 接口包含预约信息Booking 接口字段:
id: 预约IDstatus: 预约状态booking_date: 预约日期time_slot: 时间段final_price: 最终价格payment_order_id: 支付订单IDnotes_by_user: 用户备注created_at: 创建时间event_name: 活动名称章节来源
预订活动。
方法签名: bookEvent(bookingRequest: BookingRequest): Promise<ApiResponse<any>>
参数: BookingRequest 对象
event_id: 活动IDtime_slot: 时间段user_note: 用户备注 (可选)coupon_code: 优惠码 (可选)返回值: 预订结果
章节来源
取消预约。
方法签名: cancelBooking(bookingId: number): Promise<ApiResponse<any>>
参数:
bookingId: 预约ID章节来源
更新支付订单ID。
方法签名: updatePaymentOrder(bookingId: number, paymentOrderId: string): Promise<ApiResponse<any>>
章节来源
更新预约备注。
方法签名: updateBookingNote(bookingId: number, note: string): Promise<ApiResponse<any>>
章节来源
自助改期。
方法签名: selfReschedule(bookingId: number, newTimeSlot: string): Promise<ApiResponse<any>>
章节来源
自助转让。
方法签名: selfTransfer(bookingId: number, recipientUsername: string): Promise<ApiResponse<any>>
章节来源
获取活动可用的优惠券。
方法签名: getAvailableCoupons(eventId: number | string): Promise<ApiResponse<Coupon[]>>
返回值: ApiResponse<Coupon[]>
Coupon 接口包含优惠券信息Coupon 接口字段:
id: 优惠券IDcode: 优惠码type: 类型 ('percentage' 或 'fixed')value: 优惠值valid_to: 有效期章节来源
项目使用以下关键依赖:
graph LR
subgraph "核心框架"
G[grammy<br/>Telegram 机器人框架]
C[conversations<br/>对话插件]
S[storage-cloudflare<br/>KV存储]
end
subgraph "开发工具"
V[vitest<br/>测试框架]
W[wrangler<br/>Cloudflare Workers]
T[typescript<br/>类型系统]
end
subgraph "项目模块"
CC[CosmoeClient]
HP[Handlers]
CM[Commands]
end
G --> C
G --> S
V --> W
CC --> HP
HP --> CM
图表来源
graph TB
subgraph "客户端层"
CC[CosmoeClient]
MD[数据模型]
end
subgraph "命令层"
LH[登录处理器]
BH[预约处理器]
EH[事件处理器]
HH[历史处理器]
CH[取消处理器]
LOGH[登出处理器]
end
subgraph "存储层"
KV[KV 存储]
end
CC --> MD
LH --> CC
BH --> CC
EH --> CC
HH --> CC
CH --> CC
LOGH --> CC
CC --> KV
LH --> KV
BH --> KV
CH --> KV
图表来源
章节来源
症状: Authentication required 错误
原因: 凭证过期或无效
解决:
/login 命令症状: 请求在合理时间内无响应 原因: 网络延迟或服务器负载过高 解决:
症状: 解析响应时出现类型错误 原因: API 响应格式变化 解决:
章节来源
Cosmoe API 客户端模块是一个设计精良、功能完整的现代化 API 客户端库。它成功地将复杂的 API 交互逻辑封装在简洁易用的接口后面,同时保持了高度的类型安全和错误处理能力。
该模块为构建可靠的 Telegram 机器人应用提供了坚实的基础,能够满足摄影活动预约系统的各种需求。