group_service.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. use crate::entities::{FieldType, GroupChangesetPB};
  2. use crate::services::group::configuration::GroupConfigurationReader;
  3. use crate::services::group::controller::{GroupController, MoveGroupRowContext};
  4. use crate::services::group::{
  5. CheckboxGroupConfiguration, CheckboxGroupController, Group, GroupConfigurationWriter, MultiSelectGroupController,
  6. SelectOptionGroupConfiguration, SingleSelectGroupController,
  7. };
  8. use flowy_error::FlowyResult;
  9. use flowy_grid_data_model::revision::{
  10. CheckboxGroupConfigurationRevision, DateGroupConfigurationRevision, FieldRevision, GroupConfigurationRevision,
  11. NumberGroupConfigurationRevision, RowChangeset, RowRevision, SelectOptionGroupConfigurationRevision,
  12. TextGroupConfigurationRevision, UrlGroupConfigurationRevision,
  13. };
  14. use std::future::Future;
  15. use std::sync::Arc;
  16. pub(crate) struct GroupService {
  17. configuration_reader: Arc<dyn GroupConfigurationReader>,
  18. configuration_writer: Arc<dyn GroupConfigurationWriter>,
  19. group_controller: Option<Box<dyn GroupController>>,
  20. }
  21. impl GroupService {
  22. pub(crate) async fn new<R, W>(configuration_reader: R, configuration_writer: W) -> Self
  23. where
  24. R: GroupConfigurationReader,
  25. W: GroupConfigurationWriter,
  26. {
  27. Self {
  28. configuration_reader: Arc::new(configuration_reader),
  29. configuration_writer: Arc::new(configuration_writer),
  30. group_controller: None,
  31. }
  32. }
  33. pub(crate) async fn groups(&self) -> Vec<Group> {
  34. self.group_controller
  35. .as_ref()
  36. .and_then(|group_controller| Some(group_controller.groups()))
  37. .unwrap_or(vec![])
  38. }
  39. pub(crate) async fn get_group(&self, group_id: &str) -> Option<(usize, Group)> {
  40. self.group_controller
  41. .as_ref()
  42. .and_then(|group_controller| group_controller.get_group(group_id))
  43. }
  44. pub(crate) async fn load_groups(
  45. &mut self,
  46. field_revs: &[Arc<FieldRevision>],
  47. row_revs: Vec<Arc<RowRevision>>,
  48. ) -> Option<Vec<Group>> {
  49. let field_rev = find_group_field(field_revs)?;
  50. let field_type: FieldType = field_rev.ty.into();
  51. let mut group_controller = self.make_group_controller(&field_type, &field_rev).await.ok()??;
  52. let groups = match group_controller.fill_groups(&row_revs, &field_rev) {
  53. Ok(groups) => groups,
  54. Err(e) => {
  55. tracing::error!("Fill groups failed:{:?}", e);
  56. vec![]
  57. }
  58. };
  59. self.group_controller = Some(group_controller);
  60. Some(groups)
  61. }
  62. pub(crate) async fn will_create_row<F, O>(&mut self, row_rev: &mut RowRevision, group_id: &str, get_field_fn: F)
  63. where
  64. F: FnOnce(String) -> O,
  65. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  66. {
  67. if let Some(group_controller) = self.group_controller.as_mut() {
  68. let field_id = group_controller.field_id().to_owned();
  69. match get_field_fn(field_id).await {
  70. None => {}
  71. Some(field_rev) => {
  72. group_controller.will_create_row(row_rev, &field_rev, group_id);
  73. }
  74. }
  75. }
  76. }
  77. pub(crate) async fn did_delete_row<F, O>(
  78. &mut self,
  79. row_rev: &RowRevision,
  80. get_field_fn: F,
  81. ) -> Option<Vec<GroupChangesetPB>>
  82. where
  83. F: FnOnce(String) -> O,
  84. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  85. {
  86. let group_controller = self.group_controller.as_mut()?;
  87. let field_id = group_controller.field_id().to_owned();
  88. let field_rev = get_field_fn(field_id).await?;
  89. match group_controller.did_delete_row(row_rev, &field_rev) {
  90. Ok(changesets) => Some(changesets),
  91. Err(e) => {
  92. tracing::error!("Delete group data failed, {:?}", e);
  93. None
  94. }
  95. }
  96. }
  97. pub(crate) async fn move_group_row<F, O>(
  98. &mut self,
  99. row_rev: &RowRevision,
  100. row_changeset: &mut RowChangeset,
  101. to_group_id: &str,
  102. to_row_id: Option<String>,
  103. get_field_fn: F,
  104. ) -> Option<Vec<GroupChangesetPB>>
  105. where
  106. F: FnOnce(String) -> O,
  107. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  108. {
  109. let group_controller = self.group_controller.as_mut()?;
  110. let field_id = group_controller.field_id().to_owned();
  111. let field_rev = get_field_fn(field_id).await?;
  112. let move_row_context = MoveGroupRowContext {
  113. row_rev,
  114. row_changeset,
  115. field_rev: field_rev.as_ref(),
  116. to_group_id,
  117. to_row_id,
  118. };
  119. match group_controller.move_group_row(move_row_context) {
  120. Ok(changesets) => Some(changesets),
  121. Err(e) => {
  122. tracing::error!("Move group data failed, {:?}", e);
  123. None
  124. }
  125. }
  126. }
  127. #[tracing::instrument(level = "trace", skip_all)]
  128. pub(crate) async fn did_update_row<F, O>(
  129. &mut self,
  130. row_rev: &RowRevision,
  131. get_field_fn: F,
  132. ) -> Option<Vec<GroupChangesetPB>>
  133. where
  134. F: FnOnce(String) -> O,
  135. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  136. {
  137. let group_controller = self.group_controller.as_mut()?;
  138. let field_id = group_controller.field_id().to_owned();
  139. let field_rev = get_field_fn(field_id).await?;
  140. match group_controller.did_update_row(row_rev, &field_rev) {
  141. Ok(changeset) => Some(changeset),
  142. Err(e) => {
  143. tracing::error!("Update group data failed, {:?}", e);
  144. None
  145. }
  146. }
  147. }
  148. #[tracing::instrument(level = "trace", skip_all)]
  149. pub(crate) async fn move_group(&mut self, from_group_id: &str, to_group_id: &str) -> FlowyResult<()> {
  150. match self.group_controller.as_mut() {
  151. None => Ok(()),
  152. Some(group_controller) => {
  153. let _ = group_controller.move_group(from_group_id, to_group_id)?;
  154. Ok(())
  155. }
  156. }
  157. }
  158. pub(crate) async fn did_update_field(&mut self, field_rev: &FieldRevision) -> FlowyResult<()> {
  159. match self.group_controller.as_mut() {
  160. None => Ok(()),
  161. Some(group_controller) => group_controller.did_update_field(field_rev),
  162. }
  163. }
  164. #[tracing::instrument(level = "trace", skip(self, field_rev), err)]
  165. async fn make_group_controller(
  166. &self,
  167. field_type: &FieldType,
  168. field_rev: &Arc<FieldRevision>,
  169. ) -> FlowyResult<Option<Box<dyn GroupController>>> {
  170. let mut group_controller: Option<Box<dyn GroupController>> = None;
  171. match field_type {
  172. FieldType::RichText => {
  173. // let generator = GroupGenerator::<TextGroupConfigurationPB>::from_configuration(configuration);
  174. }
  175. FieldType::Number => {
  176. // let generator = GroupGenerator::<NumberGroupConfigurationPB>::from_configuration(configuration);
  177. }
  178. FieldType::DateTime => {
  179. // let generator = GroupGenerator::<DateGroupConfigurationPB>::from_configuration(configuration);
  180. }
  181. FieldType::SingleSelect => {
  182. let configuration = SelectOptionGroupConfiguration::new(
  183. field_rev.clone(),
  184. self.configuration_reader.clone(),
  185. self.configuration_writer.clone(),
  186. )
  187. .await?;
  188. let controller = SingleSelectGroupController::new(field_rev, configuration).await?;
  189. group_controller = Some(Box::new(controller));
  190. }
  191. FieldType::MultiSelect => {
  192. let configuration = SelectOptionGroupConfiguration::new(
  193. field_rev.clone(),
  194. self.configuration_reader.clone(),
  195. self.configuration_writer.clone(),
  196. )
  197. .await?;
  198. let controller = MultiSelectGroupController::new(field_rev, configuration).await?;
  199. group_controller = Some(Box::new(controller));
  200. }
  201. FieldType::Checkbox => {
  202. let configuration = CheckboxGroupConfiguration::new(
  203. field_rev.clone(),
  204. self.configuration_reader.clone(),
  205. self.configuration_writer.clone(),
  206. )
  207. .await?;
  208. let controller = CheckboxGroupController::new(field_rev, configuration).await?;
  209. group_controller = Some(Box::new(controller));
  210. }
  211. FieldType::URL => {
  212. // let generator = GroupGenerator::<UrlGroupConfigurationPB>::from_configuration(configuration);
  213. }
  214. }
  215. Ok(group_controller)
  216. }
  217. }
  218. fn find_group_field(field_revs: &[Arc<FieldRevision>]) -> Option<Arc<FieldRevision>> {
  219. let field_rev = field_revs
  220. .iter()
  221. .find(|field_rev| {
  222. let field_type: FieldType = field_rev.ty.into();
  223. field_type.can_be_group()
  224. })
  225. .cloned();
  226. field_rev
  227. }
  228. pub fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision {
  229. let field_id = field_rev.id.clone();
  230. let field_type_rev = field_rev.ty;
  231. let field_type: FieldType = field_rev.ty.into();
  232. match field_type {
  233. FieldType::RichText => {
  234. GroupConfigurationRevision::new(field_id, field_type_rev, TextGroupConfigurationRevision::default())
  235. .unwrap()
  236. }
  237. FieldType::Number => {
  238. GroupConfigurationRevision::new(field_id, field_type_rev, NumberGroupConfigurationRevision::default())
  239. .unwrap()
  240. }
  241. FieldType::DateTime => {
  242. GroupConfigurationRevision::new(field_id, field_type_rev, DateGroupConfigurationRevision::default())
  243. .unwrap()
  244. }
  245. FieldType::SingleSelect => GroupConfigurationRevision::new(
  246. field_id,
  247. field_type_rev,
  248. SelectOptionGroupConfigurationRevision::default(),
  249. )
  250. .unwrap(),
  251. FieldType::MultiSelect => GroupConfigurationRevision::new(
  252. field_id,
  253. field_type_rev,
  254. SelectOptionGroupConfigurationRevision::default(),
  255. )
  256. .unwrap(),
  257. FieldType::Checkbox => {
  258. GroupConfigurationRevision::new(field_id, field_type_rev, CheckboxGroupConfigurationRevision::default())
  259. .unwrap()
  260. }
  261. FieldType::URL => {
  262. GroupConfigurationRevision::new(field_id, field_type_rev, UrlGroupConfigurationRevision::default()).unwrap()
  263. }
  264. }
  265. }