use crate::models::User; use crate::response::JsonAPIResponse; use crate::AppState; use actix_web::post; use actix_web::web::{Data, Json}; use argon2::Argon2; use diesel_async::RunQueryDsl; use password_hash::{PasswordHash, SaltString}; use rand::rngs::OsRng; use serde::{Deserialize, Serialize}; #[derive(Deserialize)] pub struct SignupRequest { pub username: String, pub password: String, } #[derive(Serialize, Debug)] pub struct SignupResponse { pub id: i64, } #[post("/signup")] pub async fn signup_req( req: Json, state: Data, ) -> JsonAPIResponse { let mut conn = handle_error!(state.pool.get().await); let user_id = { handle_error!(state.idgen.lock()).real_time_generate() }; let salt = SaltString::generate(&mut OsRng); let hash = handle_error!(PasswordHash::generate( Argon2::default(), req.password.as_bytes(), &salt )); let new_user = User { id: user_id, username: req.username.to_string(), password_hash: hash.to_string(), permission_level: 0, }; handle_error!( diesel::insert_into(crate::schema::users::table) .values(&new_user) .execute(&mut conn) .await ); ok!(SignupResponse { id: user_id }) }