From 4eea55cfb4afb81b4642206b342d0be47994c3d5 Mon Sep 17 00:00:00 2001 From: hyukychang Date: Sun, 24 Mar 2024 17:56:55 +0900 Subject: [PATCH 1/6] add : base layer for domain and infra --- ara/domain/board/__init__.py | 0 ara/domain/board/constants.py | 13 +++++++++++++ ara/domain/board/type.py | 0 ara/infra/board/__init__.py | 0 ara/infra/board/board_infra.py | 0 5 files changed, 13 insertions(+) create mode 100644 ara/domain/board/__init__.py create mode 100644 ara/domain/board/constants.py create mode 100644 ara/domain/board/type.py create mode 100644 ara/infra/board/__init__.py create mode 100644 ara/infra/board/board_infra.py diff --git a/ara/domain/board/__init__.py b/ara/domain/board/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ara/domain/board/constants.py b/ara/domain/board/constants.py new file mode 100644 index 00000000..e743dc27 --- /dev/null +++ b/ara/domain/board/constants.py @@ -0,0 +1,13 @@ +from enum import IntEnum, IntFlag, auto + + +class BoardAccessPermissionType(IntEnum): + READ = 0 + WRITE = 1 + COMMENT = 2 + + +class NameType(IntFlag): + REGULAR = auto() + ANONYMOUS = auto() + REALNAME = auto() diff --git a/ara/domain/board/type.py b/ara/domain/board/type.py new file mode 100644 index 00000000..e69de29b diff --git a/ara/infra/board/__init__.py b/ara/infra/board/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ara/infra/board/board_infra.py b/ara/infra/board/board_infra.py new file mode 100644 index 00000000..e69de29b From 432f0248e24f05204977e098d4bf668454c4c85b Mon Sep 17 00:00:00 2001 From: hyukychang Date: Mon, 25 Mar 2024 20:39:34 +0900 Subject: [PATCH 2/6] feat: infra structure layer of board --- ara/domain/board/type.py | 45 +++++++++++++++++ ara/infra/board/board_infra.py | 88 ++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) diff --git a/ara/domain/board/type.py b/ara/domain/board/type.py index e69de29b..9a6ae77c 100644 --- a/ara/domain/board/type.py +++ b/ara/domain/board/type.py @@ -0,0 +1,45 @@ +from datetime import datetime + +from pydantic import BaseModel + +from ara.domain.board.constants import NameType + + +class BoardGroupInfo(BaseModel): + id: int + ko_name: str + en_name: str + slug: str + + +class TopicInfo(BaseModel): + slug: str + ko_name: str + en_name: str + + +class BoardInfo(BaseModel): + id: int + created_at: datetime + updated_at: datetime + deleted_at: datetime + slug: str + ko_name: str + en_name: str + # TODO(hyuk): 이거 group_has_access_permission 여기 잘보고 뭐 할거 판단 + read_access_mask: int + write_access_mask: int + comment_access_mask: int + is_readonly: bool + is_hidden: bool + name_type: NameType + is_school_communication: int + group: BoardGroupInfo + banner_image: str + ko_banner_description: str + en_banner_description: str + top_threshold: int + topics: list[TopicInfo] + + class Config: + arbitrary_types_allowed = True diff --git a/ara/infra/board/board_infra.py b/ara/infra/board/board_infra.py index e69de29b..32394940 100644 --- a/ara/infra/board/board_infra.py +++ b/ara/infra/board/board_infra.py @@ -0,0 +1,88 @@ +from apps.core.models.board import Board +from apps.core.models.board_group import BoardGroup +from ara.domain.board.type import BoardGroupInfo, BoardInfo, TopicInfo +from ara.infra.django_infra import NewAraDjangoInfra + + +class BoardGroupInfra(NewAraDjangoInfra[BoardGroup]): + def __init__(self) -> None: + super().__init__(Board) + + pass + + +class BoardInfra(NewAraDjangoInfra[Board]): + def __init__(self) -> None: + super().__init__(Board) + self.board_group_infra = BoardGroupInfra() + + def get_all(self) -> list[BoardInfo]: + queryset = Board.objects.select_related("group").extra( + select={ + "topic_id": "topic.id", + "topic_slug": "topic.slug", + "topic_ko_name": "topic.ko_name", + "topic_en_name": "topic.en_name", + }, + tables=[ + "core_board` AS `b` LEFT OUTER JOIN `core_topic` AS `topic`" + " ON `b`.`id` = `topic`.`parent_board_id" + ], + where=["b.id = core_board.id"], + ) + + d: dict[BoardInfo, BoardInfo] = {} + for board_model in queryset: + board_info = self._to_board_without_topics(board_model) + if board_info.id in d.keys(): + d[board_info.id].topics.append( + TopicInfo( + slug=board_model.topic_slug, + ko_name=board_model.topic_ko_name, + en_name=board_model.topic_en_name, + ) + ) + else: + if board_model.topic_id is None: + d[board_info.id] = board_info + else: + board_info_with_topic = board_info + board_info_with_topic.topics.append( + TopicInfo( + slug=board_model.topic_slug, + ko_name=board_model.topic_ko_name, + en_name=board_model.topic_en_name, + ) + ) + d[board_info.id] = board_info_with_topic + + return [info for info in d.values()] + + def _to_board_without_topics(self, board: Board) -> BoardInfo: + return BoardInfo( + id=board.id, + created_at=board.created_at, + updated_at=board.updated_at, + deleted_at=board.deleted_at, + slug=board.slug, + ko_name=board.ko_name, + en_name=board.en_name, + read_access_mask=board.read_access_mask, + write_access_mask=board.write_access_mask, + comment_access_mask=board.comment_access_mask, + is_readonly=board.is_readonly, + is_hidden=board.is_hidden, + name_type=board.name_type, + is_school_communication=board.is_school_communication, + group=BoardGroupInfo( + id=board.group.id, + ko_name=board.group.ko_name, + en_name=board.group.en_name, + slug=board.group.slug, + ), + banner_image=board.banner_image.url, + ko_banner_description=board.ko_banner_description, + en_banner_description=board.en_banner_description, + top_threshold=board.top_threshold, + topics=[], + ) From dfc89bdbbeb8f301c69c6bf0be239856849449e5 Mon Sep 17 00:00:00 2001 From: hyukychang Date: Mon, 25 Mar 2024 20:49:59 +0900 Subject: [PATCH 3/6] feat: add domain, infra, service layer --- ara/domain/board/board_domain.py | 10 ++++++++++ ara/infra/board/board_infra.py | 2 +- ara/service/board/__init__.py | 0 ara/service/board/board_service.py | 10 ++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 ara/domain/board/board_domain.py create mode 100644 ara/service/board/__init__.py create mode 100644 ara/service/board/board_service.py diff --git a/ara/domain/board/board_domain.py b/ara/domain/board/board_domain.py new file mode 100644 index 00000000..0d42a58a --- /dev/null +++ b/ara/domain/board/board_domain.py @@ -0,0 +1,10 @@ +from ara.domain.board.type import BoardInfo +from ara.infra.board.board_infra import BoardInfra + + +class BoardDomain: + def __init__(self) -> None: + self.board_infra = BoardInfra() + + def get_all_boards(self) -> list[BoardInfo]: + return self.board_infra.get_all_boards() diff --git a/ara/infra/board/board_infra.py b/ara/infra/board/board_infra.py index 32394940..cd59ac12 100644 --- a/ara/infra/board/board_infra.py +++ b/ara/infra/board/board_infra.py @@ -16,7 +16,7 @@ def __init__(self) -> None: super().__init__(Board) self.board_group_infra = BoardGroupInfra() - def get_all(self) -> list[BoardInfo]: + def get_all_boards(self) -> list[BoardInfo]: queryset = Board.objects.select_related("group").extra( select={ "topic_id": "topic.id", diff --git a/ara/service/board/__init__.py b/ara/service/board/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ara/service/board/board_service.py b/ara/service/board/board_service.py new file mode 100644 index 00000000..bf8baf01 --- /dev/null +++ b/ara/service/board/board_service.py @@ -0,0 +1,10 @@ +from ara.domain.board.board_domain import BoardDomain +from ara.domain.board.type import BoardInfo + + +class BadgeApplication: + def __init__(self) -> None: + self.board_domain = BoardDomain() + + def get_all_boards(self) -> list[BoardInfo]: + return self.board_domain.get_all_boards() From 61041c5423b56b816790c887cab2f76e5b1662e5 Mon Sep 17 00:00:00 2001 From: hyukychang Date: Mon, 25 Mar 2024 20:52:04 +0900 Subject: [PATCH 4/6] fix: change name --- ara/service/board/board_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ara/service/board/board_service.py b/ara/service/board/board_service.py index bf8baf01..98064084 100644 --- a/ara/service/board/board_service.py +++ b/ara/service/board/board_service.py @@ -2,7 +2,7 @@ from ara.domain.board.type import BoardInfo -class BadgeApplication: +class BoardService: def __init__(self) -> None: self.board_domain = BoardDomain() From f2403e67533d8df553a044a2e55d07adf83f1195 Mon Sep 17 00:00:00 2001 From: hyukychang Date: Mon, 25 Mar 2024 23:21:19 +0900 Subject: [PATCH 5/6] feat: add constants in controller From aa340ff92996f1b2ae1a85ca93d48f8df72daeb8 Mon Sep 17 00:00:00 2001 From: hyukychang Date: Fri, 19 Apr 2024 23:08:07 +0900 Subject: [PATCH 6/6] fix: change to AraDjangoInfra due to rebase --- ara/infra/board/board_infra.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ara/infra/board/board_infra.py b/ara/infra/board/board_infra.py index cd59ac12..3e9fbc5b 100644 --- a/ara/infra/board/board_infra.py +++ b/ara/infra/board/board_infra.py @@ -1,17 +1,17 @@ from apps.core.models.board import Board from apps.core.models.board_group import BoardGroup from ara.domain.board.type import BoardGroupInfo, BoardInfo, TopicInfo -from ara.infra.django_infra import NewAraDjangoInfra +from ara.infra.django_infra import AraDjangoInfra -class BoardGroupInfra(NewAraDjangoInfra[BoardGroup]): +class BoardGroupInfra(AraDjangoInfra[BoardGroup]): def __init__(self) -> None: super().__init__(Board) pass -class BoardInfra(NewAraDjangoInfra[Board]): +class BoardInfra(AraDjangoInfra[Board]): def __init__(self) -> None: super().__init__(Board) self.board_group_infra = BoardGroupInfra()