util.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. use std::ops::Deref;
  2. use std::sync::Arc;
  3. use std::time::Duration;
  4. use anyhow::Error;
  5. use collab_folder::core::FolderData;
  6. use collab_plugins::cloud_storage::RemoteCollabStorage;
  7. use tokio::sync::mpsc::Receiver;
  8. use tokio::time::timeout;
  9. use flowy_database_deps::cloud::DatabaseCloudService;
  10. use flowy_folder_deps::cloud::{FolderCloudService, FolderSnapshot};
  11. use flowy_server::supabase::api::*;
  12. use flowy_server::{AppFlowyEncryption, EncryptionImpl};
  13. use flowy_server_config::supabase_config::SupabaseConfiguration;
  14. use flowy_test::event_builder::EventBuilder;
  15. use flowy_test::FlowyCoreTest;
  16. use flowy_user::entities::{AuthTypePB, UpdateUserProfilePayloadPB, UserCredentialsPB};
  17. use flowy_user::errors::FlowyError;
  18. use flowy_user::event_map::UserCloudServiceProvider;
  19. use flowy_user::event_map::UserEvent::*;
  20. use flowy_user_deps::cloud::UserService;
  21. use flowy_user_deps::entities::AuthType;
  22. pub fn get_supabase_config() -> Option<SupabaseConfiguration> {
  23. dotenv::from_path(".env.ci").ok()?;
  24. SupabaseConfiguration::from_env().ok()
  25. }
  26. pub struct FlowySupabaseTest {
  27. inner: FlowyCoreTest,
  28. }
  29. impl FlowySupabaseTest {
  30. pub fn new() -> Option<Self> {
  31. let _ = get_supabase_config()?;
  32. let test = FlowyCoreTest::new();
  33. test.set_auth_type(AuthTypePB::Supabase);
  34. test.server_provider.set_auth_type(AuthType::Supabase);
  35. Some(Self { inner: test })
  36. }
  37. pub async fn check_user_with_uuid(&self, uuid: &str) -> Result<(), FlowyError> {
  38. match EventBuilder::new(self.inner.clone())
  39. .event(CheckUser)
  40. .payload(UserCredentialsPB::from_uuid(uuid))
  41. .async_send()
  42. .await
  43. .error()
  44. {
  45. None => Ok(()),
  46. Some(error) => Err(error),
  47. }
  48. }
  49. pub async fn update_user_profile(
  50. &self,
  51. payload: UpdateUserProfilePayloadPB,
  52. ) -> Option<FlowyError> {
  53. EventBuilder::new(self.inner.clone())
  54. .event(UpdateUserProfile)
  55. .payload(payload)
  56. .async_send()
  57. .await
  58. .error()
  59. }
  60. }
  61. impl Deref for FlowySupabaseTest {
  62. type Target = FlowyCoreTest;
  63. fn deref(&self) -> &Self::Target {
  64. &self.inner
  65. }
  66. }
  67. pub async fn receive_with_timeout<T>(
  68. receiver: &mut Receiver<T>,
  69. duration: Duration,
  70. ) -> Result<T, Box<dyn std::error::Error>> {
  71. let res = timeout(duration, receiver.recv())
  72. .await?
  73. .ok_or(anyhow::anyhow!("recv timeout"))?;
  74. Ok(res)
  75. }
  76. pub fn get_supabase_ci_config() -> Option<SupabaseConfiguration> {
  77. dotenv::from_filename("./.env.ci").ok()?;
  78. SupabaseConfiguration::from_env().ok()
  79. }
  80. #[allow(dead_code)]
  81. pub fn get_supabase_dev_config() -> Option<SupabaseConfiguration> {
  82. dotenv::from_filename("./.env.dev").ok()?;
  83. SupabaseConfiguration::from_env().ok()
  84. }
  85. pub fn collab_service() -> Arc<dyn RemoteCollabStorage> {
  86. let (server, encryption_impl) = appflowy_server(None);
  87. Arc::new(SupabaseCollabStorageImpl::new(
  88. server,
  89. None,
  90. Arc::downgrade(&encryption_impl),
  91. ))
  92. }
  93. pub fn database_service() -> Arc<dyn DatabaseCloudService> {
  94. let (server, _encryption_impl) = appflowy_server(None);
  95. Arc::new(SupabaseDatabaseServiceImpl::new(server))
  96. }
  97. pub fn user_auth_service() -> Arc<dyn UserService> {
  98. let (server, _encryption_impl) = appflowy_server(None);
  99. Arc::new(SupabaseUserServiceImpl::new(server, vec![], None))
  100. }
  101. pub fn folder_service() -> Arc<dyn FolderCloudService> {
  102. let (server, _encryption_impl) = appflowy_server(None);
  103. Arc::new(SupabaseFolderServiceImpl::new(server))
  104. }
  105. #[allow(dead_code)]
  106. pub fn encryption_folder_service(
  107. secret: Option<String>,
  108. ) -> (Arc<dyn FolderCloudService>, Arc<dyn AppFlowyEncryption>) {
  109. let (server, encryption_impl) = appflowy_server(secret);
  110. let service = Arc::new(SupabaseFolderServiceImpl::new(server));
  111. (service, encryption_impl)
  112. }
  113. pub fn encryption_collab_service(
  114. secret: Option<String>,
  115. ) -> (Arc<dyn RemoteCollabStorage>, Arc<dyn AppFlowyEncryption>) {
  116. let (server, encryption_impl) = appflowy_server(secret);
  117. let service = Arc::new(SupabaseCollabStorageImpl::new(
  118. server,
  119. None,
  120. Arc::downgrade(&encryption_impl),
  121. ));
  122. (service, encryption_impl)
  123. }
  124. pub async fn get_folder_data_from_server(
  125. folder_id: &str,
  126. encryption_secret: Option<String>,
  127. ) -> Result<Option<FolderData>, Error> {
  128. let (cloud_service, _encryption) = encryption_folder_service(encryption_secret);
  129. cloud_service.get_folder_data(folder_id).await
  130. }
  131. pub async fn get_folder_snapshots(
  132. folder_id: &str,
  133. encryption_secret: Option<String>,
  134. ) -> Vec<FolderSnapshot> {
  135. let (cloud_service, _encryption) = encryption_folder_service(encryption_secret);
  136. cloud_service
  137. .get_folder_snapshots(folder_id, 10)
  138. .await
  139. .unwrap()
  140. }
  141. pub fn appflowy_server(
  142. encryption_secret: Option<String>,
  143. ) -> (SupabaseServerServiceImpl, Arc<dyn AppFlowyEncryption>) {
  144. let config = SupabaseConfiguration::from_env().unwrap();
  145. let encryption_impl: Arc<dyn AppFlowyEncryption> =
  146. Arc::new(EncryptionImpl::new(encryption_secret));
  147. let encryption = Arc::downgrade(&encryption_impl);
  148. let server = Arc::new(RESTfulPostgresServer::new(config, encryption));
  149. (SupabaseServerServiceImpl::new(server), encryption_impl)
  150. }