45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
use actix_web::web::{HttpResponse, Json};
|
|
use actix_web::{post, Responder};
|
|
use chrono::{Duration, Utc};
|
|
use jsonwebtoken::{encode, EncodingKey, Header};
|
|
use log::debug;
|
|
|
|
use crate::data::LoginRequest;
|
|
use crate::data::{secret_key, Claims, CreateAccountRequest, Token};
|
|
use crate::database::{create_user, get_user, user_exists};
|
|
|
|
#[post("/register")]
|
|
async fn register(user: Json<CreateAccountRequest>) -> impl Responder {
|
|
if !user.username.is_empty() && user.password.len() > 5 && user.password == user.confirmation {
|
|
if user_exists(&user.username) {
|
|
HttpResponse::BadRequest()
|
|
} else if let Some(_user) = create_user(&user.username, &user.password) {
|
|
HttpResponse::Ok()
|
|
} else {
|
|
HttpResponse::InternalServerError()
|
|
}
|
|
} else {
|
|
HttpResponse::BadRequest()
|
|
}
|
|
}
|
|
|
|
#[post("/login")]
|
|
async fn login(creds: Json<LoginRequest>) -> impl Responder {
|
|
debug!("Logging in: {}", creds.username);
|
|
if let Some(user) = get_user(&creds.username, &creds.password) {
|
|
let claims = Claims {
|
|
sub: user.id.to_string(),
|
|
exp: (Utc::now() + Duration::days(5)).timestamp(),
|
|
};
|
|
let token = encode(
|
|
&Header::default(),
|
|
&claims,
|
|
&EncodingKey::from_secret(secret_key().as_bytes()),
|
|
)
|
|
.unwrap();
|
|
HttpResponse::Ok().json(Token { token: &token })
|
|
} else {
|
|
HttpResponse::NotFound().finish()
|
|
}
|
|
}
|