group_service.rs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. use crate::entities::{
  2. CheckboxGroupConfigurationPB, DateGroupConfigurationPB, FieldType, GroupRowsChangesetPB,
  3. NumberGroupConfigurationPB, SelectOptionGroupConfigurationPB, TextGroupConfigurationPB, UrlGroupConfigurationPB,
  4. };
  5. use crate::services::group::{
  6. CheckboxGroupController, Group, GroupController, MultiSelectGroupController, SingleSelectGroupController,
  7. };
  8. use bytes::Bytes;
  9. use flowy_error::FlowyResult;
  10. use flowy_grid_data_model::revision::{gen_grid_group_id, FieldRevision, GroupConfigurationRevision, RowRevision, RowChangeset};
  11. use lib_infra::future::AFFuture;
  12. use std::future::Future;
  13. use std::sync::Arc;
  14. use tokio::sync::RwLock;
  15. pub trait GroupConfigurationDelegate: Send + Sync + 'static {
  16. fn get_group_configuration(&self, field_rev: Arc<FieldRevision>) -> AFFuture<GroupConfigurationRevision>;
  17. }
  18. pub(crate) struct GroupService {
  19. pub groups: Vec<Group>,
  20. delegate: Box<dyn GroupConfigurationDelegate>,
  21. group_controller: Option<Arc<RwLock<dyn GroupController>>>,
  22. }
  23. impl GroupService {
  24. pub(crate) async fn new(delegate: Box<dyn GroupConfigurationDelegate>) -> Self {
  25. Self {
  26. groups: vec![],
  27. delegate,
  28. group_controller: None,
  29. }
  30. }
  31. pub(crate) async fn load_groups(
  32. &mut self,
  33. field_revs: &[Arc<FieldRevision>],
  34. row_revs: Vec<Arc<RowRevision>>,
  35. ) -> Option<Vec<Group>> {
  36. let field_rev = find_group_field(field_revs)?;
  37. let field_type: FieldType = field_rev.field_type_rev.into();
  38. let configuration = self.delegate.get_group_configuration(field_rev.clone()).await;
  39. match self
  40. .build_groups(&field_type, &field_rev, row_revs, configuration)
  41. .await
  42. {
  43. Ok(groups) => {
  44. self.groups = groups.clone();
  45. Some(groups)
  46. }
  47. Err(_) => None,
  48. }
  49. }
  50. pub(crate) async fn will_create_row<F, O>(&self, row_rev: &mut RowRevision, group_id: &str, get_field_fn: F)
  51. where
  52. F: FnOnce(String) -> O,
  53. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  54. {
  55. if let Some(group_controller) = self.group_controller.as_ref() {
  56. let field_id = group_controller.read().await.field_id().to_owned();
  57. match get_field_fn(field_id).await {
  58. None => {}
  59. Some(field_rev) => {
  60. group_controller
  61. .write()
  62. .await
  63. .will_create_row(row_rev, &field_rev, group_id);
  64. }
  65. }
  66. }
  67. }
  68. pub(crate) async fn did_delete_row<F, O>(
  69. &self,
  70. row_rev: &RowRevision,
  71. get_field_fn: F,
  72. ) -> Option<Vec<GroupRowsChangesetPB>>
  73. where
  74. F: FnOnce(String) -> O,
  75. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  76. {
  77. let group_controller = self.group_controller.as_ref()?;
  78. let field_id = group_controller.read().await.field_id().to_owned();
  79. let field_rev = get_field_fn(field_id).await?;
  80. match group_controller.write().await.did_delete_row(row_rev, &field_rev) {
  81. Ok(changesets) => Some(changesets),
  82. Err(e) => {
  83. tracing::error!("Delete group data failed, {:?}", e);
  84. None
  85. }
  86. }
  87. }
  88. pub(crate) async fn did_move_row<F, O>(
  89. &self,
  90. row_rev: &RowRevision,
  91. row_changeset: &mut RowChangeset,
  92. upper_row_id: &str,
  93. get_field_fn: F,
  94. ) -> Option<Vec<GroupRowsChangesetPB>>
  95. where
  96. F: FnOnce(String) -> O,
  97. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  98. {
  99. let group_controller = self.group_controller.as_ref()?;
  100. let field_id = group_controller.read().await.field_id().to_owned();
  101. let field_rev = get_field_fn(field_id).await?;
  102. match group_controller
  103. .write()
  104. .await
  105. .did_move_row(row_rev, row_changeset, &field_rev, upper_row_id)
  106. {
  107. Ok(changesets) => Some(changesets),
  108. Err(e) => {
  109. tracing::error!("Move group data failed, {:?}", e);
  110. None
  111. }
  112. }
  113. }
  114. #[tracing::instrument(level = "trace", skip_all)]
  115. pub(crate) async fn did_update_row<F, O>(
  116. &self,
  117. row_rev: &RowRevision,
  118. get_field_fn: F,
  119. ) -> Option<Vec<GroupRowsChangesetPB>>
  120. where
  121. F: FnOnce(String) -> O,
  122. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  123. {
  124. let group_controller = self.group_controller.as_ref()?;
  125. let field_id = group_controller.read().await.field_id().to_owned();
  126. let field_rev = get_field_fn(field_id).await?;
  127. match group_controller.write().await.did_update_row(row_rev, &field_rev) {
  128. Ok(changeset) => Some(changeset),
  129. Err(e) => {
  130. tracing::error!("Update group data failed, {:?}", e);
  131. None
  132. }
  133. }
  134. }
  135. #[tracing::instrument(level = "trace", skip_all, err)]
  136. async fn build_groups(
  137. &mut self,
  138. field_type: &FieldType,
  139. field_rev: &Arc<FieldRevision>,
  140. row_revs: Vec<Arc<RowRevision>>,
  141. configuration: GroupConfigurationRevision,
  142. ) -> FlowyResult<Vec<Group>> {
  143. match field_type {
  144. FieldType::RichText => {
  145. // let generator = GroupGenerator::<TextGroupConfigurationPB>::from_configuration(configuration);
  146. }
  147. FieldType::Number => {
  148. // let generator = GroupGenerator::<NumberGroupConfigurationPB>::from_configuration(configuration);
  149. }
  150. FieldType::DateTime => {
  151. // let generator = GroupGenerator::<DateGroupConfigurationPB>::from_configuration(configuration);
  152. }
  153. FieldType::SingleSelect => {
  154. let controller = SingleSelectGroupController::new(field_rev, configuration)?;
  155. self.group_controller = Some(Arc::new(RwLock::new(controller)));
  156. }
  157. FieldType::MultiSelect => {
  158. let controller = MultiSelectGroupController::new(field_rev, configuration)?;
  159. self.group_controller = Some(Arc::new(RwLock::new(controller)));
  160. }
  161. FieldType::Checkbox => {
  162. let controller = CheckboxGroupController::new(field_rev, configuration)?;
  163. self.group_controller = Some(Arc::new(RwLock::new(controller)));
  164. }
  165. FieldType::URL => {
  166. // let generator = GroupGenerator::<UrlGroupConfigurationPB>::from_configuration(configuration);
  167. }
  168. };
  169. let mut groups = vec![];
  170. if let Some(group_action_handler) = self.group_controller.as_ref() {
  171. let mut write_guard = group_action_handler.write().await;
  172. let _ = write_guard.group_rows(&row_revs, field_rev)?;
  173. groups = write_guard.build_groups();
  174. drop(write_guard);
  175. }
  176. Ok(groups)
  177. }
  178. }
  179. fn find_group_field(field_revs: &[Arc<FieldRevision>]) -> Option<Arc<FieldRevision>> {
  180. let field_rev = field_revs
  181. .iter()
  182. .find(|field_rev| {
  183. let field_type: FieldType = field_rev.field_type_rev.into();
  184. field_type.can_be_group()
  185. })
  186. .cloned();
  187. field_rev
  188. }
  189. pub fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision {
  190. let field_type: FieldType = field_rev.field_type_rev.into();
  191. let bytes: Bytes = match field_type {
  192. FieldType::RichText => TextGroupConfigurationPB::default().try_into().unwrap(),
  193. FieldType::Number => NumberGroupConfigurationPB::default().try_into().unwrap(),
  194. FieldType::DateTime => DateGroupConfigurationPB::default().try_into().unwrap(),
  195. FieldType::SingleSelect => SelectOptionGroupConfigurationPB::default().try_into().unwrap(),
  196. FieldType::MultiSelect => SelectOptionGroupConfigurationPB::default().try_into().unwrap(),
  197. FieldType::Checkbox => CheckboxGroupConfigurationPB::default().try_into().unwrap(),
  198. FieldType::URL => UrlGroupConfigurationPB::default().try_into().unwrap(),
  199. };
  200. GroupConfigurationRevision {
  201. id: gen_grid_group_id(),
  202. field_id: field_rev.id.clone(),
  203. field_type_rev: field_rev.field_type_rev,
  204. content: Some(bytes.to_vec()),
  205. }
  206. }