From 4f69d20bc7cd15fcb39476d2b7d50e6eaf1ab5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Tue, 7 Apr 2020 16:02:13 +0200 Subject: [PATCH] Handle update issue --- jirs-client/src/modal/mod.rs | 2 +- jirs-client/src/model.rs | 15 +++++++--- jirs-client/src/project.rs | 2 +- jirs-data/src/lib.rs | 2 +- jirs-server/src/ws/mod.rs | 56 ++++++++++++++++++++++++++++++------ 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/jirs-client/src/modal/mod.rs b/jirs-client/src/modal/mod.rs index f1d010b3..d7cb5bb1 100644 --- a/jirs-client/src/modal/mod.rs +++ b/jirs-client/src/modal/mod.rs @@ -98,7 +98,7 @@ pub fn update(msg: &Msg, model: &mut model::Model, orders: &mut impl Orders project_id: Some(issue.project_id.clone()), user_ids: Some(issue.user_ids.clone()), }; - send_ws_msg(jirs_data::WsMsg::IssueUpdateRequest(form)); + send_ws_msg(jirs_data::WsMsg::IssueUpdateRequest(issue_id.clone(), form)); } _ => {} } diff --git a/jirs-client/src/model.rs b/jirs-client/src/model.rs index 5a10d1bb..bc021f1f 100644 --- a/jirs-client/src/model.rs +++ b/jirs-client/src/model.rs @@ -96,17 +96,24 @@ pub struct ProjectPage { #[derive(Debug)] pub struct Model { + pub host_url: String, pub access_token: Option, + + // mapped + pub comments_by_project_id: HashMap>, + + // forms pub project_form: Option, pub issue_form: Option, pub comment_form: Option, - pub comments_by_project_id: HashMap>, - pub page: Page, - pub host_url: String, - pub project_page: ProjectPage, + // modals pub modals: Vec, + // pages + pub page: Page, + pub project_page: ProjectPage, + pub project: Option, pub user: Option, pub issues: Vec, diff --git a/jirs-client/src/project.rs b/jirs-client/src/project.rs index 601f4f40..36da4736 100644 --- a/jirs-client/src/project.rs +++ b/jirs-client/src/project.rs @@ -116,7 +116,7 @@ pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Order user_ids: Some(issue.user_ids.clone()), }; model.project_page.dragged_issue_id = None; - send_ws_msg(WsMsg::IssueUpdateRequest(payload)); + send_ws_msg(WsMsg::IssueUpdateRequest(issue_id, payload)); } _ => error!("Drag stopped before drop :("), }, diff --git a/jirs-data/src/lib.rs b/jirs-data/src/lib.rs index aa84259a..4887bfeb 100644 --- a/jirs-data/src/lib.rs +++ b/jirs-data/src/lib.rs @@ -406,7 +406,7 @@ pub enum WsMsg { ProjectUsersLoaded(Vec), // issue - IssueUpdateRequest(UpdateIssuePayload), + IssueUpdateRequest(i32, UpdateIssuePayload), IssueUpdated(Issue), IssueDeleteRequest(i32), IssueDeleted(i32), diff --git a/jirs-server/src/ws/mod.rs b/jirs-server/src/ws/mod.rs index a0842ca1..a295ee2b 100644 --- a/jirs-server/src/ws/mod.rs +++ b/jirs-server/src/ws/mod.rs @@ -6,7 +6,7 @@ use actix_web_actors::ws; use jirs_data::{Project, WsMsg}; use crate::db::authorize_user::AuthorizeUser; -use crate::db::issues::LoadProjectIssues; +use crate::db::issues::{LoadProjectIssues, UpdateIssue}; use crate::db::projects::LoadCurrentProject; use crate::db::users::LoadProjectUsers; use crate::db::DbExecutor; @@ -53,14 +53,9 @@ impl WebSocketActor { Err("Invalid auth token".to_string()), )), }, - WsMsg::ProjectIssuesRequest => match block_on(self.load_issues()) { - Some(msg) => Some(msg), - _ => None, - }, - WsMsg::ProjectUsersRequest => match block_on(self.load_project_users()) { - Some(msg) => Some(msg), - _ => None, - }, + WsMsg::ProjectIssuesRequest => block_on(self.load_issues()), + WsMsg::ProjectUsersRequest => block_on(self.load_project_users()), + WsMsg::IssueUpdateRequest(id, payload) => block_on(self.update_issue(id, payload)), _ => { error!("Failed to resolve message"); None @@ -115,6 +110,49 @@ impl WebSocketActor { _ => None, } } + + async fn update_issue( + &mut self, + issue_id: i32, + payload: jirs_data::UpdateIssuePayload, + ) -> Option { + let jirs_data::UpdateIssuePayload { + title, + issue_type, + status, + priority, + list_position, + description, + description_text, + estimate, + time_spent, + time_remaining, + project_id, + user_ids, + } = payload; + match self + .db + .send(UpdateIssue { + issue_id, + title, + issue_type, + status, + priority, + list_position, + description, + description_text, + estimate, + time_spent, + time_remaining, + project_id, + user_ids, + }) + .await + { + Ok(Ok(issue)) => Some(WsMsg::IssueUpdated(issue.into())), + _ => None, + } + } } impl StreamHandler> for WebSocketActor {