editor.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. use crate::{
  2. services::doc::update_doc,
  3. web_socket::{entities::Socket, WsMessageAdaptor, WsUser},
  4. };
  5. use actix_web::web::Data;
  6. use backend_service::errors::internal_error;
  7. use flowy_collaboration::{
  8. core::sync::{RevisionUser, SyncResponse},
  9. protobuf::UpdateDocParams,
  10. };
  11. use sqlx::PgPool;
  12. use std::sync::Arc;
  13. #[derive(Clone, Debug)]
  14. pub struct ServerDocUser {
  15. pub user: Arc<WsUser>,
  16. pub(crate) socket: Socket,
  17. pub pg_pool: Data<PgPool>,
  18. }
  19. impl RevisionUser for ServerDocUser {
  20. fn user_id(&self) -> String { self.user.id().to_string() }
  21. fn recv(&self, resp: SyncResponse) {
  22. let result = match resp {
  23. SyncResponse::Pull(data) => {
  24. let msg: WsMessageAdaptor = data.into();
  25. self.socket.try_send(msg).map_err(internal_error)
  26. },
  27. SyncResponse::Push(data) => {
  28. let msg: WsMessageAdaptor = data.into();
  29. self.socket.try_send(msg).map_err(internal_error)
  30. },
  31. SyncResponse::Ack(data) => {
  32. let msg: WsMessageAdaptor = data.into();
  33. self.socket.try_send(msg).map_err(internal_error)
  34. },
  35. SyncResponse::NewRevision {
  36. rev_id,
  37. doc_id,
  38. doc_json,
  39. } => {
  40. let pg_pool = self.pg_pool.clone();
  41. tokio::task::spawn(async move {
  42. let mut params = UpdateDocParams::new();
  43. params.set_doc_id(doc_id);
  44. params.set_data(doc_json);
  45. params.set_rev_id(rev_id);
  46. match update_doc(pg_pool.get_ref(), params).await {
  47. Ok(_) => {},
  48. Err(e) => log::error!("{}", e),
  49. }
  50. });
  51. Ok(())
  52. },
  53. };
  54. match result {
  55. Ok(_) => {},
  56. Err(e) => log::error!("[ServerDocUser]: {}", e),
  57. }
  58. }
  59. }