Wild Workouts Go DDD 示例项目中的训练API接口详解
2025-07-07 08:26:42作者:戚魁泉Nursing
项目背景
Wild Workouts是一个基于领域驱动设计(DDD)理念构建的Go语言健身应用示例项目。该项目展示了如何在实际应用中运用DDD原则,其中训练管理模块是其核心功能之一。本文将重点解析该项目的训练API接口设计。
API概览
训练API提供了完整的训练管理功能,包括:
- 训练信息查询
- 创建新训练
- 取消训练
- 重新安排训练时间
- 训练时间调整的请求与审批流程
接口详细解析
1. 获取训练列表
/trainings:
get:
operationId: getTrainings
功能:获取当前用户的训练列表
响应:返回一个包含多个训练对象的JSON数组,每个训练对象包含训练ID、用户信息、备注、时间等详细信息
2. 创建新训练
/trainings:
post:
operationId: createTraining
请求体:需要提供训练时间和备注信息
特点:采用JWT Bearer Token进行身份验证,确保只有认证用户才能创建训练
3. 取消训练
/trainings/{trainingUUID}:
delete:
operationId: cancelTraining
参数:通过路径参数指定要取消的训练UUID
业务规则:后端会校验训练是否可以被取消(基于canBeCancelled字段)
4. 训练时间调整相关接口
项目设计了完整的时间调整流程:
- 请求重新安排:用户发起时间调整请求
- 批准重新安排:教练或管理员批准调整
- 拒绝重新安排:教练或管理员拒绝调整
/trainings/{trainingUUID}/reschedule:
put:
operationId: rescheduleTraining
/trainings/{trainingUUID}/request-reschedule:
put:
operationId: requestRescheduleTraining
/trainings/{trainingUUID}/approve-reschedule:
put:
operationId: approveRescheduleTraining
/trainings/{trainingUUID}/reject-reschedule:
put:
operationId: rejectRescheduleTraining
数据结构设计
训练对象(Training)
Training:
type: object
required: [uuid, user, userUuid, notes, time, canBeCancelled, moveRequiresAccept]
properties:
uuid: string
user: string
userUuid: string
notes: string
time: string(date-time)
canBeCancelled: boolean
moveRequiresAccept: boolean
proposedTime: string(date-time)
moveProposedBy: string
关键字段说明:
canBeCancelled
:标识该训练是否可以被取消(基于业务规则)moveRequiresAccept
:标识时间调整是否需要审批proposedTime
:当训练时间被请求调整时,存储提议的新时间moveProposedBy
:记录谁发起了时间调整请求
错误处理
Error:
type: object
required: [slug, message]
properties:
slug: string
message: string
采用标准的错误响应格式,包含错误代码(slug)和错误信息(message),便于客户端统一处理。
安全设计
所有API端点都采用JWT Bearer Token进行保护:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
领域驱动设计体现
从API设计中可以看到明显的DDD痕迹:
- 明确的领域边界:训练管理作为独立的边界上下文
- 丰富的领域模型:训练对象包含业务状态和行为(能否取消、是否需要审批等)
- 业务流程显式化:时间调整的请求-审批流程被明确建模为API操作
最佳实践
- RESTful设计:合理使用HTTP方法和状态码
- 资源导向:以训练为核心资源组织API
- 幂等性设计:PUT操作保证幂等性
- 版本控制:OpenAPI规范明确定义了API版本
总结
Wild Workouts项目的训练API设计展示了如何将复杂的业务需求转化为清晰的API契约。通过分析这个设计,我们可以学习到:
- 如何用API表达业务规则和流程
- DDD概念在API设计中的实际应用
- 健身领域特定需求的API建模方法
- 生产级API的安全和错误处理设计
这种设计既满足了功能性需求,又保持了良好的扩展性,是学习API设计和DDD实践的优秀范例。