Coverage for bc/kwai-bc-portal/src/kwai_bc_portal/update_page.py: 100%

23 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2024-01-01 00:00 +0000

1"""Module for the use case "Update Page".""" 

2 

3from dataclasses import dataclass, replace 

4 

5from kwai_core.domain.presenter import Presenter 

6from kwai_core.domain.value_objects.owner import Owner 

7from kwai_core.domain.value_objects.text import DocumentFormat, Locale, LocaleText 

8 

9from kwai_bc_portal.applications.application_repository import ( 

10 ApplicationRepository, 

11) 

12from kwai_bc_portal.domain.application import ApplicationIdentifier 

13from kwai_bc_portal.domain.page import PageEntity, PageIdentifier 

14from kwai_bc_portal.page_command import PageCommand 

15from kwai_bc_portal.pages.page_repository import PageRepository 

16 

17 

18@dataclass(kw_only=True, frozen=True, slots=True) 

19class UpdatePageCommand(PageCommand): 

20 """Input for the "Update Page" use case.""" 

21 

22 id: int 

23 

24 

25class UpdatePage: 

26 """Use case for updating a page.""" 

27 

28 def __init__( 

29 self, 

30 repo: PageRepository, 

31 application_repo: ApplicationRepository, 

32 owner: Owner, 

33 presenter: Presenter[PageEntity], 

34 ): 

35 """Initialize the use case. 

36 

37 Args: 

38 repo: A repository for updating pages. 

39 application_repo: A repository for getting the application. 

40 owner: The owner of the page. 

41 presenter: A presenter for a page. 

42 """ 

43 self._repo = repo 

44 self._application_repo = application_repo 

45 self._owner = owner 

46 self._presenter = presenter 

47 

48 async def execute(self, command: UpdatePageCommand): 

49 """Execute the use case. 

50 

51 Args: 

52 command: The input for this use case. 

53 

54 Raises: 

55 PageNotFoundException: When the page does not exist. 

56 ApplicationNotFoundException: When the application does not exist. 

57 """ 

58 page = await self._repo.get_by_id(PageIdentifier(command.id)) 

59 application = await self._application_repo.get_by_id( 

60 ApplicationIdentifier(command.application) 

61 ) 

62 

63 page = replace( 

64 page, 

65 enabled=command.enabled, 

66 application=application, 

67 texts=tuple( 

68 [ 

69 LocaleText( 

70 locale=Locale(text.locale), 

71 format=DocumentFormat(text.format), 

72 title=text.title, 

73 content=text.content, 

74 summary=text.summary, 

75 author=self._owner, 

76 ) 

77 for text in command.texts 

78 ] 

79 ), 

80 priority=command.priority, 

81 remark=command.remark, 

82 traceable_time=page.traceable_time.mark_for_update(), 

83 ) 

84 

85 await self._repo.update(page) 

86 

87 self._presenter.present(page)