app_sql.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. use crate::{
  2. errors::WorkspaceError,
  3. module::WorkspaceDatabase,
  4. sql_tables::app::{AppTable, AppTableChangeset},
  5. };
  6. use flowy_database::{
  7. prelude::*,
  8. schema::{app_table, app_table::dsl},
  9. SqliteConnection,
  10. };
  11. use std::sync::Arc;
  12. pub struct AppTableSql {
  13. database: Arc<dyn WorkspaceDatabase>,
  14. }
  15. impl AppTableSql {
  16. pub fn new(database: Arc<dyn WorkspaceDatabase>) -> Self { Self { database } }
  17. }
  18. impl AppTableSql {
  19. pub(crate) fn create_app(&self, app_table: AppTable) -> Result<(), WorkspaceError> {
  20. let conn = self.database.db_connection()?;
  21. let _ = self.create_app_with(app_table, &*conn)?;
  22. Ok(())
  23. }
  24. pub(crate) fn create_app_with(&self, app_table: AppTable, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
  25. match diesel_record_count!(app_table, &app_table.id, conn) {
  26. 0 => diesel_insert_table!(app_table, &app_table, conn),
  27. _ => {
  28. let changeset = AppTableChangeset::from_table(app_table);
  29. diesel_update_table!(app_table, changeset, conn)
  30. },
  31. }
  32. Ok(())
  33. }
  34. pub(crate) fn update_app(&self, changeset: AppTableChangeset) -> Result<(), WorkspaceError> {
  35. let conn = self.database.db_connection()?;
  36. diesel_update_table!(app_table, changeset, &*conn);
  37. Ok(())
  38. }
  39. pub(crate) fn read_app(&self, app_id: &str, is_trash: bool) -> Result<AppTable, WorkspaceError> {
  40. let app_table = dsl::app_table
  41. .filter(app_table::id.eq(app_id))
  42. .filter(app_table::is_trash.eq(is_trash))
  43. .first::<AppTable>(&*(self.database.db_connection()?))?;
  44. Ok(app_table)
  45. }
  46. pub(crate) fn read_apps(&self, workspace_id: &str, is_trash: bool) -> Result<Vec<AppTable>, WorkspaceError> {
  47. let app_table = dsl::app_table
  48. .filter(app_table::workspace_id.eq(workspace_id))
  49. .filter(app_table::is_trash.eq(is_trash))
  50. .load::<AppTable>(&*(self.database.db_connection()?))?;
  51. Ok(app_table)
  52. }
  53. pub(crate) fn delete_app(&self, app_id: &str) -> Result<AppTable, WorkspaceError> {
  54. let conn = self.database.db_connection()?;
  55. // TODO: group into sql transaction
  56. let app_table = dsl::app_table
  57. .filter(app_table::id.eq(app_id))
  58. .first::<AppTable>(&*(self.database.db_connection()?))?;
  59. diesel_delete_table!(app_table, app_id, conn);
  60. Ok(app_table)
  61. }
  62. // pub(crate) fn read_views_belong_to_app(
  63. // &self,
  64. // app_id: &str,
  65. // ) -> Result<Vec<ViewTable>, WorkspaceError> {
  66. // let conn = self.database.db_connection()?;
  67. //
  68. // let views = conn.immediate_transaction::<_, WorkspaceError, _>(|| {
  69. // let app_table: AppTable = dsl::app_table
  70. // .filter(app_table::id.eq(app_id))
  71. // .first::<AppTable>(&*(conn))?;
  72. // let views =
  73. // ViewTable::belonging_to(&app_table).load::<ViewTable>(&*conn)?;
  74. // Ok(views)
  75. // })?;
  76. //
  77. // Ok(views)
  78. // }
  79. }