use crate::models::login::Login; use crate::models::token::Token; use crate::request::authorization::{get_token, AuthUser}; use crate::request::error::ApiError; use actix_web::http::header::ContentType; use actix_web::{post, web, HttpResponse, Responder}; use gamenight_database::{DbPool, GetConnection}; impl From for gamenight_database::user::LoginUser { fn from(val: Login) -> Self { gamenight_database::user::LoginUser { username: val.username, password: val.password, } } } #[post("/token")] pub async fn post_token( pool: web::Data, login_data: web::Json, ) -> Result { let data = login_data.into_inner(); if let Ok(Some(user)) = web::block(move || { let mut conn = pool.get_conn(); gamenight_database::login(&mut conn, data.into()) }) .await? { let token = get_token(&user)?; let response = Token { jwt_token: Some(token), }; Ok(HttpResponse::Ok() .content_type(ContentType::json()) .body(serde_json::to_string(&response)?)) } else { Err(ApiError { status: 401, message: "User doesn't exist or password doesn't match".to_string(), }) } } #[post("/refresh_token")] pub async fn post_refresh_token(user: AuthUser) -> Result { let new_token = get_token(&user.0)?; let response = Token { jwt_token: Some(new_token), }; Ok(HttpResponse::Ok() .content_type(ContentType::json()) .body(serde_json::to_string(&response)?)) }