From 5262095beddbb77f4d08b9990338e083e841ef85 Mon Sep 17 00:00:00 2001
From: Paul Makles <paulmakles@gmail.com>
Date: Sun, 26 Jan 2020 15:32:31 +0000
Subject: [PATCH] Finish guards, add channel info route.

---
 src/guards/channel.rs |  2 +-
 src/routes/channel.rs | 34 +++++++++++++++++++++++++++++++++-
 src/routes/mod.rs     |  1 +
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/guards/channel.rs b/src/guards/channel.rs
index 5681ee9..9142c17 100644
--- a/src/guards/channel.rs
+++ b/src/guards/channel.rs
@@ -30,7 +30,7 @@ impl<'r> FromParam<'r> for Channel {
 		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(),
+				ChannelType::try_from(channel.get_i32("type").unwrap() as usize).unwrap(),
 				channel
 			))
 		} else {
diff --git a/src/routes/channel.rs b/src/routes/channel.rs
index c7c8f11..3517c09 100644
--- a/src/routes/channel.rs
+++ b/src/routes/channel.rs
@@ -1,4 +1,4 @@
-use crate::guards::auth::User;
+use crate::guards::{ auth::User, channel::Channel };
 use crate::database;
 
 use rocket_contrib::json::{ Json, JsonValue };
@@ -15,3 +15,35 @@ pub enum ChannelType {
 	GROUP_DM = 1,
 	GUILD_CHANNEL = 2,
 }
+
+fn has_permission(user: &User, target: &Channel) -> bool {
+	let id = user.0.to_string();
+	match target.1 {
+		ChannelType::DM |
+		ChannelType::GROUP_DM => {
+			for user in target.2.get_array("recipients").expect("DB[recipients]") {
+				if user.as_str().expect("Expected string id.") == id {
+					return true;
+				}
+			}
+
+			false
+		},
+		ChannelType::GUILD_CHANNEL =>
+			false
+	}
+}
+
+/// fetch channel information
+#[get("/<target>")]
+pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
+	if !has_permission(&user, &target) {
+		return None
+	}
+
+	Some(
+		json!({
+			"aa": "b"
+		}
+	))
+}
diff --git a/src/routes/mod.rs b/src/routes/mod.rs
index a7ea2ab..b189080 100644
--- a/src/routes/mod.rs
+++ b/src/routes/mod.rs
@@ -8,4 +8,5 @@ pub fn mount(rocket: Rocket) -> Rocket {
 	rocket
 		.mount("/api/account", routes![ account::create, account::verify_email, account::resend_email, account::login ])
 		.mount("/api/users", routes![ user::me, user::user, user::lookup, user::dms, user::dm, user::get_friends, user::get_friend, user::add_friend, user::remove_friend ])
+		.mount("/api/channels", routes![ channel::channel ])
 }
-- 
GitLab