document.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. use backend_service::{
  2. configuration::*,
  3. request::{HttpRequestBuilder, ResponseMiddleware},
  4. response::FlowyResponse,
  5. };
  6. use flowy_collaboration::entities::document_info::{CreateDocParams, DocumentId, DocumentInfo, ResetDocumentParams};
  7. use flowy_document::DocumentCloudService;
  8. use flowy_error::FlowyError;
  9. use lazy_static::lazy_static;
  10. use lib_infra::future::FutureResult;
  11. use std::sync::Arc;
  12. pub struct DocumentHttpCloudService {
  13. config: ClientServerConfiguration,
  14. }
  15. impl DocumentHttpCloudService {
  16. pub fn new(config: ClientServerConfiguration) -> Self {
  17. Self { config }
  18. }
  19. }
  20. impl DocumentCloudService for DocumentHttpCloudService {
  21. fn create_document(&self, token: &str, params: CreateDocParams) -> FutureResult<(), FlowyError> {
  22. let token = token.to_owned();
  23. let url = self.config.doc_url();
  24. FutureResult::new(async move { create_document_request(&token, params, &url).await })
  25. }
  26. fn read_document(&self, token: &str, params: DocumentId) -> FutureResult<Option<DocumentInfo>, FlowyError> {
  27. let token = token.to_owned();
  28. let url = self.config.doc_url();
  29. FutureResult::new(async move { read_document_request(&token, params, &url).await })
  30. }
  31. fn update_document(&self, token: &str, params: ResetDocumentParams) -> FutureResult<(), FlowyError> {
  32. let token = token.to_owned();
  33. let url = self.config.doc_url();
  34. FutureResult::new(async move { reset_doc_request(&token, params, &url).await })
  35. }
  36. }
  37. pub async fn create_document_request(token: &str, params: CreateDocParams, url: &str) -> Result<(), FlowyError> {
  38. let _ = request_builder()
  39. .post(&url.to_owned())
  40. .header(HEADER_TOKEN, token)
  41. .protobuf(params)?
  42. .send()
  43. .await?;
  44. Ok(())
  45. }
  46. pub async fn read_document_request(
  47. token: &str,
  48. params: DocumentId,
  49. url: &str,
  50. ) -> Result<Option<DocumentInfo>, FlowyError> {
  51. let doc = request_builder()
  52. .get(&url.to_owned())
  53. .header(HEADER_TOKEN, token)
  54. .protobuf(params)?
  55. .option_response()
  56. .await?;
  57. Ok(doc)
  58. }
  59. pub async fn reset_doc_request(token: &str, params: ResetDocumentParams, url: &str) -> Result<(), FlowyError> {
  60. let _ = request_builder()
  61. .patch(&url.to_owned())
  62. .header(HEADER_TOKEN, token)
  63. .protobuf(params)?
  64. .send()
  65. .await?;
  66. Ok(())
  67. }
  68. fn request_builder() -> HttpRequestBuilder {
  69. HttpRequestBuilder::new().middleware(MIDDLEWARE.clone())
  70. }
  71. lazy_static! {
  72. pub(crate) static ref MIDDLEWARE: Arc<DocumentResponseMiddleware> = Arc::new(DocumentResponseMiddleware {});
  73. }
  74. pub(crate) struct DocumentResponseMiddleware {}
  75. impl ResponseMiddleware for DocumentResponseMiddleware {
  76. fn receive_response(&self, token: &Option<String>, response: &FlowyResponse) {
  77. if let Some(error) = &response.error {
  78. if error.is_unauthorized() {
  79. tracing::error!("document user is unauthorized");
  80. match token {
  81. None => {}
  82. Some(_token) => {
  83. // let error =
  84. // FlowyError::new(ErrorCode::UserUnauthorized, "");
  85. // observable(token,
  86. // WorkspaceObservable::UserUnauthorized).error(error).
  87. // build()
  88. }
  89. }
  90. }
  91. }
  92. }
  93. }