1use crate::AddBlockToListDto;
4use crate::CreateListDto;
5use crate::CreateListResultDto;
6use crate::DeleteTextDto;
7use crate::DeleteTextResultDto;
8use crate::InsertBlockDto;
9use crate::InsertBlockResultDto;
10use crate::InsertFormattedTextDto;
11use crate::InsertFormattedTextResultDto;
12use crate::InsertFragmentDto;
13use crate::InsertFragmentResultDto;
14use crate::InsertFrameDto;
15use crate::InsertFrameResultDto;
16use crate::InsertHtmlAtPositionDto;
17use crate::InsertHtmlAtPositionResultDto;
18use crate::InsertImageDto;
19use crate::InsertImageResultDto;
20use crate::InsertListDto;
21use crate::InsertListResultDto;
22use crate::InsertMarkdownAtPositionDto;
23use crate::InsertMarkdownAtPositionResultDto;
24use crate::InsertTableColumnDto;
25use crate::InsertTableColumnResultDto;
26use crate::InsertTableDto;
27use crate::InsertTableResultDto;
28use crate::InsertTableRowDto;
29use crate::InsertTableRowResultDto;
30use crate::InsertTextDto;
31use crate::InsertTextResultDto;
32use crate::MergeTableCellsDto;
33use crate::MergeTableCellsResultDto;
34use crate::RemoveBlockFromListDto;
35use crate::RemoveTableColumnDto;
36use crate::RemoveTableColumnResultDto;
37use crate::RemoveTableDto;
38use crate::RemoveTableRowDto;
39use crate::RemoveTableRowResultDto;
40use crate::SplitTableCellDto;
41use crate::SplitTableCellResultDto;
42use crate::units_of_work::add_block_to_list_uow::AddBlockToListUnitOfWorkFactory;
43use crate::units_of_work::create_list_uow::CreateListUnitOfWorkFactory;
44use crate::units_of_work::delete_text_uow::DeleteTextUnitOfWorkFactory;
45use crate::units_of_work::insert_block_uow::InsertBlockUnitOfWorkFactory;
46use crate::units_of_work::insert_formatted_text_uow::InsertFormattedTextUnitOfWorkFactory;
47use crate::units_of_work::insert_fragment_uow::InsertFragmentUnitOfWorkFactory;
48use crate::units_of_work::insert_frame_uow::InsertFrameUnitOfWorkFactory;
49use crate::units_of_work::insert_html_at_position_uow::InsertHtmlAtPositionUnitOfWorkFactory;
50use crate::units_of_work::insert_image_uow::InsertImageUnitOfWorkFactory;
51use crate::units_of_work::insert_list_uow::InsertListUnitOfWorkFactory;
52use crate::units_of_work::insert_markdown_at_position_uow::InsertMarkdownAtPositionUnitOfWorkFactory;
53use crate::units_of_work::insert_table_column_uow::InsertTableColumnUnitOfWorkFactory;
54use crate::units_of_work::insert_table_row_uow::InsertTableRowUnitOfWorkFactory;
55use crate::units_of_work::insert_table_uow::InsertTableUnitOfWorkFactory;
56use crate::units_of_work::insert_text_uow::InsertTextUnitOfWorkFactory;
57use crate::units_of_work::merge_table_cells_uow::MergeTableCellsUnitOfWorkFactory;
58use crate::units_of_work::remove_block_from_list_uow::RemoveBlockFromListUnitOfWorkFactory;
59use crate::units_of_work::remove_table_column_uow::RemoveTableColumnUnitOfWorkFactory;
60use crate::units_of_work::remove_table_row_uow::RemoveTableRowUnitOfWorkFactory;
61use crate::units_of_work::remove_table_uow::RemoveTableUnitOfWorkFactory;
62use crate::units_of_work::split_table_cell_uow::SplitTableCellUnitOfWorkFactory;
63use crate::use_cases::add_block_to_list_uc::AddBlockToListUseCase;
64use crate::use_cases::create_list_uc::CreateListUseCase;
65use crate::use_cases::delete_text_uc::DeleteTextUseCase;
66use crate::use_cases::insert_block_uc::InsertBlockUseCase;
67use crate::use_cases::insert_formatted_text_uc::InsertFormattedTextUseCase;
68use crate::use_cases::insert_fragment_uc::InsertFragmentUseCase;
69use crate::use_cases::insert_frame_uc::InsertFrameUseCase;
70use crate::use_cases::insert_html_at_position_uc::InsertHtmlAtPositionUseCase;
71use crate::use_cases::insert_image_uc::InsertImageUseCase;
72use crate::use_cases::insert_list_uc::InsertListUseCase;
73use crate::use_cases::insert_markdown_at_position_uc::InsertMarkdownAtPositionUseCase;
74use crate::use_cases::insert_table_column_uc::InsertTableColumnUseCase;
75use crate::use_cases::insert_table_row_uc::InsertTableRowUseCase;
76use crate::use_cases::insert_table_uc::InsertTableUseCase;
77use crate::use_cases::insert_text_uc::InsertTextUseCase;
78use crate::use_cases::merge_table_cells_uc::MergeTableCellsUseCase;
79use crate::use_cases::remove_block_from_list_uc::RemoveBlockFromListUseCase;
80use crate::use_cases::remove_table_column_uc::RemoveTableColumnUseCase;
81use crate::use_cases::remove_table_row_uc::RemoveTableRowUseCase;
82use crate::use_cases::remove_table_uc::RemoveTableUseCase;
83use crate::use_cases::split_table_cell_uc::SplitTableCellUseCase;
84use anyhow::Result;
85use common::event::{Event, Origin};
86
87use common::event::DocumentEditingEvent::AddBlockToList;
88use common::event::DocumentEditingEvent::CreateList;
89use common::event::DocumentEditingEvent::DeleteText;
90use common::event::DocumentEditingEvent::InsertBlock;
91use common::event::DocumentEditingEvent::InsertFormattedText;
92use common::event::DocumentEditingEvent::InsertFragment;
93use common::event::DocumentEditingEvent::InsertFrame;
94use common::event::DocumentEditingEvent::InsertHtmlAtPosition;
95use common::event::DocumentEditingEvent::InsertImage;
96use common::event::DocumentEditingEvent::InsertList;
97use common::event::DocumentEditingEvent::InsertMarkdownAtPosition;
98use common::event::DocumentEditingEvent::InsertTable;
99use common::event::DocumentEditingEvent::InsertTableColumn;
100use common::event::DocumentEditingEvent::InsertTableRow;
101use common::event::DocumentEditingEvent::InsertText;
102use common::event::DocumentEditingEvent::MergeTableCells;
103use common::event::DocumentEditingEvent::RemoveBlockFromList;
104use common::event::DocumentEditingEvent::RemoveTable;
105use common::event::DocumentEditingEvent::RemoveTableColumn;
106use common::event::DocumentEditingEvent::RemoveTableRow;
107use common::event::DocumentEditingEvent::SplitTableCell;
108
109use common::undo_redo::UndoRedoManager;
110use common::{database::db_context::DbContext, event::EventHub};
111use std::sync::Arc;
112
113pub fn insert_text(
114 db_context: &DbContext,
115 event_hub: &Arc<EventHub>,
116 undo_redo_manager: &mut UndoRedoManager,
117 stack_id: Option<u64>,
118 dto: &InsertTextDto,
119) -> Result<InsertTextResultDto> {
120 let uow_context = InsertTextUnitOfWorkFactory::new(db_context, event_hub);
121 let mut uc = InsertTextUseCase::new(Box::new(uow_context));
122 let return_dto = uc.execute(dto)?;
123 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
124 event_hub.send_event(Event {
126 origin: Origin::DocumentEditing(InsertText),
127 ids: vec![],
128 data: None,
129 });
130 Ok(return_dto)
131}
132
133pub fn delete_text(
134 db_context: &DbContext,
135 event_hub: &Arc<EventHub>,
136 undo_redo_manager: &mut UndoRedoManager,
137 stack_id: Option<u64>,
138 dto: &DeleteTextDto,
139) -> Result<DeleteTextResultDto> {
140 let uow_context = DeleteTextUnitOfWorkFactory::new(db_context, event_hub);
141 let mut uc = DeleteTextUseCase::new(Box::new(uow_context));
142 let return_dto = uc.execute(dto)?;
143 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
144 event_hub.send_event(Event {
146 origin: Origin::DocumentEditing(DeleteText),
147 ids: vec![],
148 data: None,
149 });
150 Ok(return_dto)
151}
152
153pub fn insert_block(
154 db_context: &DbContext,
155 event_hub: &Arc<EventHub>,
156 undo_redo_manager: &mut UndoRedoManager,
157 stack_id: Option<u64>,
158 dto: &InsertBlockDto,
159) -> Result<InsertBlockResultDto> {
160 let uow_context = InsertBlockUnitOfWorkFactory::new(db_context, event_hub);
161 let mut uc = InsertBlockUseCase::new(Box::new(uow_context));
162 let return_dto = uc.execute(dto)?;
163 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
164 event_hub.send_event(Event {
166 origin: Origin::DocumentEditing(InsertBlock),
167 ids: vec![],
168 data: None,
169 });
170 Ok(return_dto)
171}
172
173pub fn insert_image(
174 db_context: &DbContext,
175 event_hub: &Arc<EventHub>,
176 undo_redo_manager: &mut UndoRedoManager,
177 stack_id: Option<u64>,
178 dto: &InsertImageDto,
179) -> Result<InsertImageResultDto> {
180 let uow_context = InsertImageUnitOfWorkFactory::new(db_context, event_hub);
181 let mut uc = InsertImageUseCase::new(Box::new(uow_context));
182 let return_dto = uc.execute(dto)?;
183 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
184 event_hub.send_event(Event {
186 origin: Origin::DocumentEditing(InsertImage),
187 ids: vec![],
188 data: None,
189 });
190 Ok(return_dto)
191}
192
193pub fn insert_frame(
194 db_context: &DbContext,
195 event_hub: &Arc<EventHub>,
196 undo_redo_manager: &mut UndoRedoManager,
197 stack_id: Option<u64>,
198 dto: &InsertFrameDto,
199) -> Result<InsertFrameResultDto> {
200 let uow_context = InsertFrameUnitOfWorkFactory::new(db_context, event_hub);
201 let mut uc = InsertFrameUseCase::new(Box::new(uow_context));
202 let return_dto = uc.execute(dto)?;
203 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
204 event_hub.send_event(Event {
206 origin: Origin::DocumentEditing(InsertFrame),
207 ids: vec![],
208 data: None,
209 });
210 Ok(return_dto)
211}
212
213pub fn insert_formatted_text(
214 db_context: &DbContext,
215 event_hub: &Arc<EventHub>,
216 undo_redo_manager: &mut UndoRedoManager,
217 stack_id: Option<u64>,
218 dto: &InsertFormattedTextDto,
219) -> Result<InsertFormattedTextResultDto> {
220 let uow_context = InsertFormattedTextUnitOfWorkFactory::new(db_context, event_hub);
221 let mut uc = InsertFormattedTextUseCase::new(Box::new(uow_context));
222 let return_dto = uc.execute(dto)?;
223 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
224 event_hub.send_event(Event {
226 origin: Origin::DocumentEditing(InsertFormattedText),
227 ids: vec![],
228 data: None,
229 });
230 Ok(return_dto)
231}
232
233pub fn create_list(
234 db_context: &DbContext,
235 event_hub: &Arc<EventHub>,
236 undo_redo_manager: &mut UndoRedoManager,
237 stack_id: Option<u64>,
238 dto: &CreateListDto,
239) -> Result<CreateListResultDto> {
240 let uow_context = CreateListUnitOfWorkFactory::new(db_context, event_hub);
241 let mut uc = CreateListUseCase::new(Box::new(uow_context));
242 let return_dto = uc.execute(dto)?;
243 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
244 event_hub.send_event(Event {
246 origin: Origin::DocumentEditing(CreateList),
247 ids: vec![],
248 data: None,
249 });
250 Ok(return_dto)
251}
252
253pub fn insert_list(
254 db_context: &DbContext,
255 event_hub: &Arc<EventHub>,
256 undo_redo_manager: &mut UndoRedoManager,
257 stack_id: Option<u64>,
258 dto: &InsertListDto,
259) -> Result<InsertListResultDto> {
260 let uow_context = InsertListUnitOfWorkFactory::new(db_context, event_hub);
261 let mut uc = InsertListUseCase::new(Box::new(uow_context));
262 let return_dto = uc.execute(dto)?;
263 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
264 event_hub.send_event(Event {
266 origin: Origin::DocumentEditing(InsertList),
267 ids: vec![],
268 data: None,
269 });
270 Ok(return_dto)
271}
272
273pub fn insert_fragment(
274 db_context: &DbContext,
275 event_hub: &Arc<EventHub>,
276 undo_redo_manager: &mut UndoRedoManager,
277 stack_id: Option<u64>,
278 dto: &InsertFragmentDto,
279) -> Result<InsertFragmentResultDto> {
280 let uow_context = InsertFragmentUnitOfWorkFactory::new(db_context, event_hub);
281 let mut uc = InsertFragmentUseCase::new(Box::new(uow_context));
282 let return_dto = uc.execute(dto)?;
283 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
284 event_hub.send_event(Event {
286 origin: Origin::DocumentEditing(InsertFragment),
287 ids: vec![],
288 data: None,
289 });
290 Ok(return_dto)
291}
292
293pub fn insert_html_at_position(
294 db_context: &DbContext,
295 event_hub: &Arc<EventHub>,
296 undo_redo_manager: &mut UndoRedoManager,
297 stack_id: Option<u64>,
298 dto: &InsertHtmlAtPositionDto,
299) -> Result<InsertHtmlAtPositionResultDto> {
300 let uow_context = InsertHtmlAtPositionUnitOfWorkFactory::new(db_context, event_hub);
301 let mut uc = InsertHtmlAtPositionUseCase::new(Box::new(uow_context));
302 let return_dto = uc.execute(dto)?;
303 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
304 event_hub.send_event(Event {
306 origin: Origin::DocumentEditing(InsertHtmlAtPosition),
307 ids: vec![],
308 data: None,
309 });
310 Ok(return_dto)
311}
312
313pub fn insert_markdown_at_position(
314 db_context: &DbContext,
315 event_hub: &Arc<EventHub>,
316 undo_redo_manager: &mut UndoRedoManager,
317 stack_id: Option<u64>,
318 dto: &InsertMarkdownAtPositionDto,
319) -> Result<InsertMarkdownAtPositionResultDto> {
320 let uow_context = InsertMarkdownAtPositionUnitOfWorkFactory::new(db_context, event_hub);
321 let mut uc = InsertMarkdownAtPositionUseCase::new(Box::new(uow_context));
322 let return_dto = uc.execute(dto)?;
323 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
324 event_hub.send_event(Event {
326 origin: Origin::DocumentEditing(InsertMarkdownAtPosition),
327 ids: vec![],
328 data: None,
329 });
330 Ok(return_dto)
331}
332
333pub fn insert_table(
334 db_context: &DbContext,
335 event_hub: &Arc<EventHub>,
336 undo_redo_manager: &mut UndoRedoManager,
337 stack_id: Option<u64>,
338 dto: &InsertTableDto,
339) -> Result<InsertTableResultDto> {
340 let uow_context = InsertTableUnitOfWorkFactory::new(db_context, event_hub);
341 let mut uc = InsertTableUseCase::new(Box::new(uow_context));
342 let return_dto = uc.execute(dto)?;
343 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
344 event_hub.send_event(Event {
346 origin: Origin::DocumentEditing(InsertTable),
347 ids: vec![],
348 data: None,
349 });
350 Ok(return_dto)
351}
352
353pub fn remove_table(
354 db_context: &DbContext,
355 event_hub: &Arc<EventHub>,
356 undo_redo_manager: &mut UndoRedoManager,
357 stack_id: Option<u64>,
358 dto: &RemoveTableDto,
359) -> Result<()> {
360 let uow_context = RemoveTableUnitOfWorkFactory::new(db_context, event_hub);
361 let mut uc = RemoveTableUseCase::new(Box::new(uow_context));
362 uc.execute(dto)?;
363 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
364 event_hub.send_event(Event {
366 origin: Origin::DocumentEditing(RemoveTable),
367 ids: vec![],
368 data: None,
369 });
370 Ok(())
371}
372
373pub fn insert_table_row(
374 db_context: &DbContext,
375 event_hub: &Arc<EventHub>,
376 undo_redo_manager: &mut UndoRedoManager,
377 stack_id: Option<u64>,
378 dto: &InsertTableRowDto,
379) -> Result<InsertTableRowResultDto> {
380 let uow_context = InsertTableRowUnitOfWorkFactory::new(db_context, event_hub);
381 let mut uc = InsertTableRowUseCase::new(Box::new(uow_context));
382 let return_dto = uc.execute(dto)?;
383 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
384 event_hub.send_event(Event {
386 origin: Origin::DocumentEditing(InsertTableRow),
387 ids: vec![],
388 data: None,
389 });
390 Ok(return_dto)
391}
392
393pub fn insert_table_column(
394 db_context: &DbContext,
395 event_hub: &Arc<EventHub>,
396 undo_redo_manager: &mut UndoRedoManager,
397 stack_id: Option<u64>,
398 dto: &InsertTableColumnDto,
399) -> Result<InsertTableColumnResultDto> {
400 let uow_context = InsertTableColumnUnitOfWorkFactory::new(db_context, event_hub);
401 let mut uc = InsertTableColumnUseCase::new(Box::new(uow_context));
402 let return_dto = uc.execute(dto)?;
403 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
404 event_hub.send_event(Event {
406 origin: Origin::DocumentEditing(InsertTableColumn),
407 ids: vec![],
408 data: None,
409 });
410 Ok(return_dto)
411}
412
413pub fn remove_table_row(
414 db_context: &DbContext,
415 event_hub: &Arc<EventHub>,
416 undo_redo_manager: &mut UndoRedoManager,
417 stack_id: Option<u64>,
418 dto: &RemoveTableRowDto,
419) -> Result<RemoveTableRowResultDto> {
420 let uow_context = RemoveTableRowUnitOfWorkFactory::new(db_context, event_hub);
421 let mut uc = RemoveTableRowUseCase::new(Box::new(uow_context));
422 let return_dto = uc.execute(dto)?;
423 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
424 event_hub.send_event(Event {
426 origin: Origin::DocumentEditing(RemoveTableRow),
427 ids: vec![],
428 data: None,
429 });
430 Ok(return_dto)
431}
432
433pub fn remove_table_column(
434 db_context: &DbContext,
435 event_hub: &Arc<EventHub>,
436 undo_redo_manager: &mut UndoRedoManager,
437 stack_id: Option<u64>,
438 dto: &RemoveTableColumnDto,
439) -> Result<RemoveTableColumnResultDto> {
440 let uow_context = RemoveTableColumnUnitOfWorkFactory::new(db_context, event_hub);
441 let mut uc = RemoveTableColumnUseCase::new(Box::new(uow_context));
442 let return_dto = uc.execute(dto)?;
443 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
444 event_hub.send_event(Event {
446 origin: Origin::DocumentEditing(RemoveTableColumn),
447 ids: vec![],
448 data: None,
449 });
450 Ok(return_dto)
451}
452
453pub fn merge_table_cells(
454 db_context: &DbContext,
455 event_hub: &Arc<EventHub>,
456 undo_redo_manager: &mut UndoRedoManager,
457 stack_id: Option<u64>,
458 dto: &MergeTableCellsDto,
459) -> Result<MergeTableCellsResultDto> {
460 let uow_context = MergeTableCellsUnitOfWorkFactory::new(db_context, event_hub);
461 let mut uc = MergeTableCellsUseCase::new(Box::new(uow_context));
462 let return_dto = uc.execute(dto)?;
463 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
464 event_hub.send_event(Event {
466 origin: Origin::DocumentEditing(MergeTableCells),
467 ids: vec![],
468 data: None,
469 });
470 Ok(return_dto)
471}
472
473pub fn split_table_cell(
474 db_context: &DbContext,
475 event_hub: &Arc<EventHub>,
476 undo_redo_manager: &mut UndoRedoManager,
477 stack_id: Option<u64>,
478 dto: &SplitTableCellDto,
479) -> Result<SplitTableCellResultDto> {
480 let uow_context = SplitTableCellUnitOfWorkFactory::new(db_context, event_hub);
481 let mut uc = SplitTableCellUseCase::new(Box::new(uow_context));
482 let return_dto = uc.execute(dto)?;
483 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
484 event_hub.send_event(Event {
486 origin: Origin::DocumentEditing(SplitTableCell),
487 ids: vec![],
488 data: None,
489 });
490 Ok(return_dto)
491}
492
493pub fn add_block_to_list(
494 db_context: &DbContext,
495 event_hub: &Arc<EventHub>,
496 undo_redo_manager: &mut UndoRedoManager,
497 stack_id: Option<u64>,
498 dto: &AddBlockToListDto,
499) -> Result<()> {
500 let uow_context = AddBlockToListUnitOfWorkFactory::new(db_context, event_hub);
501 let mut uc = AddBlockToListUseCase::new(Box::new(uow_context));
502 uc.execute(dto)?;
503 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
504 event_hub.send_event(Event {
505 origin: Origin::DocumentEditing(AddBlockToList),
506 ids: vec![],
507 data: None,
508 });
509 Ok(())
510}
511
512pub fn remove_block_from_list(
513 db_context: &DbContext,
514 event_hub: &Arc<EventHub>,
515 undo_redo_manager: &mut UndoRedoManager,
516 stack_id: Option<u64>,
517 dto: &RemoveBlockFromListDto,
518) -> Result<()> {
519 let uow_context = RemoveBlockFromListUnitOfWorkFactory::new(db_context, event_hub);
520 let mut uc = RemoveBlockFromListUseCase::new(Box::new(uow_context));
521 uc.execute(dto)?;
522 undo_redo_manager.add_command_to_stack(Box::new(uc), stack_id)?;
523 event_hub.send_event(Event {
524 origin: Origin::DocumentEditing(RemoveBlockFromList),
525 ids: vec![],
526 data: None,
527 });
528 Ok(())
529}