From e97d3206d62b840832f051dde90e1e4df3ffd01b Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 29 Apr 2019 09:51:13 -0700 Subject: [PATCH] Adding mark all as read - Fixes #107 --- server/src/websocket_server/server.rs | 64 ++++++++++++++++++++++++++- ui/src/components/inbox.tsx | 17 ++++++- ui/src/interfaces.ts | 2 +- ui/src/services/WebSocketService.ts | 6 +++ 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs index 9c609a470..3e361f691 100644 --- a/server/src/websocket_server/server.rs +++ b/server/src/websocket_server/server.rs @@ -27,7 +27,7 @@ use actions::moderator::*; #[derive(EnumString,ToString,Debug)] 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, Search + 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, Search, MarkAllAsRead } #[derive(Fail, Debug)] @@ -478,6 +478,11 @@ pub struct SearchResponse { posts: Vec, } +#[derive(Serialize, Deserialize)] +pub struct MarkAllAsRead { + auth: String +} + /// `ChatServer` manages chat rooms and responsible for coordinating chat /// session. implementation is super primitive pub struct ChatServer { @@ -728,6 +733,10 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result { + let mark_all_as_read: MarkAllAsRead = serde_json::from_str(data)?; + mark_all_as_read.perform(chat, msg.id) + }, } } @@ -2709,3 +2718,56 @@ impl Perform for Search { ) } } + + +impl Perform for MarkAllAsRead { + fn op_type(&self) -> UserOperation { + UserOperation::MarkAllAsRead + } + + fn perform(&self, _chat: &mut ChatServer, _addr: usize) -> Result { + + let conn = establish_connection(); + + let claims = match Claims::decode(&self.auth) { + Ok(claims) => claims.claims, + Err(_e) => { + return Err(self.error("Not logged in."))? + } + }; + + let user_id = claims.id; + + let replies = ReplyView::get_replies(&conn, user_id, &SortType::New, true, Some(1), Some(999))?; + + for reply in &replies { + let comment_form = CommentForm { + content: reply.to_owned().content, + parent_id: reply.to_owned().parent_id, + post_id: reply.to_owned().post_id, + creator_id: reply.to_owned().creator_id, + removed: None, + read: Some(true), + updated: reply.to_owned().updated + }; + + let _updated_comment = match Comment::update(&conn, reply.id, &comment_form) { + Ok(comment) => comment, + Err(_e) => { + return Err(self.error("Couldn't update Comment"))? + } + }; + } + + let replies = ReplyView::get_replies(&conn, user_id, &SortType::New, true, Some(1), Some(999))?; + + Ok( + serde_json::to_string( + &GetRepliesResponse { + op: self.op_type().to_string(), + replies: replies, + } + )? + ) + } +} diff --git a/ui/src/components/inbox.tsx b/ui/src/components/inbox.tsx index 02d813f3e..f4ef2ecdc 100644 --- a/ui/src/components/inbox.tsx +++ b/ui/src/components/inbox.tsx @@ -58,7 +58,16 @@ export class Inbox extends Component {
-
Inbox for {user.username}
+
+ Inbox for {user.username} +
+ {this.state.replies.length > 0 && this.state.unreadType == UnreadType.Unread && +
    +
  • + mark all as read +
  • +
+ } {this.selects()} {this.replies()} {this.paginator()} @@ -147,13 +156,17 @@ export class Inbox extends Component { i.refetch(); } + markAllAsRead() { + WebSocketService.Instance.markAllAsRead(); + } + parseMessage(msg: any) { console.log(msg); let op: UserOperation = msgOp(msg); if (msg.error) { alert(msg.error); return; - } else if (op == UserOperation.GetReplies) { + } else if (op == UserOperation.GetReplies || op == UserOperation.MarkAllAsRead) { let res: GetRepliesResponse = msg; this.state.replies = res.replies; this.sendRepliesCount(); diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts index 51582f3a1..8a16de432 100644 --- a/ui/src/interfaces.ts +++ b/ui/src/interfaces.ts @@ -1,5 +1,5 @@ export 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, Search + 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, Search, MarkAllAsRead } export enum CommentSortType { diff --git a/ui/src/services/WebSocketService.ts b/ui/src/services/WebSocketService.ts index 2389ab842..06e604e95 100644 --- a/ui/src/services/WebSocketService.ts +++ b/ui/src/services/WebSocketService.ts @@ -177,6 +177,12 @@ export class WebSocketService { this.subject.next(this.wsSendWrapper(UserOperation.Search, form)); } + public markAllAsRead() { + let form = {}; + this.setAuth(form); + this.subject.next(this.wsSendWrapper(UserOperation.MarkAllAsRead, form)); + } + private wsSendWrapper(op: UserOperation, data: any) { let send = { op: UserOperation[op], data: data }; console.log(send);