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) -> 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) -> 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() } }