87 lines
2.8 KiB
Rust
87 lines
2.8 KiB
Rust
use chrono::Utc;
|
|
use hyper::{Body, Response, StatusCode};
|
|
use hyper::header::{HeaderName, HeaderValue};
|
|
use mysql_async::{Conn, Pool, error::Error as MySqlError};
|
|
use mysql_async::prelude::{params, Queryable};
|
|
use serde_json::Value;
|
|
use serde::Serialize;
|
|
|
|
use crate::db_types::{UBigInt, BigInt, Integer, VarChar};
|
|
use crate::auth;
|
|
|
|
#[derive(Serialize)]
|
|
pub struct Member {
|
|
pub id: UBigInt,
|
|
pub secret: VarChar,
|
|
pub name: VarChar,
|
|
pub joindate: BigInt,
|
|
pub status: Integer,
|
|
pub permissions: UBigInt,
|
|
}
|
|
|
|
|
|
pub async fn insert_new_member(p: &Pool, name: VarChar, perms: u64) -> Result<Member, MySqlError> {
|
|
use crate::auth::generate_secret;
|
|
|
|
let conn: Conn = p.get_conn().await?;
|
|
let secret_raw: String = generate_secret();
|
|
let secret = match bcrypt::hash(&secret_raw, auth::BCRYPT_COST) {
|
|
Ok(value) => value,
|
|
Err(e) => panic!("\tCould not insert member due to bcrypt failure:\n\t\t{}",e)
|
|
};
|
|
let now: BigInt = Utc::now().timestamp();
|
|
|
|
let conn = conn.drop_exec(
|
|
"INSERT INTO members(secret, name, joindate, status, permissions)
|
|
VALUES(:secret, :name, :joindate, :status, :permissions)",
|
|
mysql_async::params!{
|
|
"secret" => secret.clone(),
|
|
"name" => name.clone(),
|
|
"joindate" => now,
|
|
"status" => 0,
|
|
"permissions" => perms
|
|
}).await?;
|
|
|
|
// now pull back the user from our db and return that row
|
|
let db_row_result: (Conn, Option<UBigInt>) = conn.first_exec(
|
|
"SELECT id FROM members WHERE secret = :secret",
|
|
params!{
|
|
"secret" => secret.clone()
|
|
}).await?;
|
|
|
|
Ok(Member {
|
|
id: db_row_result.1.unwrap(), // if we made it this far this shouldn't fail (i hope)
|
|
secret: secret_raw,
|
|
name: name,
|
|
joindate: now,
|
|
status: 0,
|
|
permissions: perms
|
|
})
|
|
}
|
|
|
|
async fn general_new_user(p: &Pool, resp: &mut Response<Body>, params: Value) {
|
|
/*
|
|
* @name: string => desired default name
|
|
*/
|
|
use crate::perms;
|
|
let default_name = serde_json::json!("NewUser");
|
|
let name = params.get("name")
|
|
.unwrap_or(&default_name)
|
|
.as_str().unwrap_or("NewUser");
|
|
|
|
match insert_new_member(p, name.to_string(), perms::GENERAL_NEW).await {
|
|
Ok(new_member) => {
|
|
*resp.status_mut() = StatusCode::OK;
|
|
let json_hdr_name = HeaderName::from_static("Content-Type");
|
|
let json_hdr_val = HeaderValue::from_static("application/json");
|
|
resp.headers_mut().insert(json_hdr_name, json_hdr_val);
|
|
*resp.body_mut() = Body::from(serde_json::to_string(&new_member).unwrap());
|
|
},
|
|
Err(_) => {
|
|
*resp.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
|
|
*resp.body_mut() = Body::from("Could not process input");
|
|
}
|
|
}
|
|
}
|
|
|