diff --git a/src/db.rs b/src/db.rs index 26f5123..da6c634 100644 --- a/src/db.rs +++ b/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> { 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) diff --git a/src/main.rs b/src/main.rs index b7e41e4..3bc7ced 100644 --- a/src/main.rs +++ b/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> { 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!" })); + let generator = Arc::new( + generate::TokenGenerator::new() + .with_uppercase(true) + .with_lowercase(true) + .with_numbers(true), + ); - // // 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 state = AppState { db, generator }; - let generator = TokenGenerator::new() - .with_uppercase(true) - .with_lowercase(true) - .with_numbers(true); + // build our application with a single route + let app = Router::new() + .route("/create", get(create_token)) + .with_state(state); - let token = generator.generate(16); - println!("token: {}", token); + // 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 result = db.get_token_info("TestKey1").await.unwrap(); - println!("{:?}", result); + // 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, + Query(args): Query, +) -> (StatusCode, Json) { + 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 { - let date_time = DateTime::parse_from_str(t, "%Y-%m-%d %H:%M:%S")?; +fn add_day(t: &str, days: i64) -> Result { + 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, + generator: Arc, }