abuelo/src/routes.rs
2024-11-23 14:27:33 +05:00

105 lines
3.2 KiB
Rust

use chrono::{DateTime, Utc};
use warp::Filter;
use crate::database::Database;
pub fn get_routes() -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
create_user().or(auth_user()).or(get_user())
}
#[derive(serde::Serialize, serde::Deserialize)]
struct UserCreateRequest {
username: String,
password: String,
}
#[derive(serde::Serialize, serde::Deserialize)]
struct UserCreateResponse {
success: bool,
message: String,
}
fn create_user() -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::post()
.and(warp::path!("user" / "create"))
.and(warp::body::json())
.map(|body: UserCreateRequest| {
let db = Database::new();
let result = db.add_user(&body.username, &body.password);
let reply = if result.is_ok() {
UserCreateResponse {
success: true,
message: "".to_string(),
}
} else {
UserCreateResponse {
success: false,
message: format!("{:#?}", result.unwrap_err()),
}
};
warp::reply::json(&reply)
})
}
#[derive(serde::Serialize, serde::Deserialize)]
struct UserGetResponse {
success: bool,
message: String,
creation_time: Option<DateTime<Utc>>,
premium: Option<bool>,
}
fn get_user() -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::get()
.and(warp::path!("user" / String))
.map(|username: String| {
let db = Database::new();
let acc = db.get_user(&username);
let reply = if acc.is_err() {
UserGetResponse {
success: false,
message: format!("{}", acc.unwrap_err()),
creation_time: None,
premium: None,
}
} else {
let acc = acc.unwrap();
UserGetResponse {
success: false,
message: "".to_string(),
creation_time: Some(acc.creation_time()),
premium: Some(acc.premium()),
}
};
warp::reply::json(&reply)
})
}
#[derive(serde::Serialize, serde::Deserialize)]
struct UserAuthRequest {
username: String,
password: String,
}
#[derive(serde::Serialize, serde::Deserialize)]
struct UserAuthResponse {
success: bool,
message: String,
}
fn auth_user() -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::post()
.and(warp::path!("user" / "auth"))
.and(warp::body::json())
.map(|body: UserAuthRequest| {
let db = Database::new();
let reply = if db.check_login(&body.username, &body.password) {
UserAuthResponse {
success: true,
message: "".to_string(),
}
} else {
UserAuthResponse {
success: false,
message: "Username or Password is invalid".to_string(),
}
};
warp::reply::json(&reply)
})
}