migration.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. use crate::{
  2. module::WorkspaceDatabase,
  3. services::persistence::{AppTableSql, TrashTableSql, ViewTableSql, WorkspaceTableSql, FOLDER_ID},
  4. };
  5. use flowy_collaboration::{
  6. entities::revision::{md5, Revision},
  7. folder::FolderPad,
  8. };
  9. use flowy_core_data_model::entities::{
  10. app::{App, RepeatedApp},
  11. view::{RepeatedView, View},
  12. workspace::Workspace,
  13. };
  14. use flowy_database::kv::KV;
  15. use flowy_error::{FlowyError, FlowyResult};
  16. use flowy_sync::{RevisionCache, RevisionManager};
  17. use std::sync::Arc;
  18. pub(crate) const V1_MIGRATION: &str = "FOLDER_V1_MIGRATION";
  19. pub(crate) struct FolderMigration {
  20. user_id: String,
  21. database: Arc<dyn WorkspaceDatabase>,
  22. }
  23. impl FolderMigration {
  24. pub fn new(user_id: &str, database: Arc<dyn WorkspaceDatabase>) -> Self {
  25. Self {
  26. user_id: user_id.to_owned(),
  27. database,
  28. }
  29. }
  30. pub fn run_v1_migration(&self) -> FlowyResult<Option<FolderPad>> {
  31. let key = md5(format!("{}{}", self.user_id, V1_MIGRATION));
  32. if KV::get_bool(&key).unwrap_or(false) {
  33. return Ok(None);
  34. }
  35. tracing::trace!("Run folder version 1 migrations");
  36. let pool = self.database.db_pool()?;
  37. let conn = &*pool.get()?;
  38. let workspaces = conn.immediate_transaction::<_, FlowyError, _>(|| {
  39. let mut workspaces = WorkspaceTableSql::read_workspaces(&self.user_id, None, conn)?
  40. .into_iter()
  41. .map(Workspace::from)
  42. .collect::<Vec<_>>();
  43. for workspace in workspaces.iter_mut() {
  44. let mut apps = AppTableSql::read_workspace_apps(&workspace.id, conn)?
  45. .into_iter()
  46. .map(App::from)
  47. .collect::<Vec<_>>();
  48. for app in apps.iter_mut() {
  49. let views = ViewTableSql::read_views(&app.id, conn)?
  50. .into_iter()
  51. .map(View::from)
  52. .collect::<Vec<_>>();
  53. app.belongings = RepeatedView { items: views };
  54. }
  55. workspace.apps = RepeatedApp { items: apps };
  56. }
  57. Ok(workspaces)
  58. })?;
  59. if workspaces.is_empty() {
  60. return Ok(None);
  61. }
  62. let trash = conn.immediate_transaction::<_, FlowyError, _>(|| {
  63. let trash = TrashTableSql::read_all(conn)?.take_items();
  64. Ok(trash)
  65. })?;
  66. let folder = FolderPad::new(workspaces, trash)?;
  67. KV::set_bool(&key, true);
  68. Ok(Some(folder))
  69. }
  70. }