use crate::services::persistence::{ version_1::{ app_sql::{AppChangeset, AppTableSql}, view_sql::{ViewChangeset, ViewTableSql}, workspace_sql::{WorkspaceChangeset, WorkspaceTableSql}, }, FolderPersistenceTransaction, TrashTableSql, }; use flowy_database::DBConnection; use flowy_error::FlowyResult; use folder_rev_model::{AppRevision, TrashRevision, ViewRevision, WorkspaceRevision}; /// V1Transaction is deprecated since version 0.0.2 version pub struct V1Transaction<'a>(pub &'a DBConnection); impl<'a> FolderPersistenceTransaction for V1Transaction<'a> { fn create_workspace(&self, user_id: &str, workspace_rev: WorkspaceRevision) -> FlowyResult<()> { WorkspaceTableSql::create_workspace(user_id, workspace_rev, self.0)?; Ok(()) } fn read_workspaces(&self, user_id: &str, workspace_id: Option) -> FlowyResult> { let tables = WorkspaceTableSql::read_workspaces(user_id, workspace_id, self.0)?; let workspaces = tables.into_iter().map(WorkspaceRevision::from).collect::>(); Ok(workspaces) } fn update_workspace(&self, changeset: WorkspaceChangeset) -> FlowyResult<()> { WorkspaceTableSql::update_workspace(changeset, self.0) } fn delete_workspace(&self, workspace_id: &str) -> FlowyResult<()> { WorkspaceTableSql::delete_workspace(workspace_id, self.0) } fn create_app(&self, app_rev: AppRevision) -> FlowyResult<()> { AppTableSql::create_app(app_rev, self.0)?; Ok(()) } fn update_app(&self, changeset: AppChangeset) -> FlowyResult<()> { AppTableSql::update_app(changeset, self.0)?; Ok(()) } fn read_app(&self, app_id: &str) -> FlowyResult { let app_revision: AppRevision = AppTableSql::read_app(app_id, self.0)?.into(); Ok(app_revision) } fn read_workspace_apps(&self, workspace_id: &str) -> FlowyResult> { let tables = AppTableSql::read_workspace_apps(workspace_id, self.0)?; let apps = tables.into_iter().map(AppRevision::from).collect::>(); Ok(apps) } fn delete_app(&self, app_id: &str) -> FlowyResult { let app_revision: AppRevision = AppTableSql::delete_app(app_id, self.0)?.into(); Ok(app_revision) } fn move_app(&self, _app_id: &str, _from: usize, _to: usize) -> FlowyResult<()> { Ok(()) } fn create_view(&self, view_rev: ViewRevision) -> FlowyResult<()> { ViewTableSql::create_view(view_rev, self.0)?; Ok(()) } fn read_view(&self, view_id: &str) -> FlowyResult { let view_revision: ViewRevision = ViewTableSql::read_view(view_id, self.0)?.into(); Ok(view_revision) } fn read_views(&self, belong_to_id: &str) -> FlowyResult> { let tables = ViewTableSql::read_views(belong_to_id, self.0)?; let views = tables.into_iter().map(ViewRevision::from).collect::>(); Ok(views) } fn update_view(&self, changeset: ViewChangeset) -> FlowyResult<()> { ViewTableSql::update_view(changeset, self.0)?; Ok(()) } fn delete_view(&self, view_id: &str) -> FlowyResult { let view_revision: ViewRevision = ViewTableSql::read_view(view_id, self.0)?.into(); ViewTableSql::delete_view(view_id, self.0)?; Ok(view_revision) } fn move_view(&self, _view_id: &str, _from: usize, _to: usize) -> FlowyResult<()> { Ok(()) } fn create_trash(&self, trashes: Vec) -> FlowyResult<()> { TrashTableSql::create_trash(trashes, self.0)?; Ok(()) } fn read_trash(&self, trash_id: Option) -> FlowyResult> { match trash_id { None => TrashTableSql::read_all(self.0), Some(trash_id) => { let trash_revision: TrashRevision = TrashTableSql::read(&trash_id, self.0)?.into(); Ok(vec![trash_revision]) } } } fn delete_trash(&self, trash_ids: Option>) -> FlowyResult<()> { match trash_ids { None => TrashTableSql::delete_all(self.0), Some(trash_ids) => { for trash_id in &trash_ids { TrashTableSql::delete_trash(trash_id, self.0)?; } Ok(()) } } } } // https://www.reddit.com/r/rust/comments/droxdg/why_arent_traits_impld_for_boxdyn_trait/ impl FolderPersistenceTransaction for Box where T: FolderPersistenceTransaction + ?Sized, { fn create_workspace(&self, user_id: &str, workspace_rev: WorkspaceRevision) -> FlowyResult<()> { (**self).create_workspace(user_id, workspace_rev) } fn read_workspaces(&self, user_id: &str, workspace_id: Option) -> FlowyResult> { (**self).read_workspaces(user_id, workspace_id) } fn update_workspace(&self, changeset: WorkspaceChangeset) -> FlowyResult<()> { (**self).update_workspace(changeset) } fn delete_workspace(&self, workspace_id: &str) -> FlowyResult<()> { (**self).delete_workspace(workspace_id) } fn create_app(&self, app_rev: AppRevision) -> FlowyResult<()> { (**self).create_app(app_rev) } fn update_app(&self, changeset: AppChangeset) -> FlowyResult<()> { (**self).update_app(changeset) } fn read_app(&self, app_id: &str) -> FlowyResult { (**self).read_app(app_id) } fn read_workspace_apps(&self, workspace_id: &str) -> FlowyResult> { (**self).read_workspace_apps(workspace_id) } fn delete_app(&self, app_id: &str) -> FlowyResult { (**self).delete_app(app_id) } fn move_app(&self, _app_id: &str, _from: usize, _to: usize) -> FlowyResult<()> { Ok(()) } fn create_view(&self, view_rev: ViewRevision) -> FlowyResult<()> { (**self).create_view(view_rev) } fn read_view(&self, view_id: &str) -> FlowyResult { (**self).read_view(view_id) } fn read_views(&self, belong_to_id: &str) -> FlowyResult> { (**self).read_views(belong_to_id) } fn update_view(&self, changeset: ViewChangeset) -> FlowyResult<()> { (**self).update_view(changeset) } fn delete_view(&self, view_id: &str) -> FlowyResult { (**self).delete_view(view_id) } fn move_view(&self, _view_id: &str, _from: usize, _to: usize) -> FlowyResult<()> { Ok(()) } fn create_trash(&self, trashes: Vec) -> FlowyResult<()> { (**self).create_trash(trashes) } fn read_trash(&self, trash_id: Option) -> FlowyResult> { (**self).read_trash(trash_id) } fn delete_trash(&self, trash_ids: Option>) -> FlowyResult<()> { (**self).delete_trash(trash_ids) } }