summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorDessalines <happydooby@gmail.com>2019-04-21 00:26:26 -0700
committerDessalines <happydooby@gmail.com>2019-04-21 00:26:26 -0700
commit18e239789fece57a06de521ddf2c67948e6badef (patch)
treeee6f3fef8713319bde62580fb98842b022e7805b /server
parent93a512b7a16bba3b399cd78003995fab694139a9 (diff)
Cleaning up error handling on server.rs
- Fixes #83
Diffstat (limited to 'server')
-rw-r--r--server/src/lib.rs2
-rw-r--r--server/src/websocket_server/server.rs1041
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&