diff options
author | Dessalines <happydooby@gmail.com> | 2019-04-09 23:19:12 -0700 |
---|---|---|
committer | Dessalines <happydooby@gmail.com> | 2019-04-09 23:19:12 -0700 |
commit | 8e5a5d17a877e4167ab8e71253a1c8efbd5f6375 (patch) | |
tree | 4e78de81b7a58912c7261f70992767ab0aa900a2 /server | |
parent | cbd1d67fea1d012830784594da6c0c210b68bd7b (diff) |
Adding trending communities.
- Fixes #29
- Communities fetching now has sort and limit.
Diffstat (limited to 'server')
-rw-r--r-- | server/src/actions/community_view.rs | 25 | ||||
-rw-r--r-- | server/src/websocket_server/server.rs | 6 |
2 files changed, 23 insertions, 8 deletions
diff --git a/server/src/actions/community_view.rs b/server/src/actions/community_view.rs index 185484bf..cb89b226 100644 --- a/server/src/actions/community_view.rs +++ b/server/src/actions/community_view.rs @@ -2,6 +2,7 @@ extern crate diesel; use diesel::*; use diesel::result::Error; use serde::{Deserialize, Serialize}; +use {SortType}; table! { community_view (id) { @@ -83,17 +84,27 @@ impl CommunityView { query.first::<Self>(conn) } - pub fn list_all(conn: &PgConnection, from_user_id: Option<i32>) -> Result<Vec<Self>, Error> { + pub fn list(conn: &PgConnection, from_user_id: Option<i32>, sort: SortType, limit: Option<i64>) -> Result<Vec<Self>, Error> { use actions::community_view::community_view::dsl::*; let mut query = community_view.into_boxed(); + + // The view lets you pass a null user_id, if you're not logged in - if let Some(from_user_id) = from_user_id { - query = query.filter(user_id.eq(from_user_id)) - .order_by((subscribed.desc(), number_of_subscribers.desc())); - } else { - query = query.filter(user_id.is_null()) - .order_by(number_of_subscribers.desc()); + + match sort { + SortType::New => query = query.order_by(published.desc()).filter(user_id.is_null()), + SortType::TopAll => { + match from_user_id { + Some(from_user_id) => query = query.filter(user_id.eq(from_user_id)).order_by((subscribed.desc(), number_of_subscribers.desc())), + None => query = query.order_by(number_of_subscribers.desc()).filter(user_id.is_null()) + } + } + _ => () + }; + + if let Some(limit) = limit { + query = query.limit(limit); }; query.load::<Self>(conn) diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs index 42124d2d..137761ab 100644 --- a/server/src/websocket_server/server.rs +++ b/server/src/websocket_server/server.rs @@ -111,6 +111,8 @@ pub struct CommunityResponse { #[derive(Serialize, Deserialize)] pub struct ListCommunities { + sort: String, + limit: Option<i64>, auth: Option<String> } @@ -675,7 +677,9 @@ impl Perform for ListCommunities { None => None }; - let communities: Vec<CommunityView> = CommunityView::list_all(&conn, user_id).unwrap(); + let sort = SortType::from_str(&self.sort).expect("listing sort"); + + let communities: Vec<CommunityView> = CommunityView::list(&conn, user_id, sort, self.limit).unwrap(); // Return the jwt serde_json::to_string( |