diff options
author | Dessalines <happydooby@gmail.com> | 2019-04-03 16:01:20 -0700 |
---|---|---|
committer | Dessalines <happydooby@gmail.com> | 2019-04-03 16:01:20 -0700 |
commit | 7b1fb030b306306ed65999bff05a5d0924a37158 (patch) | |
tree | a127d44c9a2d8d94312a4017a6904e69b6ed3125 /server | |
parent | 81da0853aa460da0e277edfccfde9fcdf9334f31 (diff) |
Adding a sidebar, title, and forum categories
- Adding a Sidebar component
- Starting on forum categories. #17
- Adding a Sidebar and title to community. Fixes #16
Diffstat (limited to 'server')
-rw-r--r-- | server/migrations/2019-04-03-155205_create_community_view/up.sql | 1 | ||||
-rw-r--r-- | server/src/actions/category.rs | 73 | ||||
-rw-r--r-- | server/src/actions/community.rs | 7 | ||||
-rw-r--r-- | server/src/actions/community_view.rs | 51 | ||||
-rw-r--r-- | server/src/actions/mod.rs | 2 | ||||
-rw-r--r-- | server/src/actions/post_view.rs | 6 | ||||
-rw-r--r-- | server/src/actions/user.rs | 4 | ||||
-rw-r--r-- | server/src/bin/main.rs | 2 | ||||
-rw-r--r-- | server/src/websocket_server/server.rs | 89 |
9 files changed, 199 insertions, 36 deletions
diff --git a/server/migrations/2019-04-03-155205_create_community_view/up.sql b/server/migrations/2019-04-03-155205_create_community_view/up.sql index e731b7f2..74972507 100644 --- a/server/migrations/2019-04-03-155205_create_community_view/up.sql +++ b/server/migrations/2019-04-03-155205_create_community_view/up.sql @@ -1,6 +1,7 @@ create view community_view as select *, (select name from user_ u where c.creator_id = u.id) as creator_name, +(select name from category ct where c.category_id = ct.id) as category_name, (select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, (select count(*) from post p where p.community_id = c.id) as number_of_posts from community c; diff --git a/server/src/actions/category.rs b/server/src/actions/category.rs new file mode 100644 index 00000000..8491f1ec --- /dev/null +++ b/server/src/actions/category.rs @@ -0,0 +1,73 @@ +extern crate diesel; +use schema::{category}; +use diesel::*; +use diesel::result::Error; +use serde::{Deserialize, Serialize}; +use {Crud}; + +#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] +#[table_name="category"] +pub struct Category { + pub id: i32, + pub name: String +} + +#[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)] +#[table_name="category"] +pub struct CategoryForm { + pub name: String, +} + +impl Crud<CategoryForm> for Category { + fn read(conn: &PgConnection, category_id: i32) -> Result<Self, Error> { + use schema::category::dsl::*; + category.find(category_id) + .first::<Self>(conn) + } + + fn delete(conn: &PgConnection, category_id: i32) -> Result<usize, Error> { + use schema::category::dsl::*; + diesel::delete(category.find(category_id)) + .execute(conn) + } + + fn create(conn: &PgConnection, new_category: &CategoryForm) -> Result<Self, Error> { + use schema::category::dsl::*; + insert_into(category) + .values(new_category) + .get_result::<Self>(conn) + } + + fn update(conn: &PgConnection, category_id: i32, new_category: &CategoryForm) -> Result<Self, Error> { + use schema::category::dsl::*; + diesel::update(category.find(category_id)) + .set(new_category) + .get_result::<Self>(conn) + } +} + +impl Category { + pub fn list_all(conn: &PgConnection) -> Result<Vec<Self>, Error> { + use schema::category::dsl::*; + category.load::<Self>(conn) + } +} + +#[cfg(test)] +mod tests { + use establish_connection; + use super::*; + // use Crud; + #[test] + fn test_crud() { + let conn = establish_connection(); + + let categories = Category::list_all(&conn).unwrap(); + let expected_first_category = Category { + id: 1, + name: "Discussion".into() + }; + + assert_eq!(expected_first_category, categories[0]); + } +} diff --git a/server/src/actions/community.rs b/server/src/actions/community.rs index a3fdbbd4..1c6343d0 100644 --- a/server/src/actions/community.rs +++ b/server/src/actions/community.rs @@ -125,13 +125,6 @@ impl Joinable<CommunityModeratorForm> for CommunityModerator { } } -impl Community { - pub fn list_all(conn: &PgConnection) -> Result<Vec<Self>, Error> { - use schema::community::dsl::*; - community.load::<Self>(conn) - } -} - #[cfg(test)] mod tests { use establish_connection; diff --git a/server/src/actions/community_view.rs b/server/src/actions/community_view.rs new file mode 100644 index 00000000..9da6215d --- /dev/null +++ b/server/src/actions/community_view.rs @@ -0,0 +1,51 @@ +extern crate diesel; +use diesel::*; +use diesel::result::Error; +use serde::{Deserialize, Serialize}; + +table! { + community_view (id) { + id -> Int4, + name -> Varchar, + title -> Varchar, + description -> Nullable<Text>, + category_id -> Int4, + creator_id -> Int4, + published -> Timestamp, + updated -> Nullable<Timestamp>, + creator_name -> Varchar, + category_name -> Varchar, + number_of_subscribers -> BigInt, + number_of_posts -> BigInt, + } +} + +#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize,QueryableByName,Clone)] +#[table_name="community_view"] +pub struct CommunityView { + pub id: i32, + pub name: String, + pub title: String, + pub description: Option<String>, + pub category_id: i32, + pub creator_id: i32, + pub published: chrono::NaiveDateTime, + pub updated: Option<chrono::NaiveDateTime>, + pub creator_name: String, + pub category_name: String, + pub number_of_subscribers: i64, + pub number_of_posts: i64 +} + +impl CommunityView { + pub fn read(conn: &PgConnection, from_community_id: i32) -> Result<Self, Error> { + use actions::community_view::community_view::dsl::*; + community_view.find(from_community_id).first::<Self>(conn) + } + + pub fn list_all(conn: &PgConnection) -> Result<Vec<Self>, Error> { + use actions::community_view::community_view::dsl::*; + community_view.load::<Self>(conn) + } +} + diff --git a/server/src/actions/mod.rs b/server/src/actions/mod.rs index 8b4574d4..c17fd81a 100644 --- a/server/src/actions/mod.rs +++ b/server/src/actions/mod.rs @@ -4,3 +4,5 @@ pub mod post; pub mod comment; pub mod post_view; pub mod comment_view; +pub mod category; +pub mod community_view; diff --git a/server/src/actions/post_view.rs b/server/src/actions/post_view.rs index a1d71de1..f53a9f0c 100644 --- a/server/src/actions/post_view.rs +++ b/server/src/actions/post_view.rs @@ -100,7 +100,7 @@ impl PostView { } - pub fn get(conn: &PgConnection, from_post_id: i32, from_user_id: Option<i32>) -> Result<Self, Error> { + pub fn read(conn: &PgConnection, from_post_id: i32, from_user_id: Option<i32>) -> Result<Self, Error> { use actions::post_view::post_view::dsl::*; use diesel::prelude::*; @@ -235,8 +235,8 @@ mod tests { let read_post_listings_with_user = PostView::list(&conn, ListingType::Community, ListingSortType::New, Some(inserted_community.id), Some(inserted_user.id), 10).unwrap(); let read_post_listings_no_user = PostView::list(&conn, ListingType::Community, ListingSortType::New, Some(inserted_community.id), None, 10).unwrap(); - let read_post_listing_no_user = PostView::get(&conn, inserted_post.id, None).unwrap(); - let read_post_listing_with_user = PostView::get(&conn, inserted_post.id, Some(inserted_user.id)).unwrap(); + let read_post_listing_no_user = PostView::read(&conn, inserted_post.id, None).unwrap(); + let read_post_listing_with_user = PostView::read(&conn, inserted_post.id, Some(inserted_user.id)).unwrap(); let like_removed = PostLike::remove(&conn, &post_like_form).unwrap(); let num_deleted = Post::delete(&conn, inserted_post.id).unwrap(); diff --git a/server/src/actions/user.rs b/server/src/actions/user.rs index 70a02135..d646adcb 100644 --- a/server/src/actions/user.rs +++ b/server/src/actions/user.rs @@ -117,7 +117,7 @@ mod tests { let conn = establish_connection(); let new_user = UserForm { - name: "thom".into(), + name: "thommy".into(), fedi_name: "rrf".into(), preferred_username: None, password_encrypted: "nope".into(), @@ -129,7 +129,7 @@ mod tests { let expected_user = User_ { id: inserted_user.id, - name: "thom".into(), + name: "thommy".into(), fedi_name: "rrf".into(), preferred_username: None, password_encrypted: "$2y$12$YXpNpYsdfjmed.QlYLvw4OfTCgyKUnKHc/V8Dgcf9YcVKHPaYXYYy".into(), diff --git a/server/src/bin/main.rs b/server/src/bin/main.rs index 08663f56..fa0f532b 100644 --- a/server/src/bin/main.rs +++ b/server/src/bin/main.rs @@ -3,7 +3,7 @@ extern crate server; use std::time::{Instant, Duration}; use server::actix::*; use server::actix_web::server::HttpServer; -use server::actix_web::{fs, http, ws, App, Error, HttpRequest, HttpResponse}; +use server::actix_web::{ws, App, Error, HttpRequest, HttpResponse}; use server::websocket_server::server::*; diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs index 4a2a746c..e5e117ef 100644 --- a/server/src/websocket_server/server.rs +++ b/server/src/websocket_server/server.rs @@ -17,10 +17,12 @@ use actions::post::*; use actions::comment::*; use actions::post_view::*; use actions::comment_view::*; +use actions::category::*; +use actions::community_view::*; #[derive(EnumString,ToString,Debug)] pub enum UserOperation { - Login, Register, CreateCommunity, CreatePost, ListCommunities, GetPost, GetCommunity, CreateComment, EditComment, CreateCommentLike, GetPosts, CreatePostLike, EditPost, EditCommunity + Login, Register, CreateCommunity, CreatePost, ListCommunities, ListCategories, GetPost, GetCommunity, CreateComment, EditComment, CreateCommentLike, GetPosts, CreatePostLike, EditPost, EditCommunity } #[derive(Serialize, Deserialize)] @@ -103,7 +105,7 @@ pub struct CreateCommunity { #[derive(Serialize, Deserialize)] pub struct CreateCommunityResponse { op: String, - community: Community + community: CommunityView } #[derive(Serialize, Deserialize)] @@ -112,7 +114,16 @@ pub struct ListCommunities; #[derive(Serialize, Deserialize)] pub struct ListCommunitiesResponse { op: String, - communities: Vec<Community> + communities: Vec<CommunityView> +} + +#[derive(Serialize, Deserialize)] +pub struct ListCategories; + +#[derive(Serialize, Deserialize)] +pub struct ListCategoriesResponse { + op: String, + categories: Vec<Category> } #[derive(Serialize, Deserialize)] @@ -141,7 +152,8 @@ pub struct GetPost { pub struct GetPostResponse { op: String, post: PostView, - comments: Vec<CommentView> + comments: Vec<CommentView>, + community: CommunityView } #[derive(Serialize, Deserialize)] @@ -167,7 +179,7 @@ pub struct GetCommunity { #[derive(Serialize, Deserialize)] pub struct GetCommunityResponse { op: String, - community: Community + community: CommunityView } #[derive(Serialize, Deserialize)] @@ -333,7 +345,7 @@ impl Handler<Disconnect> for ChatServer { } // send message to other users // for room in rooms { - // self.send_room_message(room, "Someone disconnected", 0); + // self.send_room_message(room, "Someone disconnected", 0); // } } } @@ -377,6 +389,10 @@ impl Handler<StandardMessage> for ChatServer { let list_communities: ListCommunities = ListCommunities; list_communities.perform(self, msg.id) }, + UserOperation::ListCategories => { + let list_categories: ListCategories = ListCategories; + list_categories.perform(self, msg.id) + }, UserOperation::CreatePost => { let create_post: CreatePost = serde_json::from_str(&data.to_string()).unwrap(); create_post.perform(self, msg.id) @@ -576,10 +592,12 @@ impl Perform for CreateCommunity { } }; + let community_view = CommunityView::read(&conn, inserted_community.id).unwrap(); + serde_json::to_string( &CreateCommunityResponse { op: self.op_type().to_string(), - community: inserted_community + community: community_view } ) .unwrap() @@ -595,7 +613,7 @@ impl Perform for ListCommunities { let conn = establish_connection(); - let communities: Vec<Community> = Community::list_all(&conn).unwrap(); + let communities: Vec<CommunityView> = CommunityView::list_all(&conn).unwrap(); // Return the jwt serde_json::to_string( @@ -608,6 +626,28 @@ impl Perform for ListCommunities { } } +impl Perform for ListCategories { + fn op_type(&self) -> UserOperation { + UserOperation::ListCategories + } + + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + + let conn = establish_connection(); + + let categories: Vec<Category> = Category::list_all(&conn).unwrap(); + + // Return the jwt + serde_json::to_string( + &ListCategoriesResponse { + op: self.op_type().to_string(), + categories: categories + } + ) + .unwrap() + } +} + impl Perform for CreatePost { fn op_type(&self) -> UserOperation { UserOperation::CreatePost @@ -656,9 +696,9 @@ impl Perform for CreatePost { return self.error("Couldn't like post."); } }; - + // Refetch the view - let post_view = match PostView::get(&conn, inserted_post.id, Some(user_id)) { + let post_view = match PostView::read(&conn, inserted_post.id, Some(user_id)) { Ok(post) => post, Err(_e) => { return self.error("Couldn't find Post"); @@ -700,7 +740,7 @@ impl Perform for GetPost { None => None }; - let post_view = match PostView::get(&conn, self.id, user_id) { + let post_view = match PostView::read(&conn, self.id, user_id) { Ok(post) => post, Err(_e) => { return self.error("Couldn't find Post"); @@ -720,12 +760,15 @@ impl Perform for GetPost { let comments = CommentView::list(&conn, self.id, user_id).unwrap(); + let community = CommunityView::read(&conn, post_view.community_id).unwrap(); + // Return the jwt serde_json::to_string( &GetPostResponse { op: self.op_type().to_string(), post: post_view, - comments: comments + comments: comments, + community: community } ) .unwrap() @@ -741,7 +784,7 @@ impl Perform for GetCommunity { let conn = establish_connection(); - let community = match Community::read(&conn, self.id) { + let community_view = match CommunityView::read(&conn, self.id) { Ok(community) => community, Err(_e) => { return self.error("Couldn't find Community"); @@ -752,7 +795,7 @@ impl Perform for GetCommunity { serde_json::to_string( &GetCommunityResponse { op: self.op_type().to_string(), - community: community + community: community_view } ) .unwrap() @@ -828,7 +871,7 @@ impl Perform for CreateComment { } ) .unwrap(); - + chat.send_room_message(self.post_id, &comment_sent_out, addr); comment_out @@ -890,7 +933,7 @@ impl Perform for EditComment { } ) .unwrap(); - + chat.send_room_message(self.post_id, &comment_sent_out, addr); comment_out @@ -958,9 +1001,9 @@ impl Perform for CreateCommentLike { ) .unwrap(); - chat.send_room_message(self.post_id, &like_sent_out, addr); + chat.send_room_message(self.post_id, &like_sent_out, addr); - like_out + like_out } } @@ -1049,7 +1092,7 @@ impl Perform for CreatePostLike { }; } - let post_view = match PostView::get(&conn, self.post_id, Some(user_id)) { + let post_view = match PostView::read(&conn, self.post_id, Some(user_id)) { Ok(post) => post, Err(_e) => { return self.error("Couldn't find Post"); @@ -1066,7 +1109,7 @@ impl Perform for CreatePostLike { ) .unwrap(); - like_out + like_out } } @@ -1104,7 +1147,7 @@ impl Perform for EditPost { } }; - let post_view = PostView::get(&conn, self.edit_id, Some(user_id)).unwrap(); + let post_view = PostView::read(&conn, self.edit_id, Some(user_id)).unwrap(); let mut post_sent = post_view.clone(); post_sent.my_vote = None; @@ -1124,7 +1167,7 @@ impl Perform for EditPost { } ) .unwrap(); - + chat.send_room_message(self.edit_id, &post_sent_out, addr); post_out @@ -1255,7 +1298,7 @@ impl Perform for EditPost { // ) // ) // }; - + // MessageResult( // Ok( // CreateCommunityResponse { |