feat: 引入 InsertArgs 聚合授权数据并开放 /create API
- 引入 InsertArgs 结构体并替换 insert_authorize 的多参数列表,改用入参聚合方式传递授权数据。 - 启动提供 /create 接口的 API 服务并用数据库保存生成的令牌
This commit is contained in:
24
src/db.rs
24
src/db.rs
@@ -15,6 +15,14 @@ pub struct Authorize {
|
||||
pub insert_time: String,
|
||||
}
|
||||
|
||||
pub(crate) struct InsertArgs {
|
||||
pub project: String,
|
||||
pub key: String,
|
||||
pub device_id: String,
|
||||
pub expire: String,
|
||||
pub insert_time: String,
|
||||
}
|
||||
|
||||
/// 包装类,内部持有 SQLite 连接
|
||||
pub struct Db {
|
||||
client: SqliteClient,
|
||||
@@ -92,18 +100,14 @@ impl Db {
|
||||
/// 插入新的授权数据
|
||||
pub async fn insert_authorize(
|
||||
&self,
|
||||
project: &str,
|
||||
key: &str,
|
||||
device_id: &str,
|
||||
expire: &str,
|
||||
insert_time: &str,
|
||||
args: InsertArgs,
|
||||
) -> Result<i32, Box<dyn std::error::Error>> {
|
||||
let mut auth = Authorize::new();
|
||||
auth.project = project.to_string();
|
||||
auth.key = key.to_string();
|
||||
auth.device_id = device_id.to_string();
|
||||
auth.expire = expire.to_string();
|
||||
auth.insert_time = insert_time.to_string();
|
||||
auth.project = args.project.to_string();
|
||||
auth.key = args.key.to_string();
|
||||
auth.device_id = args.device_id.to_string();
|
||||
auth.expire = args.expire.to_string();
|
||||
auth.insert_time = args.insert_time.to_string();
|
||||
|
||||
let _created = auth.save(&self.client).await?;
|
||||
Ok(auth.id)
|
||||
|
||||
100
src/main.rs
100
src/main.rs
@@ -1,8 +1,12 @@
|
||||
use axum::{
|
||||
extract::{Query, State},
|
||||
http::StatusCode,
|
||||
routing::get,
|
||||
Json, Router,
|
||||
};
|
||||
use chrono::{prelude::*, Duration, ParseError};
|
||||
use std::env;
|
||||
use token_generator::TokenGenerator;
|
||||
|
||||
use axum::{routing::get, Router};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::{env, sync::Arc};
|
||||
use welds::prelude::*;
|
||||
|
||||
mod db;
|
||||
@@ -38,34 +42,88 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
panic!("不支持的操作系统");
|
||||
};
|
||||
|
||||
let db = db::Db::new(db_path).await?;
|
||||
let db = Arc::new(db::Db::new(db_path).await?);
|
||||
|
||||
// // build our application with a single route
|
||||
// let app = Router::new().route("/", get(|| async { "Hello, World!" }));
|
||||
|
||||
// // run our app with hyper, listening globally on port 3000
|
||||
// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
||||
// axum::serve(listener, app).await.unwrap();
|
||||
|
||||
let generator = TokenGenerator::new()
|
||||
let generator = Arc::new(
|
||||
generate::TokenGenerator::new()
|
||||
.with_uppercase(true)
|
||||
.with_lowercase(true)
|
||||
.with_numbers(true);
|
||||
.with_numbers(true),
|
||||
);
|
||||
|
||||
let token = generator.generate(16);
|
||||
println!("token: {}", token);
|
||||
let state = AppState { db, generator };
|
||||
|
||||
let result = db.get_token_info("TestKey1").await.unwrap();
|
||||
println!("{:?}", result);
|
||||
// build our application with a single route
|
||||
let app = Router::new()
|
||||
.route("/create", get(create_token))
|
||||
.with_state(state);
|
||||
|
||||
// run our app with hyper, listening globally on port 3009
|
||||
let listener = tokio::net::TcpListener::bind("127.0.0.1:3009")
|
||||
.await
|
||||
.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
|
||||
// let token = generator.generate(16);
|
||||
// println!("token: {}", token);
|
||||
|
||||
// let result = db.get_token_info("TestKey1").await.unwrap();
|
||||
// println!("{:?}", result);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn create_token(
|
||||
State(state): State<AppState>,
|
||||
Query(args): Query<CreateToken>,
|
||||
) -> (StatusCode, Json<CreateResult>) {
|
||||
let current = get_current_datetime();
|
||||
let exp_time = add_day(¤t, 7).unwrap();
|
||||
|
||||
let token: String = state.generator.generate(16);
|
||||
let _ = state
|
||||
.db
|
||||
.insert_authorize(db::InsertArgs {
|
||||
project: args.project,
|
||||
key: token,
|
||||
device_id: args.device_id,
|
||||
expire: current,
|
||||
insert_time: exp_time,
|
||||
})
|
||||
.await;
|
||||
|
||||
(
|
||||
StatusCode::OK,
|
||||
Json(CreateResult {
|
||||
code: 200,
|
||||
msg: "创建成功".to_owned(),
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
fn get_current_datetime() -> String {
|
||||
Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
|
||||
}
|
||||
|
||||
fn add_day(t: &String, days: i64) -> Result<String, ParseError> {
|
||||
let date_time = DateTime::parse_from_str(t, "%Y-%m-%d %H:%M:%S")?;
|
||||
fn add_day(t: &str, days: i64) -> Result<String, ParseError> {
|
||||
let date_time = NaiveDateTime::parse_from_str(t, "%Y-%m-%d %H:%M:%S")?;
|
||||
let new_time = date_time + Duration::days(days);
|
||||
Ok(new_time.to_string())
|
||||
Ok(new_time.format("%Y-%m-%d %H:%M:%S").to_string())
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct CreateToken {
|
||||
project: String,
|
||||
device_id: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct CreateResult {
|
||||
code: i16,
|
||||
msg: String,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
db: Arc<db::Db>,
|
||||
generator: Arc<generate::TokenGenerator>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user