group_service.rs 11 KB

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