From 955e482daef8a00e2ad4c9c4aa2dac964c5f156d Mon Sep 17 00:00:00 2001
From: Paul Makles <paulmakles@gmail.com>
Date: Sun, 26 Jan 2020 15:20:32 +0000
Subject: [PATCH] Add extra guards, begin working on channels.

---
 Cargo.lock               | 41 ++++++++++++++++++++++++++++
 Cargo.toml               |  1 +
 src/{ => guards}/auth.rs |  4 +--
 src/guards/channel.rs    | 58 ++++++++++++++++++++++++++++++++++++++++
 src/guards/mod.rs        |  2 ++
 src/main.rs              |  2 +-
 src/routes/channel.rs    | 12 +++++++++
 src/routes/user.rs       |  2 +-
 8 files changed, 118 insertions(+), 4 deletions(-)
 rename src/{ => guards}/auth.rs (97%)
 create mode 100644 src/guards/channel.rs
 create mode 100644 src/guards/mod.rs

diff --git a/Cargo.lock b/Cargo.lock
index 4e5d179..7076900 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1160,6 +1160,26 @@ dependencies = [
  "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "num_enum"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "once_cell"
 version = "1.3.1"
@@ -1321,6 +1341,14 @@ name = "ppv-lite86"
 version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "proc-macro-error"
 version = "0.2.6"
@@ -1627,6 +1655,7 @@ dependencies = [
  "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mongodb 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "reqwest 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2272,6 +2301,14 @@ dependencies = [
  "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "toml"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "tower-service"
 version = "0.3.0"
@@ -2828,6 +2865,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
 "checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
 "checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
+"checksum num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be601e38e20a6f3d01049d85801cb9b7a34a8da7a0da70df507bbde7735058c8"
+"checksum num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b59f30f6a043f2606adbd0addbf1eef6f2e28e8c4968918b63b7ff97ac0db2a7"
 "checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
 "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
 "checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585"
@@ -2847,6 +2886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
 "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
 "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
+"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e"
 "checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097"
 "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
 "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
@@ -2940,6 +2980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445"
 "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930"
 "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
+"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a"
 "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860"
 "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
 "checksum trust-dns-proto 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05457ece29839d056d8cb66ec080209d34492b3d2e7e00641b486977be973db9"
diff --git a/Cargo.toml b/Cargo.toml
index 4ff41a7..282c0d2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,3 +24,4 @@ chrono = "0.4.10"
 rand = "0.7.3"
 time = "0.2.4"
 reqwest = { version = "0.10.1", features = ["blocking", "json"] }
+num_enum = "0.4.2"
diff --git a/src/auth.rs b/src/guards/auth.rs
similarity index 97%
rename from src/auth.rs
rename to src/guards/auth.rs
index 2e5e9ef..6d60c33 100644
--- a/src/auth.rs
+++ b/src/guards/auth.rs
@@ -33,7 +33,7 @@ impl<'a, 'r> FromRequest<'a, 'r> for User {
 				let result = col.find_one(doc! { "access_token": key }, None).unwrap();
 
 				if let Some(user) = result {
-					Outcome::Success(User(
+					Outcome::Success(User (
 						Ulid::from_string(user.get_str("_id").unwrap()).unwrap(),
 						user.get_str("username").unwrap().to_string(),
 						user
@@ -55,7 +55,7 @@ impl<'r> FromParam<'r> for User {
 		let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap();
 
 		if let Some(user) = result {
-			Ok(User(
+			Ok(User (
 				Ulid::from_string(user.get_str("_id").unwrap()).unwrap(),
 				user.get_str("username").unwrap().to_string(),
 				user
diff --git a/src/guards/channel.rs b/src/guards/channel.rs
new file mode 100644
index 0000000..5681ee9
--- /dev/null
+++ b/src/guards/channel.rs
@@ -0,0 +1,58 @@
+use rocket::Outcome;
+use rocket::http::{ Status, RawStr };
+use rocket::request::{ self, Request, FromRequest, FromParam };
+
+use bson::{ bson, doc, ordered::OrderedDocument };
+use std::convert::TryFrom;
+use ulid::Ulid;
+
+use crate::database;
+use crate::routes::channel::ChannelType;
+
+pub struct Channel (
+	pub Ulid,
+	pub ChannelType,
+	pub OrderedDocument,
+);
+
+pub struct Message (
+	pub Ulid,
+	pub OrderedDocument,
+);
+
+impl<'r> FromParam<'r> for Channel {
+    type Error = &'r RawStr;
+
+    fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
+		let col = database::get_db().collection("channels");
+		let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap();
+
+		if let Some(channel) = result {
+			Ok(Channel (
+				Ulid::from_string(channel.get_str("_id").unwrap()).unwrap(),
+				ChannelType::try_from(channel.get_i32("username").unwrap() as usize).unwrap(),
+				channel
+			))
+		} else {
+			Err(param)
+		}
+    }
+}
+
+impl<'r> FromParam<'r> for Message {
+    type Error = &'r RawStr;
+
+    fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
+		let col = database::get_db().collection("messages");
+		let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap();
+
+		if let Some(message) = result {
+			Ok(Message (
+				Ulid::from_string(message.get_str("_id").unwrap()).unwrap(),
+				message
+			))
+		} else {
+			Err(param)
+		}
+    }
+}
diff --git a/src/guards/mod.rs b/src/guards/mod.rs
new file mode 100644
index 0000000..4ea651a
--- /dev/null
+++ b/src/guards/mod.rs
@@ -0,0 +1,2 @@
+pub mod auth;
+pub mod channel;
diff --git a/src/main.rs b/src/main.rs
index 1c6dc60..1c2738f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,9 +3,9 @@
 #[macro_use] extern crate rocket_contrib;
 
 pub mod database;
+pub mod guards;
 pub mod routes;
 pub mod email;
-pub mod auth;
 
 use dotenv;
 
diff --git a/src/routes/channel.rs b/src/routes/channel.rs
index 7472909..c7c8f11 100644
--- a/src/routes/channel.rs
+++ b/src/routes/channel.rs
@@ -1,3 +1,15 @@
+use crate::guards::auth::User;
+use crate::database;
+
+use rocket_contrib::json::{ Json, JsonValue };
+use serde::{ Serialize, Deserialize };
+use mongodb::options::FindOptions;
+use num_enum::TryFromPrimitive;
+use bson::{ bson, doc };
+use ulid::Ulid;
+
+#[derive(Debug, TryFromPrimitive)]
+#[repr(usize)]
 pub enum ChannelType {
 	DM = 0,
 	GROUP_DM = 1,
diff --git a/src/routes/user.rs b/src/routes/user.rs
index 3ca0284..52f069f 100644
--- a/src/routes/user.rs
+++ b/src/routes/user.rs
@@ -1,4 +1,4 @@
-use crate::auth::User;
+use crate::guards::auth::User;
 use crate::database;
 use crate::routes::channel;
 
-- 
GitLab