diff --git a/src/database.rs b/src/database/mod.rs similarity index 97% rename from src/database.rs rename to src/database/mod.rs index 551688ec32267e9e68597ade5c4dad6e96ae2a9e..a2b0e33ece1f4f8d96ad13b8fa9d937f250c004f 100644 --- a/src/database.rs +++ b/src/database/mod.rs @@ -23,3 +23,5 @@ pub fn get_db() -> Database { pub fn get_collection(collection: &str) -> Collection { get_db().collection(collection) } + +pub mod user; \ No newline at end of file diff --git a/src/database/user.rs b/src/database/user.rs new file mode 100644 index 0000000000000000000000000000000000000000..1e869e2af8082d5e5e7e764eb373142655d50de8 --- /dev/null +++ b/src/database/user.rs @@ -0,0 +1,29 @@ +use serde::{ Deserialize, Serialize }; +use bson::UtcDateTime; + +#[derive(Serialize, Deserialize, Debug)] +pub struct UserEmailVerification { + pub verified: bool, + pub target: Option<String>, + pub expiry: Option<UtcDateTime>, + pub rate_limit: Option<UtcDateTime>, + pub code: Option<String>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct UserRelationship { + pub id: String, + pub status: u8, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct User { + #[serde(rename = "_id")] + pub id: String, + pub email: String, + pub username: String, + pub password: String, + pub access_token: Option<String>, + pub email_verification: UserEmailVerification, + pub relations: Option<Vec<UserRelationship>>, +} diff --git a/src/routes/account.rs b/src/routes/account.rs index 7e0aedd045fcf3ef4465de78b3691954a679e75a..bf7b694044bf448cfe6f631f340496137f2ee60b 100644 --- a/src/routes/account.rs +++ b/src/routes/account.rs @@ -1,9 +1,9 @@ use crate::database; use crate::email; +use bson::{ bson, doc, Bson::UtcDatetime, from_bson}; use rand::{ Rng, distributions::Alphanumeric }; use rocket_contrib::json::{ Json, JsonValue }; -use bson::{ bson, doc, Bson::UtcDatetime }; use serde::{ Serialize, Deserialize }; use validator::validate_email; use bcrypt::{ hash, verify }; @@ -243,16 +243,18 @@ pub fn login(info: Json<Login>) -> JsonValue { if let Some(u) = col.find_one(doc! { "email": info.email.clone() }, None).expect("Failed user lookup") { - match verify(info.password.clone(), u.get_str("password").expect("DOC[password]")) + let user: database::user::User = from_bson(bson::Bson::Document(u)).expect("Failed to unwrap user."); + + match verify(info.password.clone(), &user.password) .expect("Failed to check hash of password.") { true => { let token = - match u.get_str("access_token") { - Ok(t) => t.to_string(), - Err(_) => { + match user.access_token { + Some(t) => t.to_string(), + None => { let token = gen_token(92); col.update_one( - doc! { "_id": u.get_str("_id").expect("DOC[id]") }, + doc! { "_id": &user.id }, doc! { "$set": { "access_token": token.clone() } }, None ).expect("Failed to update user object"); diff --git a/src/routes/channel.rs b/src/routes/channel.rs index 3517c09203b3bc5696b3353d569c3d2bc6ba2a6f..ed36ee80ce7f9b07fb40aa0a2fd68d514a5df47e 100644 --- a/src/routes/channel.rs +++ b/src/routes/channel.rs @@ -41,9 +41,12 @@ pub fn channel(user: User, target: Channel) -> Option<JsonValue> { return None } + let Channel ( id, channel_type, doc ) = target; + Some( json!({ - "aa": "b" + "id": id.to_string(), + "type": channel_type as u8 } )) }