From 88d7b0a83ca72f43a639b0e275f10b198e3e9510 Mon Sep 17 00:00:00 2001
From: Dessalines <tyhou13@gmx.com>
Date: Fri, 4 Dec 2020 11:29:44 -0500
Subject: [PATCH] Starting to work on community view

---
 lemmy_db/src/category.rs             |  2 +-
 lemmy_db/src/community.rs            |  3 +-
 lemmy_db/src/views/community_view.rs | 61 ++++++++++++++++++++++++++++
 lemmy_db/src/views/mod.rs            |  3 ++
 4 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 lemmy_db/src/views/community_view.rs

diff --git a/lemmy_db/src/category.rs b/lemmy_db/src/category.rs
index 36beb9ff..af2e7226 100644
--- a/lemmy_db/src/category.rs
+++ b/lemmy_db/src/category.rs
@@ -5,7 +5,7 @@ use crate::{
 use diesel::{dsl::*, result::Error, *};
 use serde::Serialize;
 
-#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize)]
+#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Clone)]
 #[table_name = "category"]
 pub struct Category {
   pub id: i32,
diff --git a/lemmy_db/src/community.rs b/lemmy_db/src/community.rs
index 845b386c..971bbf24 100644
--- a/lemmy_db/src/community.rs
+++ b/lemmy_db/src/community.rs
@@ -7,8 +7,9 @@ use crate::{
   Joinable,
 };
 use diesel::{dsl::*, result::Error, *};
+use serde::Serialize;
 
-#[derive(Clone, Queryable, Identifiable, PartialEq, Debug)]
+#[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
 #[table_name = "community"]
 pub struct Community {
   pub id: i32,
diff --git a/lemmy_db/src/views/community_view.rs b/lemmy_db/src/views/community_view.rs
new file mode 100644
index 00000000..c7b9b398
--- /dev/null
+++ b/lemmy_db/src/views/community_view.rs
@@ -0,0 +1,61 @@
+use crate::{
+  category::Category,
+  community::{Community, CommunityFollower},
+  schema::{category, community, community_follower, user_},
+  user::{UserSafe, User_},
+};
+use diesel::{result::Error, *};
+use serde::Serialize;
+
+#[derive(Debug, Serialize, Clone)]
+pub struct CommunityView {
+  pub community: Community,
+  pub creator: UserSafe,
+  pub category: Category,
+  pub subscribed: bool,
+}
+
+// creator_actor_id -> Text,
+// creator_local -> Bool,
+// creator_name -> Varchar,
+// creator_preferred_username -> Nullable<Varchar>,
+// creator_avatar -> Nullable<Text>,
+// category_name -> Varchar,
+// number_of_subscribers -> BigInt,
+// number_of_posts -> BigInt,
+// number_of_comments -> BigInt,
+// hot_rank -> Int4,
+// user_id -> Nullable<Int4>,
+// subscribed -> Nullable<Bool>,
+
+impl CommunityView {
+  pub fn read(
+    conn: &PgConnection,
+    community_id: i32,
+    my_user_id: Option<i32>,
+  ) -> Result<Self, Error> {
+    let subscribed = match my_user_id {
+      Some(user_id) => {
+        let res = community_follower::table
+          .filter(community_follower::community_id.eq(community_id))
+          .filter(community_follower::user_id.eq(user_id))
+          .get_result::<CommunityFollower>(conn);
+        res.is_ok()
+      }
+      None => false,
+    };
+
+    let (community, creator, category) = community::table
+      .find(community_id)
+      .inner_join(user_::table)
+      .inner_join(category::table)
+      .first::<(Community, User_, Category)>(conn)?;
+
+    Ok(CommunityView {
+      community,
+      creator: creator.to_safe(),
+      category,
+      subscribed,
+    })
+  }
+}
diff --git a/lemmy_db/src/views/mod.rs b/lemmy_db/src/views/mod.rs
index cd68cfe0..c092e8ec 100644
--- a/lemmy_db/src/views/mod.rs
+++ b/lemmy_db/src/views/mod.rs
@@ -1,2 +1,5 @@
+pub mod community_view;
 pub mod site_view;
 pub mod user_view;
+
+// TODO Every single aggregate trigger is likely broken, you need to test every one of these out
-- 
2.44.1