From 88d7b0a83ca72f43a639b0e275f10b198e3e9510 Mon Sep 17 00:00:00 2001 From: Dessalines 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 36beb9ff6..af2e72265 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 845b386c2..971bbf248 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 000000000..c7b9b398b --- /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, +// creator_avatar -> Nullable, +// category_name -> Varchar, +// number_of_subscribers -> BigInt, +// number_of_posts -> BigInt, +// number_of_comments -> BigInt, +// hot_rank -> Int4, +// user_id -> Nullable, +// subscribed -> Nullable, + +impl CommunityView { + pub fn read( + conn: &PgConnection, + community_id: i32, + my_user_id: Option, + ) -> Result { + 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::(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 cd68cfe0a..c092e8ec3 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