模块划分
Sentinel 后端采用模块化设计,每个模块负责特定的业务领域。
模块概览
apps/api/src/
├── analysis/ # 分析任务模块
├── auth/ # 认证授权模块
├── health/ # 健康检查模块
├── integrations/ # 第三方集成模块
├── projects/ # 项目管理模块
├── repositories/ # 仓库管理模块
├── requests/ # LLM 请求记录模块
├── session_artifacts/ # 会话产物模块
├── sessions/ # Agent 会话模块
├── sse/ # Server-Sent Events 模块
├── tool_calls/ # 工具调用记录模块
├── users/ # 用户管理模块
└── webhooks/ # Webhook 处理模块核心模块详解
1. Auth 模块
职责: 用户认证和授权
主要功能:
- 用户登录/注册
- JWT Token 生成和验证
- GitHub OAuth 集成
- 密码重置流程
- 用户信息管理
关键文件:
auth/
├── routes.rs # 认证相关路由
├── repository.rs # 用户数据访问
├── github.rs # GitHub OAuth 客户端
└── mod.rs # 模块导出数据库表:
users- 用户基本信息password_reset_tokens- 密码重置令牌
API 端点:
POST /api/v1/auth/loginPOST /api/v1/auth/registerPOST /api/v1/auth/logoutGET /api/v1/me
2. Projects 模块
职责: 项目生命周期管理
主要功能:
- 创建/更新/删除项目
- 项目列表查询
- Slug 唯一性管理
- 项目归属验证
关键文件:
projects/
├── routes.rs # 项目路由
├── repository.rs # 项目数据访问
├── model.rs # 请求/响应模型
└── mod.rs数据库表:
projects- 项目信息
API 端点:
POST /api/v1/projectsGET /api/v1/projectsGET /api/v1/projects/{id}PATCH /api/v1/projects/{id}DELETE /api/v1/projects/{id}
3. Repositories 模块
职责: 代码仓库管理
主要功能:
- GitHub 仓库导入
- 仓库设置管理
- 自动审查配置
- 仓库列表查询
关键文件:
repositories/
├── routes.rs # 仓库路由
├── repository.rs # 仓库数据访问
└── mod.rs数据库表:
repositories- 仓库信息
配置字段:
enabled- 是否启用review_on_push- Push 时自动审查review_on_pull_request- PR 时自动审查
API 端点:
POST /api/v1/projects/{id}/repositories/imports/githubGET /api/v1/projects/{id}/repositoriesGET /api/v1/repositories/{id}PATCH /api/v1/repositories/{id}
4. Analysis 模块
职责: 代码分析任务管理
主要功能:
- 创建分析任务
- 任务状态管理
- 分析结果查询
- 任务取消和重运行
关键文件:
analysis/
├── routes.rs # 分析路由
├── repository.rs # 分析数据访问
├── model.rs # 分析模型
└── mod.rs数据库表:
analyses- 分析任务信息
任务类型:
security_review- 安全审查code_review- 代码审查full_analysis- 全面分析
任务状态:
submitted → pending → running → completed
↘ failed
↘ cancelledAPI 端点:
POST /api/v1/analysisGET /api/v1/analysisGET /api/v1/analysis/{id}POST /api/v1/analysis/{id}/rerunDELETE /api/v1/analysis/{id}GET /api/v1/analysis/{id}/findingsGET /api/v1/analysis/{id}/requestsGET /api/v1/analysis/{id}/tool-calls
5. Integrations 模块
职责: 第三方服务集成
主要功能:
- GitHub App 安装管理
- GitHub API 同步
- 远程仓库列表
- 权限验证
关键文件:
integrations/
├── routes.rs # 集成路由
├── repository.rs # 集成数据访问
├── github_client.rs # GitHub API 客户端
└── mod.rs数据库表:
github_installations- GitHub App 安装记录
API 端点:
GET /api/v1/integrations/github/install-urlGET /api/v1/integrations/github/callbackGET /api/v1/integrations/github/installationsPOST /api/v1/integrations/github/installations/{id}/syncGET /api/v1/integrations/github/installations/{id}/repositoriesGET /api/v1/integrations/github/installations/{id}/remote-repositories
6. Sessions 模块
职责: Agent 执行会话管理
主要功能:
- 会话生命周期管理
- 会话状态跟踪
- 会话产物关联
关键文件:
sessions/
├── routes.rs # 会话路由
├── repository.rs # 会话数据访问
└── mod.rs数据库表:
sessions- Agent 会话记录
会话状态:
pending- 等待中running- 执行中completed- 已完成failed- 失败cancelled- 已取消
7. Requests 模块
职责: LLM API 请求记录
主要功能:
- 记录 Claude API 请求
- Token 使用统计
- 缓存命中率追踪
关键文件:
requests/
├── routes.rs # 请求路由
├── repository.rs # 请求数据访问
└── mod.rs数据库表:
requests- LLM 请求记录
记录字段:
model- 使用的模型input_tokens- 输入 Token 数output_tokens- 输出 Token 数cached_input_tokens- 缓存命中 Token 数
8. Tool Calls 模块
职责: Agent 工具调用记录
主要功能:
- 记录工具调用历史
- 工具执行状态追踪
- 输入输出记录
关键文件:
tool_calls/
├── routes.rs # 工具调用路由
├── repository.rs # 工具调用数据访问
└── mod.rs数据库表:
tool_calls- 工具调用记录
工具类型 (示例):
read_file- 读取文件write_file- 写入文件execute_command- 执行命令search_code- 搜索代码
9. SSE 模块
职责: 实时事件推送
主要功能:
- 分析任务实时状态推送
- 会话事件流
- 连接管理
关键文件:
sse/
├── routes.rs # SSE 路由
└── mod.rs事件类型:
status_changed- 状态变更progress_updated- 进度更新finding_added- 新增发现session_started- 会话开始session_completed- 会话完成
连接端点:
GET /api/v1/sse/analysis/{id}GET /api/v1/sse/session/{id}
10. Webhooks 模块
职责: 外部事件处理
主要功能:
- GitHub Webhook 接收
- 事件签名验证
- 自动触发分析
关键文件:
webhooks/
├── routes.rs # Webhook 路由
└── mod.rs处理的 GitHub 事件:
push- 代码推送pull_request- PR 事件installation- App 安装installation_repositories- 仓库权限变更
API 端点:
POST /api/v1/webhooks/github
11. Session Artifacts 模块
职责: 会话产物存储
主要功能:
- 存储分析报告
- 存储代码快照
- 产物查询和下载
关键文件:
session_artifacts/
├── routes.rs # 产物路由
├── repository.rs # 产物数据访问
└── mod.rs存储位置:
- Object Store (S3/R2)
产物类型:
review_report- 审查报告code_snapshot- 代码快照diff_analysis- Diff 分析
12. Users 模块
职责: 用户信息管理
主要功能:
- 用户资料查询
- 用户列表(管理员)
- 用户状态管理
关键文件:
users/
├── routes.rs # 用户路由
├── repository.rs # 用户数据访问
└── mod.rs用户角色:
user- 普通用户admin- 管理员system- 系统账户
用户状态:
active- 活跃suspended- 暂停deleted- 已删除
13. Health 模块
职责: 系统健康检查
主要功能:
- 数据库连接检查
- 服务状态检查
API 端点:
GET /health
模块依赖关系
┌─────────────┐
│ Health │ (独立)
└─────────────┘
┌─────────────┐
│ Auth │ ←──┐
└─────────────┘ │
│ │
↓ │
┌─────────────┐ │
│ Users │ │
└─────────────┘ │
│
┌─────────────┐ │
│ Projects │ ←──┤
└─────────────┘ │
│ │
↓ │
┌─────────────┐ │
│Repositories │ ←──┤
└─────────────┘ │
│ │
↓ │
┌─────────────┐ │
│ Analysis │ ←──┘
└─────────────┘
│
├──→ ┌─────────────┐
│ │ Sessions │
│ └─────────────┘
│ │
├──→ ┌─────────────┐
│ │ Requests │
│ └─────────────┘
│ │
├──→ ┌─────────────┐
│ │ Tool Calls │
│ └─────────────┘
│ │
└──→ ┌─────────────┐
│Session │
│Artifacts │
└─────────────┘
┌─────────────┐
│Integrations │ (独立)
└─────────────┘
┌─────────────┐
│ Webhooks │ (独立)
└─────────────┘
┌─────────────┐
│ SSE │ (独立)
└─────────────┘模块间通信
1. 直接依赖
- Analysis 依赖 Repositories
- Repositories 依赖 Projects
- Projects 依赖 Users
2. 数据关联
- Sessions 关联 Analysis
- Requests 关联 Sessions
- Tool Calls 关联 Requests
3. 事件驱动
- Webhooks 触发 Analysis
- Analysis 推送 SSE 事件
模块设计模式
标准模块结构
每个模块遵循统一的结构:
rust
// mod.rs
mod repository;
mod routes;
pub use repository::*;
pub use routes::router;
// routes.rs
use axum::Router;
pub fn router() -> Router<AppState> {
Router::new()
.route("/path", get(handler))
// ...
}
// repository.rs
pub struct XxxRepository {
db: Pool<Postgres>,
}
impl XxxRepository {
pub fn new(db: Pool<Postgres>) -> Self {
Self { db }
}
pub async fn find_by_id(&self, id: Uuid) -> Result<Option<Record>> {
// SQLx query
}
}错误处理模式
每个模块定义自己的 AppError:
rust
struct AppError {
status: StatusCode,
message: String,
}
impl AppError {
fn not_found(msg: impl Into<String>) -> Self { /* ... */ }
fn bad_request(msg: impl Into<String>) -> Self { /* ... */ }
fn db(error: impl Display) -> Self { /* ... */ }
}
impl IntoResponse for AppError {
fn into_response(self) -> Response {
(self.status, Json(json!({ "error": self.message }))).into_response()
}
}