From f48bbd76b0b4d80e5b9e2df6e4e328b2211b8f63 Mon Sep 17 00:00:00 2001
From: Paul Makles <paulmakles@gmail.com>
Date: Sat, 8 Feb 2020 12:36:37 +0000
Subject: [PATCH] Begin work on proper database schema.

---
 src/{database.rs => database/mod.rs} |  2 ++
 src/database/user.rs                 | 29 ++++++++++++++++++++++++++++
 src/routes/account.rs                | 14 ++++++++------
 src/routes/channel.rs                |  5 ++++-
 4 files changed, 43 insertions(+), 7 deletions(-)
 rename src/{database.rs => database/mod.rs} (97%)
 create mode 100644 src/database/user.rs

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 551688e..a2b0e33 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 0000000..1e869e2
--- /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 7e0aedd..bf7b694 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 3517c09..ed36ee8 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
 		}
 	))
 }
-- 
GitLab