summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorDessalines <happydooby@gmail.com>2019-04-09 23:19:12 -0700
committerDessalines <happydooby@gmail.com>2019-04-09 23:19:12 -0700
commit8e5a5d17a877e4167ab8e71253a1c8efbd5f6375 (patch)
tree4e78de81b7a58912c7261f70992767ab0aa900a2 /server
parentcbd1d67fea1d012830784594da6c0c210b68bd7b (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.rs25
-rw-r--r--server/src/websocket_server/server.rs6
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(