feat: 优化数据库查询并新增项目令牌查询功能及路由
- 优化数据库查询逻辑,修复可变引用问题并新增项目令牌查询功能。 - 添加一个新的路由 `/all` 和对应的处理函数 `get_project_token`,用于查询项目令牌信息,并定义相关的请求参数和响应结构体。
This commit is contained in:
20
src/db.rs
20
src/db.rs
@@ -152,14 +152,14 @@ impl Db {
|
||||
token: &str,
|
||||
state: i8,
|
||||
) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> {
|
||||
let rows = Authorize::all()
|
||||
let mut rows = Authorize::all()
|
||||
.where_col(|a| a.token.equal(token))
|
||||
.run(&self.client)
|
||||
.await?;
|
||||
if rows.is_empty() {
|
||||
return Ok(false);
|
||||
}
|
||||
for mut row in rows {
|
||||
for row in &mut rows {
|
||||
row.disable = state;
|
||||
row.save(&self.client).await?;
|
||||
}
|
||||
@@ -202,10 +202,18 @@ impl Db {
|
||||
|
||||
// 用Projects结构体来收集查询到的结果
|
||||
let result: Vec<Projects> = rows.collect_into()?;
|
||||
let mut projects:Vec<String> = Vec::new();
|
||||
for row in result {
|
||||
projects.push(row.project);
|
||||
Ok(result.into_iter().map(|r| r.project).collect())
|
||||
}
|
||||
Ok(projects)
|
||||
|
||||
pub async fn query_project_token(
|
||||
&self,
|
||||
project: &str,
|
||||
) -> Result<Vec<Authorize>, Box<dyn std::error::Error + Send + Sync>> {
|
||||
let rows = Authorize::all()
|
||||
.where_col(|a| a.project.equal(project))
|
||||
.run(&self.client)
|
||||
.await?;
|
||||
|
||||
Ok(rows.into_iter().map(|r| r.into_inner()).collect())
|
||||
}
|
||||
}
|
||||
|
||||
27
src/main.rs
27
src/main.rs
@@ -36,6 +36,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
.route("/reset", get(update_token_status))
|
||||
.route("/renewal", get(renewal_token))
|
||||
.route("/project", get(get_projects))
|
||||
.route("/all", get(get_project_token))
|
||||
.with_state(state);
|
||||
|
||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3009").await?;
|
||||
@@ -230,6 +231,21 @@ async fn get_projects(
|
||||
)
|
||||
}
|
||||
|
||||
async fn get_project_token(
|
||||
State(state): State<AppState>,
|
||||
Query(args): Query<QueryProject>,
|
||||
) -> (StatusCode, Json<ProjectToken>) {
|
||||
let items = state.db.query_project_token(&args.project).await.unwrap();
|
||||
|
||||
(
|
||||
StatusCode::OK,
|
||||
Json(ProjectToken {
|
||||
code: 200,
|
||||
data: items,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
fn get_current_datetime() -> String {
|
||||
Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
|
||||
}
|
||||
@@ -284,6 +300,11 @@ struct RenewalToken {
|
||||
days: i64,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct QueryProject {
|
||||
project: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct VerifyResult {
|
||||
code: i16,
|
||||
@@ -334,3 +355,9 @@ struct ProjectResponse {
|
||||
code: i32,
|
||||
projects: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct ProjectToken {
|
||||
code: i32,
|
||||
data: Vec<db::Authorize>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user