Starting to work on community view

This commit is contained in:
Dessalines 2020-12-04 11:29:44 -05:00
parent 2d4099577f
commit 88d7b0a83c
4 changed files with 67 additions and 2 deletions

View file

@ -5,7 +5,7 @@ use crate::{
use diesel::{dsl::*, result::Error, *}; use diesel::{dsl::*, result::Error, *};
use serde::Serialize; use serde::Serialize;
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize)] #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Clone)]
#[table_name = "category"] #[table_name = "category"]
pub struct Category { pub struct Category {
pub id: i32, pub id: i32,

View file

@ -7,8 +7,9 @@ use crate::{
Joinable, Joinable,
}; };
use diesel::{dsl::*, result::Error, *}; use diesel::{dsl::*, result::Error, *};
use serde::Serialize;
#[derive(Clone, Queryable, Identifiable, PartialEq, Debug)] #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)]
#[table_name = "community"] #[table_name = "community"]
pub struct Community { pub struct Community {
pub id: i32, pub id: i32,

View file

@ -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,
})
}
}

View file

@ -1,2 +1,5 @@
pub mod community_view;
pub mod site_view; pub mod site_view;
pub mod user_view; pub mod user_view;
// TODO Every single aggregate trigger is likely broken, you need to test every one of these out