server_api.rs 9.6 KB

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