diff --git a/server/src/members.rs b/server/src/members.rs index 7875438..b8af820 100644 --- a/server/src/members.rs +++ b/server/src/members.rs @@ -1,48 +1,97 @@ -use mysql_async::{Pool, Conn}; -use crate::badges::Badge; -use crate::err::DbError; +use chrono::Utc; +use hyper::{Body, Response, StatusCode}; +use hyper::header::{HeaderName, HeaderValue}; +use mysql_async::{Conn, Pool}; +use mysql_async::prelude::{params, Queryable}; +use mysql_async::error::Error as SQLError; +use serde_json::Value; + +use crate::db_types::{UBigInt, BigInt, Integer, VarChar}; pub struct Member { - id: u64, - name: String, - permissions: u64, - badges: Option>, + id: UBigInt, + secret: VarChar, + name: VarChar, + joindate: BigInt, + status: Integer, + permissions: UBigInt, +} + +impl Member { + pub fn to_json(&self) -> String { + unimplemented!() + } } struct InsertableMember<'n> { name: &'n str, permissions: u64, - badges: Option> } +impl<'n> InsertableMember<'n> { + fn new(name: &'n str) -> InsertableMember<'n> { + use crate::perms::{JOIN_VOICE, SEND_MESSAGES}; -async fn insert_new_member<'nm>(conn: &Conn, name: &'nm str) - -> Result> { - // Updates both the members and keys table accordingly - use crate::perms::{JOIN_VOICE, SEND_MESSAGES}; - let m = InsertableMember { - name: name, - permissions: JOIN_VOICE | SEND_MESSAGES, // can join voice and send messages by default - badges: None - }; - // TODO: this stuff once the invites/ user generation to be done -// conn.batch_exec( -// r"INSERT INTO `members` (name, status)", -// params!{ -// "name" => name, -// "join" -// } -// ).await; - Err(DbError::from("Could not create user")) -} - -#[cfg(test)] -mod members_tests { - use mysql_async::{Pool, Conn}; - use std::env::var; - use dotenv::dotenv; - #[test] - fn db_create_member() { - let conn = Pool::new(&var("DATABASE_URL").unwrap()).get_conn(); - + let now: BigInt = Utc::now().timestamp_millis(); + let default_perms = JOIN_VOICE | SEND_MESSAGES; + InsertableMember { + name: name, + permissions: default_perms, + } } -} \ No newline at end of file +} + +async fn insert_new_member<'nm>(conn: Conn, mem: InsertableMember<'nm>) + -> Result { + // standard insertion with no checks, those should be done before we get here + // in theory only 500's should happen here assuming we did everything else right + let conn = conn.batch_exec( + "INSERT INTO `members` () ", + mysql_async::params!{ + "name" => mem.name, + "permissions" => mem.permissions, + /*"badges" => mem.permissions*/ // not used yet as we have no serializer + }).await?; + + type MemberRow = (UBigInt, VarChar, VarChar, BigInt, Integer, UBigInt); + let (conn, row): (Conn, Option) = conn.first_exec( + "SELECT * from `members` WHERE `secret` = :secret ", + params!{ + "secret" => mem.name + }).await?; + + Ok(Member { + id: 0, + secret: "secret".into(), + name: "String".into(), + joindate: 123, + status: 69, + permissions: 0, + }) +} + +async fn general_new_user(p: &Pool, resp: &mut Response, params: Value) { + /* + * @name: string => desired default name + */ + let default_name = serde_json::json!("NewUser"); + let name = params.get("name") + .unwrap_or(&default_name) + .as_str().unwrap_or("NewUser"); + + let pre_mem = InsertableMember::new(name); + if let Ok(conn) = p.get_conn().await { + match insert_new_member(conn, pre_mem).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(new_member.to_json()); + }, + Err(_) => { + *resp.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + *resp.body_mut() = Body::from("Could not process input"); + } + } + } +}