server_api.rs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. use crate::{
  2. entities::{
  3. app::{App, AppIdentifier, CreateAppParams, DeleteAppParams, UpdateAppParams},
  4. trash::CreateTrashParams,
  5. view::{CreateViewParams, DeleteViewParams, UpdateViewParams, View, ViewIdentifier},
  6. workspace::{
  7. CreateWorkspaceParams,
  8. DeleteWorkspaceParams,
  9. QueryWorkspaceParams,
  10. RepeatedWorkspace,
  11. UpdateWorkspaceParams,
  12. Workspace,
  13. },
  14. },
  15. errors::WorkspaceError,
  16. services::server::WorkspaceServerAPI,
  17. };
  18. use crate::entities::trash::{RepeatedTrash, TrashIdentifiers};
  19. use flowy_infra::future::ResultFuture;
  20. use flowy_net::{config::*, request::HttpRequestBuilder};
  21. pub struct WorkspaceServer {
  22. config: ServerConfig,
  23. }
  24. impl WorkspaceServer {
  25. pub fn new(config: ServerConfig) -> WorkspaceServer { Self { config } }
  26. }
  27. impl WorkspaceServerAPI for WorkspaceServer {
  28. fn create_workspace(&self, token: &str, params: CreateWorkspaceParams) -> ResultFuture<Workspace, WorkspaceError> {
  29. let token = token.to_owned();
  30. let url = self.config.workspace_url();
  31. ResultFuture::new(async move { create_workspace_request(&token, params, &url).await })
  32. }
  33. fn read_workspace(
  34. &self,
  35. token: &str,
  36. params: QueryWorkspaceParams,
  37. ) -> ResultFuture<RepeatedWorkspace, WorkspaceError> {
  38. let token = token.to_owned();
  39. let url = self.config.workspace_url();
  40. ResultFuture::new(async move { read_workspaces_request(&token, params, &url).await })
  41. }
  42. fn update_workspace(&self, token: &str, params: UpdateWorkspaceParams) -> ResultFuture<(), WorkspaceError> {
  43. let token = token.to_owned();
  44. let url = self.config.workspace_url();
  45. ResultFuture::new(async move { update_workspace_request(&token, params, &url).await })
  46. }
  47. fn delete_workspace(&self, token: &str, params: DeleteWorkspaceParams) -> ResultFuture<(), WorkspaceError> {
  48. let token = token.to_owned();
  49. let url = self.config.workspace_url();
  50. ResultFuture::new(async move { delete_workspace_request(&token, params, &url).await })
  51. }
  52. fn create_view(&self, token: &str, params: CreateViewParams) -> ResultFuture<View, WorkspaceError> {
  53. let token = token.to_owned();
  54. let url = self.config.view_url();
  55. ResultFuture::new(async move { create_view_request(&token, params, &url).await })
  56. }
  57. fn read_view(&self, token: &str, params: ViewIdentifier) -> ResultFuture<Option<View>, WorkspaceError> {
  58. let token = token.to_owned();
  59. let url = self.config.view_url();
  60. ResultFuture::new(async move { read_view_request(&token, params, &url).await })
  61. }
  62. fn delete_view(&self, token: &str, params: DeleteViewParams) -> ResultFuture<(), WorkspaceError> {
  63. let token = token.to_owned();
  64. let url = self.config.view_url();
  65. ResultFuture::new(async move { delete_view_request(&token, params, &url).await })
  66. }
  67. fn update_view(&self, token: &str, params: UpdateViewParams) -> ResultFuture<(), WorkspaceError> {
  68. let token = token.to_owned();
  69. let url = self.config.view_url();
  70. ResultFuture::new(async move { update_view_request(&token, params, &url).await })
  71. }
  72. fn create_app(&self, token: &str, params: CreateAppParams) -> ResultFuture<App, WorkspaceError> {
  73. let token = token.to_owned();
  74. let url = self.config.app_url();
  75. ResultFuture::new(async move { create_app_request(&token, params, &url).await })
  76. }
  77. fn read_app(&self, token: &str, params: AppIdentifier) -> ResultFuture<Option<App>, WorkspaceError> {
  78. let token = token.to_owned();
  79. let url = self.config.app_url();
  80. ResultFuture::new(async move { read_app_request(&token, params, &url).await })
  81. }
  82. fn update_app(&self, token: &str, params: UpdateAppParams) -> ResultFuture<(), WorkspaceError> {
  83. let token = token.to_owned();
  84. let url = self.config.app_url();
  85. ResultFuture::new(async move { update_app_request(&token, params, &url).await })
  86. }
  87. fn delete_app(&self, token: &str, params: DeleteAppParams) -> ResultFuture<(), WorkspaceError> {
  88. let token = token.to_owned();
  89. let url = self.config.app_url();
  90. ResultFuture::new(async move { delete_app_request(&token, params, &url).await })
  91. }
  92. }
  93. pub(crate) fn request_builder() -> HttpRequestBuilder {
  94. HttpRequestBuilder::new().middleware(super::middleware::MIDDLEWARE.clone())
  95. }
  96. pub async fn create_workspace_request(
  97. token: &str,
  98. params: CreateWorkspaceParams,
  99. url: &str,
  100. ) -> Result<Workspace, WorkspaceError> {
  101. let workspace = request_builder()
  102. .post(&url.to_owned())
  103. .header(HEADER_TOKEN, token)
  104. .protobuf(params)?
  105. .response()
  106. .await?;
  107. Ok(workspace)
  108. }
  109. pub async fn read_workspaces_request(
  110. token: &str,
  111. params: QueryWorkspaceParams,
  112. url: &str,
  113. ) -> Result<RepeatedWorkspace, WorkspaceError> {
  114. let repeated_workspace = request_builder()
  115. .get(&url.to_owned())
  116. .header(HEADER_TOKEN, token)
  117. .protobuf(params)?
  118. .response::<RepeatedWorkspace>()
  119. .await?;
  120. Ok(repeated_workspace)
  121. }
  122. pub async fn update_workspace_request(
  123. token: &str,
  124. params: UpdateWorkspaceParams,
  125. url: &str,
  126. ) -> Result<(), WorkspaceError> {
  127. let _ = request_builder()
  128. .patch(&url.to_owned())
  129. .header(HEADER_TOKEN, token)
  130. .protobuf(params)?
  131. .send()
  132. .await?;
  133. Ok(())
  134. }
  135. pub async fn delete_workspace_request(
  136. token: &str,
  137. params: DeleteWorkspaceParams,
  138. url: &str,
  139. ) -> Result<(), WorkspaceError> {
  140. let _ = request_builder()
  141. .delete(url)
  142. .header(HEADER_TOKEN, token)
  143. .protobuf(params)?
  144. .send()
  145. .await?;
  146. Ok(())
  147. }
  148. // App
  149. pub async fn create_app_request(token: &str, params: CreateAppParams, url: &str) -> Result<App, WorkspaceError> {
  150. let app = request_builder()
  151. .post(&url.to_owned())
  152. .header(HEADER_TOKEN, token)
  153. .protobuf(params)?
  154. .response()
  155. .await?;
  156. Ok(app)
  157. }
  158. pub async fn read_app_request(token: &str, params: AppIdentifier, url: &str) -> Result<Option<App>, WorkspaceError> {
  159. let app = request_builder()
  160. .get(&url.to_owned())
  161. .header(HEADER_TOKEN, token)
  162. .protobuf(params)?
  163. .option_response()
  164. .await?;
  165. Ok(app)
  166. }
  167. pub async fn update_app_request(token: &str, params: UpdateAppParams, url: &str) -> Result<(), WorkspaceError> {
  168. let _ = request_builder()
  169. .patch(&url.to_owned())
  170. .header(HEADER_TOKEN, token)
  171. .protobuf(params)?
  172. .send()
  173. .await?;
  174. Ok(())
  175. }
  176. pub async fn delete_app_request(token: &str, params: DeleteAppParams, url: &str) -> Result<(), WorkspaceError> {
  177. let _ = request_builder()
  178. .delete(&url.to_owned())
  179. .header(HEADER_TOKEN, token)
  180. .protobuf(params)?
  181. .send()
  182. .await?;
  183. Ok(())
  184. }
  185. // View
  186. pub async fn create_view_request(token: &str, params: CreateViewParams, url: &str) -> Result<View, WorkspaceError> {
  187. let view = request_builder()
  188. .post(&url.to_owned())
  189. .header(HEADER_TOKEN, token)
  190. .protobuf(params)?
  191. .response()
  192. .await?;
  193. Ok(view)
  194. }
  195. pub async fn read_view_request(token: &str, params: ViewIdentifier, url: &str) -> Result<Option<View>, WorkspaceError> {
  196. let view = request_builder()
  197. .get(&url.to_owned())
  198. .header(HEADER_TOKEN, token)
  199. .protobuf(params)?
  200. .option_response()
  201. .await?;
  202. Ok(view)
  203. }
  204. pub async fn update_view_request(token: &str, params: UpdateViewParams, url: &str) -> Result<(), WorkspaceError> {
  205. let _ = request_builder()
  206. .patch(&url.to_owned())
  207. .header(HEADER_TOKEN, token)
  208. .protobuf(params)?
  209. .send()
  210. .await?;
  211. Ok(())
  212. }
  213. pub async fn delete_view_request(token: &str, params: DeleteViewParams, url: &str) -> Result<(), WorkspaceError> {
  214. let _ = request_builder()
  215. .delete(&url.to_owned())
  216. .header(HEADER_TOKEN, token)
  217. .protobuf(params)?
  218. .send()
  219. .await?;
  220. Ok(())
  221. }
  222. pub async fn create_trash_request(token: &str, params: CreateTrashParams, url: &str) -> Result<(), WorkspaceError> {
  223. let _ = request_builder()
  224. .post(&url.to_owned())
  225. .header(HEADER_TOKEN, token)
  226. .protobuf(params)?
  227. .send()
  228. .await?;
  229. Ok(())
  230. }
  231. pub async fn delete_trash_request(token: &str, params: TrashIdentifiers, url: &str) -> Result<(), WorkspaceError> {
  232. let _ = request_builder()
  233. .delete(&url.to_owned())
  234. .header(HEADER_TOKEN, token)
  235. .protobuf(params)?
  236. .send()
  237. .await?;
  238. Ok(())
  239. }
  240. pub async fn read_trash_request(token: &str, url: &str) -> Result<RepeatedTrash, WorkspaceError> {
  241. let repeated_trash = request_builder()
  242. .get(&url.to_owned())
  243. .header(HEADER_TOKEN, token)
  244. .response::<RepeatedTrash>()
  245. .await?;
  246. Ok(repeated_trash)
  247. }