--- paths: - "src/api/**" - "src/routers/**" - "src/services/**" --- # API 层开发规则(Clover 后端) > 承接架构方案v0.3 基石 + API契约.md,冲突以架构方案为准。 ## 路由规范 - RESTful 命名:资源用名词复数(/tasks, /products, /api-keys) - 版本前缀:/api/v1/ - 控制器只做:参数校验 → 调 service → 格式化响应,**不含业务逻辑** ## 响应格式(统一包络) - 成功:`{ "code": 0, "data": {...} }` - 失败:`{ "code": <错误码>, "message": "用户可读信息" }` - HTTP 状态码与业务 code 分离(见契约§0七类错误码) ## 安全(基石B/C) - 所有用户输入必须校验(类型、长度、范围) - SQL 查询使用参数化,禁止字符串拼接 - **API Key 绝不进 Celery 参数**,只传 task_id;worker 内查库→Fernet解密→局部变量 - FERNET_KEY 走环境变量,绝不进代码库;解密不落盘、不打日志 - 敏感操作记审计日志(ai_call_logs) ## 多租户隔离(红线) - 所有查询强制带 workspace_id 条件 - 写操作 + 切 workspace 必须查 workspace_members 校验权限 - workspace_id / product_id 从 JWT + 上下文自动带,前端不传(防越权) - 所有 workspace 相关 Repo 继承 base_workspace_repo ## 错误处理(官网V1坑3) - service 错误不许静默吞,至少打 error log - AI/token站调用失败归因到个人 key(错误码50002) - DB 枚举约束要有对应代码侧常量文件 ## 业务参数不写死(基石A) - 禁止出现品类/数量/角度任何枚举常量 - "看起来像枚举"的业务概念 → 做成数据不做成代码