util.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. use std::collections::HashMap;
  2. use std::sync::Arc;
  3. use collab::core::collab::MutexCollab;
  4. use collab::core::origin::CollabOrigin;
  5. use collab_plugins::cloud_storage::RemoteCollabStorage;
  6. use uuid::Uuid;
  7. use flowy_database_deps::cloud::DatabaseCloudService;
  8. use flowy_error::FlowyError;
  9. use flowy_folder_deps::cloud::{Folder, FolderCloudService};
  10. use flowy_server::supabase::api::{
  11. RESTfulPostgresServer, SupabaseCollabStorageImpl, SupabaseDatabaseServiceImpl,
  12. SupabaseFolderServiceImpl, SupabaseServerServiceImpl, SupabaseUserServiceImpl,
  13. };
  14. use flowy_server::supabase::define::{USER_DEVICE_ID, USER_EMAIL, USER_UUID};
  15. use flowy_server::supabase::file_storage::core::SupabaseFileStorage;
  16. use flowy_server::{AppFlowyEncryption, EncryptionImpl};
  17. use flowy_server_config::supabase_config::SupabaseConfiguration;
  18. use flowy_storage::{FileStoragePlan, FileStorageService, StorageObject};
  19. use flowy_user_deps::cloud::UserCloudService;
  20. use lib_infra::future::FutureResult;
  21. use crate::setup_log;
  22. pub fn get_supabase_ci_config() -> Option<SupabaseConfiguration> {
  23. dotenv::from_filename("./.env.ci").ok()?;
  24. setup_log();
  25. SupabaseConfiguration::from_env().ok()
  26. }
  27. #[allow(dead_code)]
  28. pub fn get_supabase_dev_config() -> Option<SupabaseConfiguration> {
  29. dotenv::from_filename("./.env.dev").ok()?;
  30. setup_log();
  31. SupabaseConfiguration::from_env().ok()
  32. }
  33. pub fn collab_service() -> Arc<dyn RemoteCollabStorage> {
  34. let (server, encryption_impl) = supabase_server_service(None);
  35. Arc::new(SupabaseCollabStorageImpl::new(
  36. server,
  37. None,
  38. Arc::downgrade(&encryption_impl),
  39. ))
  40. }
  41. pub fn database_service() -> Arc<dyn DatabaseCloudService> {
  42. let (server, _encryption_impl) = supabase_server_service(None);
  43. Arc::new(SupabaseDatabaseServiceImpl::new(server))
  44. }
  45. pub fn user_auth_service() -> Arc<dyn UserCloudService> {
  46. let (server, _encryption_impl) = supabase_server_service(None);
  47. Arc::new(SupabaseUserServiceImpl::new(server, vec![], None))
  48. }
  49. pub fn folder_service() -> Arc<dyn FolderCloudService> {
  50. let (server, _encryption_impl) = supabase_server_service(None);
  51. Arc::new(SupabaseFolderServiceImpl::new(server))
  52. }
  53. pub fn file_storage_service() -> Arc<dyn FileStorageService> {
  54. let encryption_impl: Arc<dyn AppFlowyEncryption> = Arc::new(EncryptionImpl::new(None));
  55. let config = SupabaseConfiguration::from_env().unwrap();
  56. Arc::new(
  57. SupabaseFileStorage::new(
  58. &config,
  59. Arc::downgrade(&encryption_impl),
  60. Arc::new(TestFileStoragePlan),
  61. )
  62. .unwrap(),
  63. )
  64. }
  65. #[allow(dead_code)]
  66. pub fn encryption_folder_service(
  67. secret: Option<String>,
  68. ) -> (Arc<dyn FolderCloudService>, Arc<dyn AppFlowyEncryption>) {
  69. let (server, encryption_impl) = supabase_server_service(secret);
  70. let service = Arc::new(SupabaseFolderServiceImpl::new(server));
  71. (service, encryption_impl)
  72. }
  73. #[allow(dead_code)]
  74. pub fn encryption_collab_service(
  75. secret: Option<String>,
  76. ) -> (Arc<dyn RemoteCollabStorage>, Arc<dyn AppFlowyEncryption>) {
  77. let (server, encryption_impl) = supabase_server_service(secret);
  78. let service = Arc::new(SupabaseCollabStorageImpl::new(
  79. server,
  80. None,
  81. Arc::downgrade(&encryption_impl),
  82. ));
  83. (service, encryption_impl)
  84. }
  85. #[allow(dead_code)]
  86. pub async fn print_encryption_folder(folder_id: &str, encryption_secret: Option<String>) {
  87. let (cloud_service, _encryption) = encryption_folder_service(encryption_secret);
  88. let folder_data = cloud_service.get_folder_data(folder_id).await.unwrap();
  89. let json = serde_json::to_value(folder_data).unwrap();
  90. println!("{}", serde_json::to_string_pretty(&json).unwrap());
  91. }
  92. #[allow(dead_code)]
  93. pub async fn print_encryption_folder_snapshot(folder_id: &str, encryption_secret: Option<String>) {
  94. let (cloud_service, _encryption) = encryption_collab_service(encryption_secret);
  95. let snapshot = cloud_service
  96. .get_snapshots(folder_id, 1)
  97. .await
  98. .pop()
  99. .unwrap();
  100. let collab = Arc::new(
  101. MutexCollab::new_with_raw_data(CollabOrigin::Empty, folder_id, vec![snapshot.blob], vec![])
  102. .unwrap(),
  103. );
  104. let folder_data = Folder::open(collab, None).get_folder_data().unwrap();
  105. let json = serde_json::to_value(folder_data).unwrap();
  106. println!("{}", serde_json::to_string_pretty(&json).unwrap());
  107. }
  108. pub fn supabase_server_service(
  109. encryption_secret: Option<String>,
  110. ) -> (SupabaseServerServiceImpl, Arc<dyn AppFlowyEncryption>) {
  111. let config = SupabaseConfiguration::from_env().unwrap();
  112. let encryption_impl: Arc<dyn AppFlowyEncryption> =
  113. Arc::new(EncryptionImpl::new(encryption_secret));
  114. let encryption = Arc::downgrade(&encryption_impl);
  115. let server = Arc::new(RESTfulPostgresServer::new(config, encryption));
  116. (SupabaseServerServiceImpl::new(server), encryption_impl)
  117. }
  118. pub fn third_party_sign_up_param(uuid: String) -> HashMap<String, String> {
  119. let mut params = HashMap::new();
  120. params.insert(USER_UUID.to_string(), uuid);
  121. params.insert(
  122. USER_EMAIL.to_string(),
  123. format!("{}@test.com", Uuid::new_v4()),
  124. );
  125. params.insert(USER_DEVICE_ID.to_string(), Uuid::new_v4().to_string());
  126. params
  127. }
  128. pub struct TestFileStoragePlan;
  129. impl FileStoragePlan for TestFileStoragePlan {
  130. fn storage_size(&self) -> FutureResult<u64, FlowyError> {
  131. // 1 GB
  132. FutureResult::new(async { Ok(1024 * 1024 * 1024) })
  133. }
  134. fn maximum_file_size(&self) -> FutureResult<u64, FlowyError> {
  135. // 5 MB
  136. FutureResult::new(async { Ok(5 * 1024 * 1024) })
  137. }
  138. fn check_upload_object(&self, _object: &StorageObject) -> FutureResult<(), FlowyError> {
  139. FutureResult::new(async { Ok(()) })
  140. }
  141. }