view_sql.rs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use crate::{
  2. entities::view::{RepeatedView, View},
  3. errors::WorkspaceError,
  4. sql_tables::view::{ViewTable, ViewTableChangeset},
  5. };
  6. use flowy_database::{
  7. prelude::*,
  8. schema::{view_table, view_table::dsl},
  9. SqliteConnection,
  10. };
  11. pub struct ViewTableSql {}
  12. impl ViewTableSql {
  13. pub(crate) fn create_view(&self, view_table: ViewTable, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
  14. match diesel_record_count!(view_table, &view_table.id, conn) {
  15. 0 => diesel_insert_table!(view_table, &view_table, conn),
  16. _ => {
  17. let changeset = ViewTableChangeset::from_table(view_table);
  18. diesel_update_table!(view_table, changeset, conn)
  19. },
  20. }
  21. Ok(())
  22. }
  23. pub(crate) fn read_view(
  24. &self,
  25. view_id: &str,
  26. is_trash: Option<bool>,
  27. conn: &SqliteConnection,
  28. ) -> Result<ViewTable, WorkspaceError> {
  29. // https://docs.diesel.rs/diesel/query_builder/struct.UpdateStatement.html
  30. let mut filter = dsl::view_table.filter(view_table::id.eq(view_id)).into_boxed();
  31. if let Some(is_trash) = is_trash {
  32. filter = filter.filter(view_table::is_trash.eq(is_trash));
  33. }
  34. let view_table = filter.first::<ViewTable>(conn)?;
  35. Ok(view_table)
  36. }
  37. // belong_to_id will be the app_id or view_id.
  38. pub(crate) fn read_views(
  39. &self,
  40. belong_to_id: &str,
  41. is_trash: Option<bool>,
  42. conn: &SqliteConnection,
  43. ) -> Result<RepeatedView, WorkspaceError> {
  44. let mut filter = dsl::view_table
  45. .filter(view_table::belong_to_id.eq(belong_to_id))
  46. .into_boxed();
  47. if let Some(is_trash) = is_trash {
  48. filter = filter.filter(view_table::is_trash.eq(is_trash));
  49. }
  50. let view_tables = filter.load::<ViewTable>(conn)?;
  51. let views = view_tables
  52. .into_iter()
  53. .map(|view_table| view_table.into())
  54. .collect::<Vec<View>>();
  55. Ok(RepeatedView { items: views })
  56. }
  57. pub(crate) fn update_view(
  58. &self,
  59. changeset: ViewTableChangeset,
  60. conn: &SqliteConnection,
  61. ) -> Result<(), WorkspaceError> {
  62. diesel_update_table!(view_table, changeset, conn);
  63. Ok(())
  64. }
  65. pub(crate) fn delete_view(&self, view_id: &str, conn: &SqliteConnection) -> Result<ViewTable, WorkspaceError> {
  66. let view_table = dsl::view_table
  67. .filter(view_table::id.eq(view_id))
  68. .first::<ViewTable>(conn)?;
  69. diesel_delete_table!(view_table, view_id, conn);
  70. Ok(view_table)
  71. }
  72. }