diff --git a/src/database/guild.rs b/src/database/guild.rs
index 979b63323b7950a0986eef90d14a400d663439eb..7a4155bf218c10ba6ca551124006a202dc380ac7 100644
--- a/src/database/guild.rs
+++ b/src/database/guild.rs
@@ -1,48 +1,6 @@
 use bson::doc;
 use serde::{Deserialize, Serialize};
 
-use super::get_collection;
-use mongodb::options::FindOneOptions;
-
-pub fn find_member_permissions<C: Into<Option<String>>>(
-    id: String,
-    guild: String,
-    _channel: C,
-) -> u32 {
-    let col = get_collection("guilds");
-
-    match col.find_one(
-        doc! {
-            "_id": &guild,
-            "members": {
-                "$elemMatch": {
-                    "id": &id,
-                }
-            }
-        },
-        FindOneOptions::builder()
-            .projection(doc! {
-                "members.$": 1,
-                "owner": 1,
-                "default_permissions": 1,
-            })
-            .build(),
-    ) {
-        Ok(result) => {
-            if let Some(doc) = result {
-                if doc.get_str("owner").unwrap() == id {
-                    return u32::MAX;
-                }
-
-                doc.get_i32("default_permissions").unwrap() as u32
-            } else {
-                0
-            }
-        }
-        Err(_) => 0,
-    }
-}
-
 #[derive(Serialize, Deserialize, Debug)]
 pub struct Member {
     pub id: String,
diff --git a/src/guards/guild.rs b/src/guards/guild.rs
index 268740eed1497305bbea2c7823e7a7cd59ae0737..6e2aeb6069f0eac5a8f5c334d50656d5d2a28b3e 100644
--- a/src/guards/guild.rs
+++ b/src/guards/guild.rs
@@ -11,8 +11,11 @@ use crate::database::guild::Guild;
 pub struct GuildRef {
     #[serde(rename = "_id")]
     pub id: String,
-
+    pub name: String,
+    pub description: String,
     pub owner: String,
+
+    pub channels: Vec<String>,
     pub default_permissions: i32,
 }
 
@@ -22,7 +25,10 @@ impl GuildRef {
             doc! { "_id": id },
             FindOneOptions::builder()
                 .projection(doc! {
+                    "name": 1,
+                    "description": 1,
                     "owner": 1,
+                    "channels": 1,
                     "default_permissions": 1
                 })
                 .build(),
diff --git a/src/routes/guild.rs b/src/routes/guild.rs
index 00ca963001af2b94d101da07e3dd1b4b0f2f5794..daadfee13521864d9244b80a76b083210a8f1b08 100644
--- a/src/routes/guild.rs
+++ b/src/routes/guild.rs
@@ -1,17 +1,27 @@
+use super::channel::ChannelType;
 use super::Response;
-use crate::database::{
-    self,
-    channel::Channel,
-    guild::{find_member_permissions, Guild},
-};
+use crate::database::{self, channel::Channel, PermissionCalculator};
 use crate::guards::auth::UserRef;
+use crate::guards::guild::GuildRef;
 
 use bson::{doc, from_bson, Bson};
 use rocket_contrib::json::Json;
 use serde::{Deserialize, Serialize};
 use ulid::Ulid;
 
-use super::channel::ChannelType;
+macro_rules! with_permissions {
+    ($user: expr, $target: expr) => {{
+        let permissions = PermissionCalculator::new($user.clone())
+            .guild($target.clone())
+            .as_permission();
+
+        if !permissions.get_access() {
+            return None;
+        }
+
+        permissions
+    }};
+}
 
 /// fetch your guilds
 #[get("/@me")]
@@ -46,10 +56,8 @@ pub fn my_guilds(user: UserRef) -> Response {
 
 /// fetch a guild
 #[get("/<target>")]
-pub fn guild(user: UserRef, target: Guild) -> Option<Response> {
-    if find_member_permissions(user.id.clone(), target.id.clone(), None) == 0 {
-        return None;
-    }
+pub fn guild(user: UserRef, target: GuildRef) -> Option<Response> {
+    with_permissions!(user, target);
 
     let mut targets = vec![];
     for channel in target.channels {