# API 客户端模块 **本文档引用的文件** - [cosmoe.ts](file://src/client/cosmoe.ts) - [index.ts](file://src/command/index.ts) - [login.ts](file://src/command/handlers/login.ts) - [bookEvent.ts](file://src/command/handlers/bookEvent.ts) - [events.ts](file://src/command/handlers/events.ts) - [eventDetails.ts](file://src/command/handlers/eventDetails.ts) - [history.ts](file://src/command/handlers/history.ts) - [cancel.ts](file://src/command/handlers/cancel.ts) - [logout.ts](file://src/command/handlers/logout.ts) - [start.ts](file://src/command/handlers/start.ts) - [package.json](file://package.json) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 简介 Cosmoe API 客户端模块是一个基于 TypeScript 的现代化 API 客户端库,专为与 Cosmoe 摄影平台进行交互而设计。该模块提供了完整的认证机制、用户管理、活动管理和预约管理功能,支持通过 Telegram 机器人界面进行用户友好的操作。 该客户端模块采用现代 JavaScript 特性,包括异步/等待模式、接口定义和类型安全,确保了代码的可维护性和可靠性。模块设计遵循单一职责原则,将 API 交互逻辑与业务逻辑分离,便于测试和扩展。 ## 项目结构 项目采用模块化架构,主要包含以下核心目录和文件: ```mermaid graph TB subgraph "客户端层" C1[src/client/cosmoe.ts
主客户端类] end subgraph "命令处理器层" H1[src/command/handlers/] H2[login.ts
登录处理] H3[bookEvent.ts
预约处理] H4[events.ts
活动列表] H5[eventDetails.ts
活动详情] H6[history.ts
历史记录] H7[cancel.ts
取消处理] H8[logout.ts
登出处理] H9[start.ts
启动命令] end subgraph "入口点" E1[src/command/index.ts
命令注册] E2[src/index.ts
应用入口] end subgraph "配置文件" P1[package.json
依赖管理] W1[wrangler.jsonc
Cloudflare Workers配置] end C1 --> H1 E1 --> H1 E2 --> E1 ``` **图表来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L1-L503) - [index.ts](file://src/command/index.ts#L1-L110) **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L1-L503) - [index.ts](file://src/command/index.ts#L1-L110) ## 核心组件 ### CosmoeClient 主类 CosmoeClient 是整个模块的核心类,提供了所有与 Cosmoe API 交互的功能。该类采用面向对象设计,封装了所有 API 调用逻辑,并提供了清晰的方法接口。 #### 主要特性 - **认证管理**: 支持用户名密码认证和手动凭证设置 - **数据模型**: 完整的 TypeScript 接口定义 - **错误处理**: 统一的响应格式和错误处理机制 - **类型安全**: 全面的 TypeScript 类型定义 #### 关键属性 - `baseUrl`: API 基础 URL (`https://cos.cx/api/v1`) - `userId`: 当前认证用户的 ID - `token`: 认证令牌 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) ## 架构概览 系统采用分层架构设计,实现了关注点分离: ```mermaid graph TB subgraph "表现层" UI[Telegram 机器人界面] CMD[命令处理器] end subgraph "业务逻辑层" BC[CosmoeClient
核心业务逻辑] UT[工具函数
数据验证] end subgraph "数据访问层" API[Cosmoe API
RESTful 接口] KV[KV 存储
凭证持久化] end subgraph "配置层" CFG[环境配置] LOG[日志系统] end UI --> CMD CMD --> BC BC --> API BC --> KV CMD --> KV BC --> CFG CMD --> LOG ``` **图表来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L113-L503) - [index.ts](file://src/command/index.ts#L20-L110) ## 详细组件分析 ### 认证机制 #### getToken 方法 负责用户身份验证,通过用户名和密码获取认证令牌。 **方法签名**: `getToken(username: string, password: string): Promise>` **参数**: - `username`: 用户名 (字符串) - `password`: 密码 (字符串) **返回值**: `ApiResponse` - `code`: HTTP 状态码 - `msg`: 错误消息 (可选) - `data`: 包含 `user_id` 和 `token` 的响应数据 **错误处理**: - 认证失败时抛出 `Error("Authentication required")` - 网络请求异常时返回统一的错误格式 **使用示例路径**: - [登录处理器](file://src/command/handlers/login.ts#L47-L69) **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L124-L140) - [login.ts](file://src/command/handlers/login.ts#L47-L69) #### setCredentials 和 getCredentials 方法 提供手动设置和获取用户凭证的功能。 **setCredentials 方法**: - 参数: `userId: number, token: string` - 功能: 手动设置认证信息 - 返回: `void` **getCredentials 方法**: - 返回: `{ userId: number, token: string } | null` - 功能: 获取当前认证信息,如果未认证则返回 null **isAuthenticated 方法**: - 返回: `boolean` - 功能: 检查用户是否已认证 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L147-L171) ### 用户管理功能 #### getUserProfile 方法 获取用户个人信息和统计信息。 **方法签名**: `getUserProfile(): Promise>` **返回值**: `ApiResponse` - `user_info`: 用户基本信息 - `statistics`: 预约统计信息 **UserProfile 接口**: - `user_info`: UserInfo 对象 - `statistics`: Statistics 对象 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L308-L321) #### changePassword 方法 修改用户密码。 **方法签名**: `changePassword(currentPassword: string, newPassword: string): Promise>` **参数**: - `currentPassword`: 当前密码 - `newPassword`: 新密码 (至少6个字符) **错误处理**: - 新密码长度不足时抛出 `Error("New password must be at least 6 characters")` **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L279-L301) #### register 方法 注册新用户。 **方法签名**: `register(key: string, username: string, email: string, password: string, userIdentity: string = "photographer"): Promise>` **参数**: - `key`: 权限密钥 (联系管理员获取) - `username`: 用户名 (2-10字符,仅允许字母数字和下划线) - `email`: 邮箱地址 - `password`: 密码 (至少6个字符) - `userIdentity`: 用户身份 (默认: "photographer") **返回值**: 注册成功的用户信息 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L487-L502) ### 活动管理功能 #### getEvents 方法 获取活动列表。 **方法签名**: `getEvents(): Promise>` **返回值**: `ApiResponse` - `Event` 接口包含活动的基本信息 **Event 接口字段**: - `id`: 活动ID (字符串) - `name`: 活动名称 - `description`: 活动描述 - `event_date`: 活动日期 - `cover_image_url`: 封面图片URL - `description_brief`: 简短描述 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L177-L184) #### getEventDetail 方法 获取活动详细信息。 **方法签名**: `getEventDetail(eventId: number | string): Promise>` **返回值**: `ApiResponse` - `EventDetail` 接口包含活动的完整信息 **EventDetail 接口字段**: - `id`: 活动ID (数字) - `name`: 活动名称 - `description`: 活动描述 - `event_date`: 活动日期 - `time_slots_with_prices`: 时间段价格字符串 - `cover_image_url`: 封面图片URL - `detail_image_urls`: 详情图片URL数组 - `slots`: TimeSlot 数组 - `allow_coupons`: 是否允许使用优惠券 **TimeSlot 接口字段**: - `range`: 时间段范围 (如 "13:30-14:30") - `price`: 价格 (字符串格式) - `capacity`: 总容量 - `remaining`: 剩余位置 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L191-L199) ### 预约管理功能 #### getMyBookings 方法 获取用户的预约历史。 **方法签名**: `getMyBookings(): Promise>` **返回值**: `ApiResponse` - `Booking` 接口包含预约信息 **Booking 接口字段**: - `id`: 预约ID - `status`: 预约状态 - `booking_date`: 预约日期 - `time_slot`: 时间段 - `final_price`: 最终价格 - `payment_order_id`: 支付订单ID - `notes_by_user`: 用户备注 - `created_at`: 创建时间 - `event_name`: 活动名称 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L226-L239) #### bookEvent 方法 预订活动。 **方法签名**: `bookEvent(bookingRequest: BookingRequest): Promise>` **参数**: `BookingRequest` 对象 - `event_id`: 活动ID - `time_slot`: 时间段 - `user_note`: 用户备注 (可选) - `coupon_code`: 优惠码 (可选) **返回值**: 预订结果 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L247-L270) #### 取消和修改功能 ##### cancelBooking 方法 取消预约。 **方法签名**: `cancelBooking(bookingId: number): Promise>` **参数**: - `bookingId`: 预约ID **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L405-L422) ##### updatePaymentOrder 方法 更新支付订单ID。 **方法签名**: `updatePaymentOrder(bookingId: number, paymentOrderId: string): Promise>` **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L352-L370) ##### updateBookingNote 方法 更新预约备注。 **方法签名**: `updateBookingNote(bookingId: number, note: string): Promise>` **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L379-L397) ##### selfReschedule 方法 自助改期。 **方法签名**: `selfReschedule(bookingId: number, newTimeSlot: string): Promise>` **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L431-L449) ##### selfTransfer 方法 自助转让。 **方法签名**: `selfTransfer(bookingId: number, recipientUsername: string): Promise>` **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L458-L476) ### 优惠券系统 #### getAvailableCoupons 方法 获取活动可用的优惠券。 **方法签名**: `getAvailableCoupons(eventId: number | string): Promise>` **返回值**: `ApiResponse` - `Coupon` 接口包含优惠券信息 **Coupon 接口字段**: - `id`: 优惠券ID - `code`: 优惠码 - `type`: 类型 ('percentage' 或 'fixed') - `value`: 优惠值 - `valid_to`: 有效期 **章节来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L329-L343) ## 依赖关系分析 ### 外部依赖 项目使用以下关键依赖: ```mermaid graph LR subgraph "核心框架" G[grammy
Telegram 机器人框架] C[conversations
对话插件] S[storage-cloudflare
KV存储] end subgraph "开发工具" V[vitest
测试框架] W[wrangler
Cloudflare Workers] T[typescript
类型系统] end subgraph "项目模块" CC[CosmoeClient] HP[Handlers] CM[Commands] end G --> C G --> S V --> W CC --> HP HP --> CM ``` **图表来源** - [package.json](file://package.json#L18-L23) ### 内部依赖关系 ```mermaid 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 ``` **图表来源** - [cosmoe.ts](file://src/client/cosmoe.ts#L113-L503) - [login.ts](file://src/command/handlers/login.ts#L1-L74) **章节来源** - [package.json](file://package.json#L18-L23) ## 性能考虑 ### 缓存策略 - **认证缓存**: 使用 Cloudflare KV 存储用户凭证,避免重复认证 - **数据缓存**: 在会话期间缓存常用数据,减少 API 调用频率 - **连接复用**: 使用持久连接减少网络开销 ### 错误处理优化 - **重试机制**: 对临时性错误实施指数退避重试 - **超时控制**: 设置合理的请求超时时间 - **降级策略**: 在 API 不可用时提供本地降级选项 ### 内存管理 - **对象池**: 复用频繁创建的对象实例 - **垃圾回收**: 及时清理不再使用的引用 - **内存泄漏防护**: 确保事件监听器正确移除 ## 故障排除指南 ### 常见问题及解决方案 #### 认证失败 **症状**: `Authentication required` 错误 **原因**: 凭证过期或无效 **解决**: 1. 重新执行 `/login` 命令 2. 检查用户名和密码 3. 验证网络连接 #### API 调用超时 **症状**: 请求在合理时间内无响应 **原因**: 网络延迟或服务器负载过高 **解决**: 1. 检查网络连接稳定性 2. 实施重试机制 3. 调整超时参数 #### 数据格式错误 **症状**: 解析响应时出现类型错误 **原因**: API 响应格式变化 **解决**: 1. 更新数据模型定义 2. 添加类型验证 3. 实施向后兼容性检查 ### 调试技巧 #### 日志记录 - 启用详细的 API 调用日志 - 记录请求和响应的完整内容 - 监控错误发生的时间和频率 #### 性能监控 - 监控 API 响应时间 - 跟踪内存使用情况 - 分析并发请求处理能力 **章节来源** - [login.ts](file://src/command/handlers/login.ts#L70-L73) - [bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117) ## 结论 Cosmoe API 客户端模块是一个设计精良、功能完整的现代化 API 客户端库。它成功地将复杂的 API 交互逻辑封装在简洁易用的接口后面,同时保持了高度的类型安全和错误处理能力。 ### 主要优势 - **模块化设计**: 清晰的关注点分离,便于维护和扩展 - **类型安全**: 完整的 TypeScript 类型定义,提供编译时检查 - **错误处理**: 统一的错误处理机制和用户友好的错误消息 - **性能优化**: 合理的缓存策略和资源管理 - **可测试性**: 清晰的接口设计,便于单元测试和集成测试 ### 技术亮点 - 使用现代 JavaScript 特性 (async/await, TypeScript) - 采用分层架构设计 - 实现了完整的认证和授权机制 - 提供了丰富的数据模型和验证逻辑 - 集成了 Cloudflare Workers 和 KV 存储 ### 未来改进方向 - 添加更多的缓存策略 - 实现更精细的错误分类和处理 - 增加更多的监控和日志功能 - 扩展对更多 API 功能的支持 - 提供更丰富的配置选项 该模块为构建可靠的 Telegram 机器人应用提供了坚实的基础,能够满足摄影活动预约系统的各种需求。