use actix_web::http::header::ContentType; use actix_web::{web, post, HttpResponse, Responder, get}; use validator::ValidateArgs; use crate::DbPool; use crate::request::requests::{Login, Register}; use crate::request::error::ApiError; use crate::request::responses::LoginResponse; use crate::request::authorization::get_token; use crate::util::GetConnection; use crate::schema::{self}; use serde_json; impl Into for Login { fn into(self) -> schema::user::LoginUser { schema::user::LoginUser { username: self.username, password: self.password } } } impl Into for Register { fn into(self) -> schema::user::Register { schema::user::Register { email: self.email, username: self.username, password: self.password } } } #[get("/token")] pub async fn login(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(); schema::login(&mut conn, data.into()) }) .await? { let token = get_token(&user)?; let response = LoginResponse::success(user.id, 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("/user")] pub async fn register(pool: web::Data, register_data: web::Json) -> Result { web::block(move || -> Result<(), ApiError> { register_data.validate_args((&pool, &pool))?; let register_request = register_data.into_inner().into(); let mut conn = pool.get_conn(); schema::register(&mut conn, register_request)?; Ok(()) }).await??; return Ok(HttpResponse::Ok()) }