Phase 0: 知识库
- docs/knowledge-base/loco-rs-patterns.md — loco-rs 10 个可借鉴模式研究
Phase 1: 数据层重构
- crates/zclaw-saas/src/models/ — 15 个 FromRow 类型化模型
- Login 3 次查询合并为 1 次 AccountLoginRow 查询
- 所有 service 文件从元组解构迁移到 FromRow 结构体
Phase 2: Worker + Scheduler 系统
- crates/zclaw-saas/src/workers/ — Worker trait + 5 个具体实现
- crates/zclaw-saas/src/scheduler.rs — TOML 声明式调度器
- crates/zclaw-saas/src/tasks/ — CLI 任务系统
Phase 3: 性能修复
- Relay N+1 查询 → 精准 SQL (relay/handlers.rs)
- Config RwLock → AtomicU32 无锁 rate limit (state.rs, middleware.rs)
- SSE std::sync::Mutex → tokio::sync::Mutex (relay/service.rs)
- /auth/refresh 阻塞清理 → Scheduler 定期执行
Phase 4: 多环境配置
- config/saas-{development,production,test}.toml
- ZCLAW_ENV 环境选择 + ZCLAW_SAAS_CONFIG 精确覆盖
- scheduler 配置集成到 TOML
36 lines
983 B
Rust
36 lines
983 B
Rust
//! 角色权限查询处理函数
|
|
|
|
use axum::{
|
|
extract::{Extension, Path, State},
|
|
Json,
|
|
};
|
|
use crate::state::AppState;
|
|
use crate::error::{SaasError, SaasResult};
|
|
use crate::auth::types::AuthContext;
|
|
use crate::auth::handlers::check_permission;
|
|
|
|
/// GET /api/v1/roles/:id/permissions - 获取角色权限列表
|
|
pub async fn get_role_permissions(
|
|
State(state): State<AppState>,
|
|
Path(id): Path<String>,
|
|
Extension(ctx): Extension<AuthContext>,
|
|
) -> SaasResult<Json<Vec<String>>> {
|
|
check_permission(&ctx, "account:read")?;
|
|
|
|
let row: Option<(String,)> = sqlx::query_as(
|
|
"SELECT permissions FROM roles WHERE id = $1"
|
|
)
|
|
.bind(&id)
|
|
.fetch_optional(&state.db)
|
|
.await
|
|
.map_err(|e| SaasError::Database(e))?;
|
|
|
|
let permissions_str = row
|
|
.ok_or_else(|| SaasError::NotFound(format!("角色 {} 不存在", id)))?
|
|
.0;
|
|
|
|
let permissions: Vec<String> = serde_json::from_str(&permissions_str)?;
|
|
|
|
Ok(Json(permissions))
|
|
}
|