diff options
author | Dessalines <happydooby@gmail.com> | 2019-04-21 00:26:26 -0700 |
---|---|---|
committer | Dessalines <happydooby@gmail.com> | 2019-04-21 00:26:26 -0700 |
commit | 18e239789fece57a06de521ddf2c67948e6badef (patch) | |
tree | ee6f3fef8713319bde62580fb98842b022e7805b /server | |
parent | 93a512b7a16bba3b399cd78003995fab694139a9 (diff) |
Cleaning up error handling on server.rs
- Fixes #83
Diffstat (limited to 'server')
-rw-r--r-- | server/src/lib.rs | 2 | ||||
-rw-r--r-- | server/src/websocket_server/server.rs | 1041 |
2 files changed, 531 insertions, 512 deletions
diff --git a/server/src/lib.rs b/server/src/lib.rs index 31c1af7c..8347c23d 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -13,6 +13,8 @@ pub extern crate bcrypt; pub extern crate regex; #[macro_use] pub extern crate strum_macros; #[macro_use] pub extern crate lazy_static; +#[macro_use] extern crate failure; + pub mod schema; pub mod apub; pub mod actions; diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs index dbcf5c5d..ba6e176b 100644 --- a/server/src/websocket_server/server.rs +++ b/server/src/websocket_server/server.rs @@ -10,6 +10,7 @@ use serde_json::{Value}; use bcrypt::{verify}; use std::str::FromStr; use diesel::PgConnection; +use failure::Error; use {Crud, Joinable, Likeable, Followable, Bannable, Saveable, establish_connection, naive_now, naive_from_unix, SortType, has_slurs, remove_slurs}; use actions::community::*; @@ -29,10 +30,11 @@ pub enum UserOperation { Login, Register, CreateCommunity, CreatePost, ListCommunities, ListCategories, GetPost, GetCommunity, CreateComment, EditComment, SaveComment, CreateCommentLike, GetPosts, CreatePostLike, EditPost, SavePost, EditCommunity, FollowCommunity, GetFollowedCommunities, GetUserDetails, GetReplies, GetModlog, BanFromCommunity, AddModToCommunity, CreateSite, EditSite, GetSite, AddAdmin, BanUser } -#[derive(Serialize, Deserialize)] +#[derive(Fail, Debug)] +#[fail(display = "{{\"op\":\"{}\", \"error\":\"{}\"}}", op, message)] pub struct ErrorMessage { op: String, - error: String + message: String } /// Chat server sends this messages to session @@ -490,7 +492,7 @@ impl ChatServer { } } - fn send_community_message(&self, conn: &PgConnection, community_id: i32, message: &str, skip_id: usize) { + fn send_community_message(&self, conn: &PgConnection, community_id: i32, message: &str, skip_id: usize) -> Result<(), Error> { let posts = PostView::list(conn, PostListingType::Community, &SortType::New, @@ -500,11 +502,12 @@ impl ChatServer { false, false, None, - Some(9999)) - .unwrap(); + Some(9999))?; for post in posts { self.send_room_message(post.id, message, skip_id); } + + Ok(()) } } @@ -562,184 +565,188 @@ impl Handler<Disconnect> for ChatServer { impl Handler<StandardMessage> for ChatServer { type Result = MessageResult<StandardMessage>; + fn handle(&mut self, msg: StandardMessage, _: &mut Context<Self>) -> Self::Result { - let json: Value = serde_json::from_str(&msg.msg) - .expect("Couldn't parse message"); - - let data = &json["data"].to_string(); - let op = &json["op"].as_str().unwrap(); - let user_operation: UserOperation = UserOperation::from_str(&op).unwrap(); - - - // TODO figure out how to do proper error handling here, instead of just returning - // error strings - let res: String = match user_operation { - UserOperation::Login => { - let login: Login = serde_json::from_str(data).unwrap(); - login.perform(self, msg.id) - }, - UserOperation::Register => { - let register: Register = serde_json::from_str(data).unwrap(); - register.perform(self, msg.id) - }, - UserOperation::CreateCommunity => { - let create_community: CreateCommunity = serde_json::from_str(data).unwrap(); - create_community.perform(self, msg.id) - }, - UserOperation::ListCommunities => { - let list_communities: ListCommunities = serde_json::from_str(data).unwrap(); - 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).unwrap(); - create_post.perform(self, msg.id) - }, - UserOperation::GetPost => { - let get_post: GetPost = serde_json::from_str(data).unwrap(); - get_post.perform(self, msg.id) - }, - UserOperation::GetCommunity => { - let get_community: GetCommunity = serde_json::from_str(data).unwrap(); - get_community.perform(self, msg.id) - }, - UserOperation::CreateComment => { - let create_comment: CreateComment = serde_json::from_str(data).unwrap(); - create_comment.perform(self, msg.id) - }, - UserOperation::EditComment => { - let edit_comment: EditComment = serde_json::from_str(data).unwrap(); - edit_comment.perform(self, msg.id) - }, - UserOperation::SaveComment => { - let save_post: SaveComment = serde_json::from_str(data).unwrap(); - save_post.perform(self, msg.id) - }, - UserOperation::CreateCommentLike => { - let create_comment_like: CreateCommentLike = serde_json::from_str(data).unwrap(); - create_comment_like.perform(self, msg.id) - }, - UserOperation::GetPosts => { - let get_posts: GetPosts = serde_json::from_str(data).unwrap(); - get_posts.perform(self, msg.id) - }, - UserOperation::CreatePostLike => { - let create_post_like: CreatePostLike = serde_json::from_str(data).unwrap(); - create_post_like.perform(self, msg.id) - }, - UserOperation::EditPost => { - let edit_post: EditPost = serde_json::from_str(data).unwrap(); - edit_post.perform(self, msg.id) - }, - UserOperation::SavePost => { - let save_post: SavePost = serde_json::from_str(data).unwrap(); - save_post.perform(self, msg.id) - }, - UserOperation::EditCommunity => { - let edit_community: EditCommunity = serde_json::from_str(data).unwrap(); - edit_community.perform(self, msg.id) - }, - UserOperation::FollowCommunity => { - let follow_community: FollowCommunity = serde_json::from_str(data).unwrap(); - follow_community.perform(self, msg.id) - }, - UserOperation::GetFollowedCommunities => { - let followed_communities: GetFollowedCommunities = serde_json::from_str(data).unwrap(); - followed_communities.perform(self, msg.id) - }, - UserOperation::GetUserDetails => { - let get_user_details: GetUserDetails = serde_json::from_str(data).unwrap(); - get_user_details.perform(self, msg.id) - }, - UserOperation::GetModlog => { - let get_modlog: GetModlog = serde_json::from_str(data).unwrap(); - get_modlog.perform(self, msg.id) - }, - UserOperation::BanFromCommunity => { - let ban_from_community: BanFromCommunity = serde_json::from_str(data).unwrap(); - ban_from_community.perform(self, msg.id) - }, - UserOperation::AddModToCommunity => { - let mod_add_to_community: AddModToCommunity = serde_json::from_str(data).unwrap(); - mod_add_to_community.perform(self, msg.id) - }, - UserOperation::CreateSite => { - let create_site: CreateSite = serde_json::from_str(data).unwrap(); - create_site.perform(self, msg.id) - }, - UserOperation::EditSite => { - let edit_site: EditSite = serde_json::from_str(data).unwrap(); - edit_site.perform(self, msg.id) - }, - UserOperation::GetSite => { - let get_site: GetSite = serde_json::from_str(data).unwrap(); - get_site.perform(self, msg.id) - }, - UserOperation::AddAdmin => { - let add_admin: AddAdmin = serde_json::from_str(data).unwrap(); - add_admin.perform(self, msg.id) - }, - UserOperation::BanUser => { - let ban_user: BanUser = serde_json::from_str(data).unwrap(); - ban_user.perform(self, msg.id) - }, - UserOperation::GetReplies => { - let get_replies: GetReplies = serde_json::from_str(data).unwrap(); - get_replies.perform(self, msg.id) - }, - }; - - MessageResult(res) + let msg_out = match parse_json_message(self, msg) { + Ok(m) => m, + Err(e) => e.to_string() + }; + + MessageResult(msg_out) + } +} + +fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<String, Error> { + + let json: Value = serde_json::from_str(&msg.msg)?; + let data = &json["data"].to_string(); + let op = &json["op"].as_str().unwrap(); + + let user_operation: UserOperation = UserOperation::from_str(&op)?; + + match user_operation { + UserOperation::Login => { + let login: Login = serde_json::from_str(data)?; + login.perform(chat, msg.id) + }, + UserOperation::Register => { + let register: Register = serde_json::from_str(data)?; + register.perform(chat, msg.id) + }, + UserOperation::CreateCommunity => { + let create_community: CreateCommunity = serde_json::from_str(data)?; + create_community.perform(chat, msg.id) + }, + UserOperation::ListCommunities => { + let list_communities: ListCommunities = serde_json::from_str(data)?; + list_communities.perform(chat, msg.id) + }, + UserOperation::ListCategories => { + let list_categories: ListCategories = ListCategories; + list_categories.perform(chat, msg.id) + }, + UserOperation::CreatePost => { + let create_post: CreatePost = serde_json::from_str(data)?; + create_post.perform(chat, msg.id) + }, + UserOperation::GetPost => { + let get_post: GetPost = serde_json::from_str(data)?; + get_post.perform(chat, msg.id) + }, + UserOperation::GetCommunity => { + let get_community: GetCommunity = serde_json::from_str(data)?; + get_community.perform(chat, msg.id) + }, + UserOperation::CreateComment => { + let create_comment: CreateComment = serde_json::from_str(data)?; + create_comment.perform(chat, msg.id) + }, + UserOperation::EditComment => { + let edit_comment: EditComment = serde_json::from_str(data)?; + edit_comment.perform(chat, msg.id) + }, + UserOperation::SaveComment => { + let save_post: SaveComment = serde_json::from_str(data)?; + save_post.perform(chat, msg.id) + }, + UserOperation::CreateCommentLike => { + let create_comment_like: CreateCommentLike = serde_json::from_str(data)?; + create_comment_like.perform(chat, msg.id) + }, + UserOperation::GetPosts => { + let get_posts: GetPosts = serde_json::from_str(data)?; + get_posts.perform(chat, msg.id) + }, + UserOperation::CreatePostLike => { + let create_post_like: CreatePostLike = serde_json::from_str(data)?; + create_post_like.perform(chat, msg.id) + }, + UserOperation::EditPost => { + let edit_post: EditPost = serde_json::from_str(data)?; + edit_post.perform(chat, msg.id) + }, + UserOperation::SavePost => { + let save_post: SavePost = serde_json::from_str(data)?; + save_post.perform(chat, msg.id) + }, + UserOperation::EditCommunity => { + let edit_community: EditCommunity = serde_json::from_str(data)?; + edit_community.perform(chat, msg.id) + }, + UserOperation::FollowCommunity => { + let follow_community: FollowCommunity = serde_json::from_str(data)?; + follow_community.perform(chat, msg.id) + }, + UserOperation::GetFollowedCommunities => { + let followed_communities: GetFollowedCommunities = serde_json::from_str(data)?; + followed_communities.perform(chat, msg.id) + }, + UserOperation::GetUserDetails => { + let get_user_details: GetUserDetails = serde_json::from_str(data)?; + get_user_details.perform(chat, msg.id) + }, + UserOperation::GetModlog => { + let get_modlog: GetModlog = serde_json::from_str(data)?; + get_modlog.perform(chat, msg.id) + }, + UserOperation::BanFromCommunity => { + let ban_from_community: BanFromCommunity = serde_json::from_str(data)?; + ban_from_community.perform(chat, msg.id) + }, + UserOperation::AddModToCommunity => { + let mod_add_to_community: AddModToCommunity = serde_json::from_str(data)?; + mod_add_to_community.perform(chat, msg.id) + }, + UserOperation::CreateSite => { + let create_site: CreateSite = serde_json::from_str(data)?; + create_site.perform(chat, msg.id) + }, + UserOperation::EditSite => { + let edit_site: EditSite = serde_json::from_str(data)?; + edit_site.perform(chat, msg.id) + }, + UserOperation::GetSite => { + let get_site: GetSite = serde_json::from_str(data)?; + get_site.perform(chat, msg.id) + }, + UserOperation::AddAdmin => { + let add_admin: AddAdmin = serde_json::from_str(data)?; + add_admin.perform(chat, msg.id) + }, + UserOperation::BanUser => { + let ban_user: BanUser = serde_json::from_str(data)?; + ban_user.perform(chat, msg.id) + }, + UserOperation::GetReplies => { + let get_replies: GetReplies = serde_json::from_str(data)?; + get_replies.perform(chat, msg.id) + }, } } - pub trait Perform { - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String; + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error>; fn op_type(&self) -> UserOperation; - fn error(&self, error_msg: &str) -> String { - serde_json::to_string( - &ErrorMessage { - op: self.op_type().to_string(), - error: error_msg.to_string() - } - ) - .unwrap() + fn error(&self, error_msg: &str) -> ErrorMessage { + ErrorMessage { + op: self.op_type().to_string(), + message: error_msg.to_string() + } } } impl Perform for Login { + fn op_type(&self) -> UserOperation { UserOperation::Login } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); // Fetch that username / email let user: User_ = match User_::find_by_email_or_username(&conn, &self.username_or_email) { Ok(user) => user, - Err(_e) => return self.error("Couldn't find that username or email") + Err(_e) => return Err(self.error("Couldn't find that username or email"))? }; // Verify the password let valid: bool = verify(&self.password, &user.password_encrypted).unwrap_or(false); if !valid { - return self.error("Password incorrect") + return Err(self.error("Password incorrect"))? } // Return the jwt - serde_json::to_string( - &LoginResponse { - op: self.op_type().to_string(), - jwt: user.jwt() - } + Ok( + serde_json::to_string( + &LoginResponse { + op: self.op_type().to_string(), + jwt: user.jwt() + } + )? ) - .unwrap() } } @@ -748,22 +755,22 @@ impl Perform for Register { fn op_type(&self) -> UserOperation { UserOperation::Register } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); // Make sure passwords match if &self.password != &self.password_verify { - return self.error("Passwords do not match."); + return Err(self.error("Passwords do not match."))? } if has_slurs(&self.username) { - return self.error("No slurs"); + return Err(self.error("No slurs"))? } // Make sure there are no admins - if self.admin && UserView::admins(&conn).unwrap().len() > 0 { - return self.error("Sorry, there's already an admin."); + if self.admin && UserView::admins(&conn)?.len() > 0 { + return Err(self.error("Sorry, there's already an admin."))? } // Register the new user @@ -782,7 +789,7 @@ impl Perform for Register { let inserted_user = match User_::register(&conn, &user_form) { Ok(user) => user, Err(_e) => { - return self.error("User already exists."); + return Err(self.error("User already exists."))? } }; @@ -796,7 +803,7 @@ impl Perform for Register { let _inserted_community_moderator = match CommunityModerator::join(&conn, &community_moderator_form) { Ok(user) => user, Err(_e) => { - return self.error("Community moderator already exists."); + return Err(self.error("Community moderator already exists."))? } }; @@ -808,20 +815,21 @@ impl Perform for Register { let _inserted_community_follower = match CommunityFollower::follow(&conn, &community_follower_form) { Ok(user) => user, Err(_e) => { - return self.error("Community follower already exists."); + return Err(self.error("Community follower already exists."))? } }; } // Return the jwt - serde_json::to_string( - &LoginResponse { - op: self.op_type().to_string(), - jwt: inserted_user.jwt() - } + Ok( + serde_json::to_string( + &LoginResponse { + op: self.op_type().to_string(), + jwt: inserted_user.jwt() + } + )? ) - .unwrap() } } @@ -831,28 +839,28 @@ impl Perform for CreateCommunity { UserOperation::CreateCommunity } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); let claims = match Claims::decode(&self.auth) { Ok(claims) => claims.claims, Err(_e) => { - return self.error("Not logged in."); + return Err(self.error("Not logged in."))? } }; if has_slurs(&self.name) || has_slurs(&self.title) || - (self.description.is_some() && has_slurs(&self.description.to_owned().unwrap())) { - return self.error("No slurs"); - } + (self.description.is_some() && has_slurs(&self.description.to_owned().unwrap())) { + return Err(self.error("No slurs"))? + } let user_id = claims.id; // Check for a site ban - if UserView::read(&conn, user_id).unwrap().banned { - return self.error("You have been banned from the site"); + if UserView::read(&conn, user_id)?.banned { + return Err(self.error("You have been banned from the site"))? } // When you create a community, make sure the user becomes a moderator and a follower @@ -869,7 +877,7 @@ impl Perform for CreateCommunity { let inserted_community = match Community::create(&conn, &community_form) { Ok(community) => community, Err(_e) => { - return self.error("Community already exists."); + return Err(self.error("Community already exists."))? } }; @@ -881,7 +889,7 @@ impl Perform for CreateCommunity { let _inserted_community_moderator = match CommunityModerator::join(&conn, &community_moderator_form) { Ok(user) => user, Err(_e) => { - return self.error("Community moderator already exists."); + return Err(self.error("Community moderator already exists."))? } }; @@ -893,19 +901,20 @@ impl Perform for CreateCommunity { let _inserted_community_follower = match CommunityFollower::follow(&conn, &community_follower_form) { Ok(user) => user, Err(_e) => { - return self.error("Community follower already exists."); + return Err(self.error("Community follower already exists."))? } }; - let community_view = CommunityView::read(&conn, inserted_community.id, Some(user_id)).unwrap(); + let community_view = CommunityView::read(&conn, inserted_community.id, Some(user_id))?; - serde_json::to_string( - &CommunityResponse { - op: self.op_type().to_string(), - community: community_view - } + Ok( + serde_json::to_string( + &CommunityResponse { + op: self.op_type().to_string(), + community: community_view + } + )? ) - .unwrap() } } @@ -914,7 +923,7 @@ impl Perform for ListCommunities { UserOperation::ListCommunities } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); @@ -931,18 +940,19 @@ impl Perform for ListCommunities { None => None }; - let sort = SortType::from_str(&self.sort).expect("listing sort"); + let sort = SortType::from_str(&self.sort)?; - let communities: Vec<CommunityView> = CommunityView::list(&conn, user_id, sort, self.page, self.limit).unwrap(); + let communities: Vec<CommunityView> = CommunityView::list(&conn, user_id, sort, self.page, self.limit)?; // Return the jwt - serde_json::to_string( - &ListCommunitiesResponse { - op: self.op_type().to_string(), - communities: communities - } + Ok( + serde_json::to_string( + &ListCommunitiesResponse { + op: self.op_type().to_string(), + communities: communities + } + )? ) - .unwrap() } } @@ -951,20 +961,21 @@ impl Perform for ListCategories { UserOperation::ListCategories } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); - let categories: Vec<Category> = Category::list_all(&conn).unwrap(); + let categories: Vec<Category> = Category::list_all(&conn)?; // Return the jwt - serde_json::to_string( - &ListCategoriesResponse { - op: self.op_type().to_string(), - categories: categories - } + Ok( + serde_json::to_string( + &ListCategoriesResponse { + op: self.op_type().to_string(), + categories: categories + } + )? ) - .unwrap() } } @@ -973,32 +984,32 @@ impl Perform for CreatePost { UserOperation::CreatePost } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); let claims = match Claims::decode(&self.auth) { Ok(claims) => claims.claims, Err(_e) => { - return self.error("Not logged in."); + return Err(self.error("Not logged in."))? } }; if has_slurs(&self.name) || (self.body.is_some() && has_slurs(&self.body.to_owned().unwrap())) { - return self.error("No slurs"); - } + return Err(self.error("No slurs"))? + } let user_id = claims.id; // Check for a community ban if CommunityUserBanView::get(&conn, user_id, self.community_id).is_ok() { - return self.error("You have been banned from this community"); + return Err(self.error("You have been banned from this community"))? } // Check for a site ban - if UserView::read(&conn, user_id).unwrap().banned { - return self.error("You have been banned from the site"); + if UserView::read(&conn, user_id)?.banned { + return Err(self.error("You have been banned from the site"))? } let post_form = PostForm { @@ -1015,7 +1026,7 @@ impl Perform for CreatePost { let inserted_post = match Post::create(&conn, &post_form) { Ok(post) => post, Err(_e) => { - return self.error("Couldn't create Post"); + return Err(self.error("Couldn't create Post"))? } }; @@ -1030,7 +1041,7 @@ impl Perform for CreatePost { let _inserted_like = match PostLike::like(&conn, &like_form) { Ok(like) => like, Err(_e) => { - return self.error("Couldn't like post."); + return Err(self.error("Couldn't like post."))? } }; @@ -1038,17 +1049,18 @@ impl Perform for CreatePost { 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"); + return Err(self.error("Couldn't find Post"))? } }; - serde_json::to_string( - &PostResponse { - op: self.op_type().to_string(), - post: post_view - } + Ok( + serde_json::to_string( + &PostResponse { + op: self.op_type().to_string(), + post: post_view + } + )? ) - .unwrap() } } @@ -1058,7 +1070,7 @@ impl Perform for GetPost { UserOperation::GetPost } - fn perform(&self, chat: &mut ChatServer, addr: usize) -> String { + fn perform(&self, chat: &mut ChatServer, addr: usize) -> Result<String, Error> { let conn = establish_connection(); @@ -1078,7 +1090,7 @@ impl Perform for GetPost { let post_view = match PostView::read(&conn, self.id, user_id) { Ok(post) => post, Err(_e) => { - return self.error("Couldn't find Post"); + return Err(self.error("Couldn't find Post"))? } }; @@ -1093,26 +1105,27 @@ impl Perform for GetPost { chat.rooms.get_mut(&self.id).unwrap().insert(addr); - let comments = CommentView::list(&conn, &SortType::New, Some(self.id), None, user_id, false, None, Some(9999)).unwrap(); + let comments = CommentView::list(&conn, &SortType::New, Some(self.id), None, user_id, false, None, Some(9999))?; - let community = CommunityView::read(&conn, post_view.community_id, user_id).unwrap(); + let community = CommunityView::read(&conn, post_view.community_id, user_id)?; - let moderators = CommunityModeratorView::for_community(&conn, post_view.community_id).unwrap(); + let moderators = CommunityModeratorView::for_community(&conn, post_view.community_id)?; - let admins = UserView::admins(&conn).unwrap(); + let admins = UserView::admins(&conn)?; // Return the jwt - serde_json::to_string( - &GetPostResponse { - op: self.op_type().to_string(), - post: post_view, - comments: comments, - community: community, - moderators: moderators, - admins: admins, - } + Ok( + serde_json::to_string( + &GetPostResponse { + op: self.op_type().to_string(), + post: post_view, + comments: comments, + community: community, + moderators: moderators, + admins: admins, + } + )? ) - .unwrap() } } @@ -1121,7 +1134,7 @@ impl Perform for GetCommunity { UserOperation::GetCommunity } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result<String, Error> { let conn = establish_connection(); @@ -1141,26 +1154,27 @@ impl Perform for GetCommunity { let community_view = match CommunityView::read(&conn, self.id, user_id) { Ok(community) => community, Err(_e) => { - return self.error("Couldn't find Community"); + return Err(self.error("Couldn't find Community"))? } }; let moderators = match CommunityModeratorView::for_community(&conn, self.id) { Ok(moderators) => moderators, Err(_e) => { - return self.error("Couldn't find Community"); + return Err(self.error("Couldn't find Community"))? } }; // Return the jwt - serde_json::to_string( - &GetCommunityResponse { - op: self.op_type().to_string(), - community: community_view, - moderators: moderators - } + Ok( + serde_json::to_string( + &GetCommunityResponse { + op: self.op_type().to_string(), + community: community_view, + moderators: moderators + } + )? ) - .unwrap() } } @@ -1169,28 +1183,28 @@ impl Perform for CreateComment { UserOperation::CreateComment } - fn perform(&self, chat: &mut ChatServer, addr: usize) -> String { + fn perform(&self, chat: &mut ChatServer, addr: usize) -> Result<String, Error> { let conn = establish_connection(); let claims = match Claims::decode(&self.auth) { Ok(claims) => claims.claims, Err(_e) => { - return self.error("Not logged in."); + return Err(self.error("Not logged in."))? } }; let user_id = claims.id; // Check for a community ban - let post = Post::read(&conn, self.post_id).unwrap(); + let post = Post::read(&conn, self.post_id)?; if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() { - return self.error("You have been banned from this community"); + return Err(self.error("You have been banned from this community"))? } - + // Check for a site ban - if UserView::read(&conn, user_id).unwrap().banned { - return self.error("You have been banned from the site"); + if UserView::read(&conn, user_id)?.banned { + return Err(self.error("You have been banned from the site"))? } let content_slurs_removed = remove_slurs(&self.content.to_owned()); @@ -1208,7 +1222,7 @@ impl Perform for CreateComment { let inserted_comment = match Comment::create(&conn, &comment_form) { Ok(comment) => comment, Err(_e) => { - return self.error("Couldn't create Comment"); + return Err(self.error("Couldn't create Comment"))? } }; @@ -1223,11 +1237,11 @@ impl Perform for CreateComment { let _inserted_like = match CommentLike::like(&conn, &like_form) { Ok(like) => like, Err(_e) => { - return self.error("Couldn't like comment."); + return Err(self.error("Couldn't like comment."))? } }; - let comment_view = CommentView::read(&conn, inserted_comment.id, Some(user_id)).unwrap(); + let comment_view = CommentView::read(&conn, inserted_comment.id, Some(user_id))?; let mut comment_sent = comment_view.clone(); comment_sent.my_vote = None; @@ -1238,20 +1252,18 @@ impl Perform for CreateComment { op: self.op_type().to_string(), comment: comment_view } - ) - .unwrap(); + )?; let comment_sent_out = serde_json::to_string( &CommentResponse { op: self.op_type().to_string(), comment: comment_sent } - ) - .unwrap(); + )?; chat.send_room_message(self.post_id, &comment_sent_out, addr); - comment_out + Ok(comment_out) } } @@ -1260,49 +1272,49 @@ impl Perform for EditComment { UserOperation::EditComment } - fn perform(&self, chat: &mut ChatServer, addr: usize) -> String { + fn perform(&self, chat: &mut ChatServer, addr: usize) -> Result<String, Error> { let conn = establish_connection(); let claims = match Claims::decode(&self.auth) { Ok(claims) => claims.claims, Err(_e) => { - return self.error("Not logged in."); + return Err(self.error("Not logged in."))? } }; let user_id = claims.id; // Verify its the creator or a mod, or an admin - let orig_comment = CommentView::read(&conn, self.edit_id, None).unwrap(); + let orig_comment = CommentView::read(&conn, self.edit_id, None)?; let mut editors: Vec<i32> = vec![self.creator_id]; editors.append( &mut CommunityModeratorView::for_community(&conn, orig_comment.community_id) - .unwrap() + ? .into_iter() .map(|m| m.user_id) .collect() - ); + ); editors.append( &mut UserView::admins(&conn) - .unwrap() + ? .into_iter() .map(|a| a.id) .collect() ); if !editors.contains(&user_id) { - return self.error("Not allowed to edit comment."); + return Err(self.error("Not allowed to edit comment."))? } // Check for a community ban if CommunityUserBanView::get(&conn, user_id, orig_comment.community_id).is_ok() { - return self.error("You have been banned from this community"); + return Err(self.error("You have been banned from this community"))? } // Check for a site ban - if UserView::read(&conn, user_id).unwrap().banned { - return self.error("You have been banned from the site"); + if UserView::read(&conn, user_id)?.banned { + return Err(self.error("You have been banned from the site"))? } let content_slurs_removed = remove_slurs(&self.content.to_owned()); @@ -1320,7 +1332,7 @@ impl Perform for EditComment { let _updated_comment = match Comment::update(&conn, self.edit_id, &comment_form) { Ok(comment) => comment, Err(_e) => { - return self.error("Couldn't update Comment"); + return Err(self.error("Couldn't update Comment"))? } }; @@ -1332,11 +1344,11 @@ impl Perform for EditComment { removed: Some(removed), reason: self.reason.to_owned(), }; - ModRemoveComment::create(&conn, &form).unwrap(); + ModRemoveComment::create(&conn, &form)?; } - let comment_view = CommentView::read(&conn, self.edit_id, Some(user_id)).unwrap(); + let comment_view = CommentView::read(&conn, self.edit_id, Some(user_id))?; let mut comment_sent = comment_view.clone(); comment_sent.my_vote = None; @@ -1347,20 +1359,18 @@ impl Perform for EditComment { op: self.op_type().to_string(), comment: comment_view } - ) - .unwrap(); + )?; let comment_sent_out = serde_json::to_string( &CommentResponse { op: self.op_type().to_string(), comment: comment_sent } - ) - .unwrap(); + )?; chat.send_room_message(self.post_id, &comment_sent_out, addr); - comment_out + Ok(comment_out) } } @@ -1369,14 +1379,14 @@ impl Perform for SaveComment { UserOperation::SaveComment } - fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> String { + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result& |