Ejemplo n.º 1
0
 def block(self, post_id: int) -> bool:
     try:
         session.query(PostModel).filter_by(id=post_id).update(
             {"is_blocked": True})
         return True
     except Exception as e:
         logger.error(
             f"[BoardRepository][block] post_id : {post_id} error : {e}")
         session.rollback()
         return False
Ejemplo n.º 2
0
 def delete_attachments(self, post_id: int) -> bool:
     try:
         session.query(AttachmentModel).filter_by(post_id=post_id).delete()
         return True
     except Exception as e:
         logger.error(
             f"[BoardRepository][delete_attachments] post_id : {post_id} error : {e}"
         )
         session.rollback()
         return False
Ejemplo n.º 3
0
 def add_read_count(self, post_id: int) -> bool:
     try:
         session.query(PostModel).filter_by(id=post_id).update(
             {"read_count": PostModel.read_count + 1})
         return True
     except Exception as e:
         logger.error(
             f"[BoardRepository][add_read_count] post_id : {post_id} error : {e}"
         )
         session.rollback()
         return False
Ejemplo n.º 4
0
 def add_report_count(self, post_id: int) -> Union[int, bool]:
     try:
         session.query(PostModel).filter_by(id=post_id).update(
             {"report_count": PostModel.report_count + 1})
         return self._get_post(post_id=post_id).report_count
     except Exception as e:
         logger.error(
             f"[BoardRepository][add_report_count] post_id : {post_id} error : {e}"
         )
         session.rollback()
         return False
Ejemplo n.º 5
0
 def update_notification_status(
     self, notification_history_id: int, status: str
 ) -> None:
     try:
         session.query(NotificationHistoryModel).filter_by(
             id=notification_history_id
         ).update({"status": status})
     except Exception as e:
         # TODO : log e 필요
         print("-------------------> ", e)
         session.rollback()
Ejemplo n.º 6
0
 def delete_post(self, dto: DeletePostDto) -> Optional[PostEntity]:
     try:
         session.query(PostModel).filter_by(id=dto.post_id).update(
             {"is_deleted": True})
         return self._get_post(post_id=dto.post_id)
     except Exception as e:
         session.rollback()
         logger.error(
             f"[BoardRepository][delete_post] post_id : {dto.post_id} error : {e}"
         )
         return None
Ejemplo n.º 7
0
 def update_post_like_count(self, post_id: int, count: int) -> bool:
     try:
         session.query(PostLikeCountModel).filter_by(
             post_id=post_id).update(
                 {"count": PostLikeCountModel.count + count})
         return True
     except Exception as e:
         logger.error(
             f"[BoardRepository][update_post_like_count] post_id : {post_id} count : {count} error : {e}"
         )
         session.rollback()
         return False
Ejemplo n.º 8
0
    def update_post_like_state(self, user_id: int, post_id: int,
                               state: str) -> Optional[PostLikeStateEntity]:
        try:
            session.query(PostLikeStateModel).filter_by(
                user_id=user_id,
                post_id=post_id,
            ).update({"state": state})

            return self.get_post_like_state(user_id=user_id, post_id=post_id)
        except Exception as e:
            logger.error(
                f"[BoardRepository][create_post_like_state] post_id : {post_id} user_id : {user_id} state : {state}"
                f" error : {e}")
            session.rollback()
            return None
Ejemplo n.º 9
0
    def get_board(self, board_id: int = None) -> Board:
        bm = aliased(BoardModels)
        board = session.query(bm).filter(bm.id == board_id).first()

        if not board:
            raise NotFoundException()
        return board.to_entity()
Ejemplo n.º 10
0
    def get_keyword_target_user(self) -> List[dict]:
        target_user_group = (
            session.query(NotificationModel)
            .with_entities(
                NotificationModel.user_id,
                UserNotificationTokenModel.token,
                KeywordModel.name_1,
                KeywordModel.name_2,
                KeywordModel.name_3,
            )
            .join(
                UserNotificationTokenModel,
                NotificationModel.user_id == UserNotificationTokenModel.user_id,
            )
            .join(KeywordModel, NotificationModel.user_id == KeywordModel.user_id)
            .filter(
                NotificationModel.is_available == True,
                NotificationModel.use_keyword == True,
            )
            .all()
        )

        result = []
        for target_user in target_user_group:
            info_dict = dict(
                user_id=target_user.user_id,
                token=target_user.token,
                keyword_1=target_user.name_1,
                keyword_2=target_user.name_2,
                keyword_3=target_user.name_3,
            )
            result.append(info_dict)
        return result
Ejemplo n.º 11
0
 def get_user_profile(self,
                      user_profile_id: int) -> Optional[UserProfileEntity]:
     user_profile = (session.query(UserProfileModel).filter_by(
         id=user_profile_id).first())
     if user_profile:
         return user_profile.to_entity()
     return None
Ejemplo n.º 12
0
    def edit_board(self, dto: EditBoardDto = None) -> Board:
        board = (session.query(BoardModels).filter(
            BoardModels.id == dto.board_id).first())
        board.title = dto.title or board.title
        board.body = dto.body or board.body
        session.commit()

        return board.to_entity()
Ejemplo n.º 13
0
    def get_post(self,
                 post_id: int,
                 is_deleted: bool = False,
                 is_blocked: bool = False) -> Optional[PostEntity]:
        post = (session.query(PostModel).filter_by(
            id=post_id, is_deleted=is_deleted, is_blocked=is_blocked).first())

        return post.to_entity() if post else None
Ejemplo n.º 14
0
 def update_user(self, user_id: int, nickname: str, status: str,
                 region_id: int) -> Optional[UserEntity]:
     try:
         session.query(UserModel).filter_by(id=user_id).update({
             "nickname":
             nickname,
             "status":
             status,
             "region_id":
             region_id
         })
         return self.get_user(user_id=user_id)
     except Exception as e:
         logger.error(
             f"[UserRepository][update_user] user_id : {user_id} error : {e}"
         )
         session.rollback()
         return None
Ejemplo n.º 15
0
 def update_user_profile(self, user_profile_id: int, uuid: str,
                         file_name: str, path: str,
                         extension: str) -> Optional[UserProfileEntity]:
     try:
         session.query(UserProfileModel).filter_by(
             id=user_profile_id).update({
                 "uuid": uuid,
                 "file_name": file_name,
                 "path": path,
                 "extension": extension,
             })
         return self.get_user_profile(user_profile_id=user_profile_id)
     except Exception as e:
         logger.error(
             f"[UserRepository][update_user] user_profile_id : {user_profile_id} error : {e}"
         )
         session.rollback()
         return None
Ejemplo n.º 16
0
    def get_selling_post_list(self,
                              user_id: int,
                              previous_post_id: int = None) -> list:
        previous_post_id_filter = []
        if previous_post_id:
            previous_post_id_filter.append(PostModel.id < previous_post_id)

        post_list = (session.query(PostModel).filter(
            PostModel.user_id == user_id, *previous_post_id_filter).order_by(
                PostModel.id.desc()).limit(PostLimitEnum.LIMIT.value).all())

        return [post.to_entity() for post in post_list]
Ejemplo n.º 17
0
 def update_post(self, dto: UpdatePostDto) -> Optional[PostEntity]:
     try:
         (session.query(PostModel).filter(
             PostModel.id == dto.post_id).update({
                 "title":
                 dto.title,
                 "region_group_id":
                 dto.region_group_id,
                 "type":
                 dto.type,
                 "is_comment_disabled":
                 dto.is_comment_disabled,
             }))
         session.query(ArticleModel).filter_by(post_id=dto.post_id).update(
             {"body": dto.body})
         post_entity = self._get_post(post_id=dto.post_id)
         return post_entity if post_entity else None
     except Exception as e:
         session.rollback()
         logger.error(
             f"[BoardRepository][update_post] title : {dto.title} region_group_id : {dto.region_group_id} "
             f"type : {dto.type} is_comment_disabled : {dto.is_comment_disabled} error : {e}"
         )
         return None
Ejemplo n.º 18
0
    def get_board_list(self,
                       search_type: str = None,
                       search_word: str = None,
                       page: int = None) -> List:
        search_filter = []
        if search_word:
            if search_type == BoardSearchTypeEnum.TITLE:
                search_filter.append(BoardModels.title.ilike(search_word))

            if search_type == BoardSearchTypeEnum.USER_ID:
                search_filter.append(BoardModels.user_id.ilike(search_word))
        board_pagination = (session.query(BoardModels).filter(
            *search_filter).paginate(page=page,
                                     per_page=BoardPaginationEnum.BOARD_PAGE))
        return [
            [item.to_entity() for item in board_pagination.items],
            Paginate(
                total=board_pagination.total,
                count=len(board_pagination.items),
                per_page=board_pagination.per_page,
                current_page=board_pagination.page,
                total_pages=board_pagination.pages,
            ),
        ]
Ejemplo n.º 19
0
    def get_attachments(self, post_id: int) -> list:
        attachments = session.query(AttachmentModel).filter_by(
            post_id=post_id).all()

        return [attachment.to_entity() for attachment in attachments]
Ejemplo n.º 20
0
 def _get_post(self, post_id) -> PostEntity:
     return session.query(PostModel).filter_by(
         id=post_id).first().to_entity()
Ejemplo n.º 21
0
 def delete_board(self, dto: DeleteBoardDto = None) -> None:
     session.query(BoardModels).filter(
         BoardModels.id == dto.board_id).delete()
     session.commit()
Ejemplo n.º 22
0
    def get_post_list(
        self,
        region_group_id: int,
        previous_post_id: int = None,
        title: str = "",
        category_ids: list = None,
        status: str = None,
    ) -> Optional[List[Union[PostEntity, list]]]:
        """
        :param category_ids: 상품 카테고리
        :param status: post 판매 상태
        :param region_group_id: 유저가 속한 동네 식별자
        :param previous_post_id: 유저가 바로 직전 조회한 post id
        :param title: 게시글 제목
        :return: post list
        1. 동일 지역의 post 가져오기, deleted, blocked 제외
        2. title like 검색, 선택된 type, category 등에 맞게 응답
        """

        if not category_ids:
            category_ids = self.get_category_ids()

        search_filter = []
        if title:
            search_filter.append(PostModel.title.like(f"%{title}%"))

        previous_post_id_filter = []
        if previous_post_id:
            previous_post_id_filter.append(PostModel.id < previous_post_id)

        status_filters = []
        if status == PostStatusEnum.EXCLUDE_COMPLETED.value:  # 거래 완료 글 안보기
            status_filters.append(
                PostModel.status == PostStatusEnum.SELLING.value)
        elif status == PostStatusEnum.ALL.value:  # 판매중, 거래 완료 글 보기
            status_filters.append(
                [PostModel.status == PostStatusEnum.SELLING.value])
            status_filters.append(
                [PostModel.status == PostStatusEnum.COMPLETED.value])

        try:
            # TODO:코드 메서드로 분리해서 호출
            # status에 따라 판매중 or 판매중 + 거래 완료 선택
            if len(status_filters) >= 2:
                query_list = []
                for status_filter in status_filters:
                    query_list.append(
                        session.query(PostModel).filter(
                            PostModel.region_group_id == region_group_id,
                            PostModel.is_blocked == False,
                            PostModel.is_deleted == False,
                            *search_filter,
                            *previous_post_id_filter,
                            *status_filter,
                        ))
                query = query_list[0].union(*query_list[1:])
            else:
                query = session.query(PostModel).filter(
                    PostModel.region_group_id == region_group_id,
                    PostModel.is_blocked == False,
                    PostModel.is_deleted == False,
                    *search_filter,
                    *previous_post_id_filter,
                    *status_filters,
                )

            query_list = []
            for category_id in category_ids:
                q = query
                query_list.append(
                    q.filter(
                        PostModel.id == PostCategoryModel.post_id,
                        PostCategoryModel.category_id == CategoryModel.id,
                        CategoryModel.id == category_id,
                    ))

            post_list = []
            if query_list:
                query = query_list[0].union(*query_list[1:])

                post_list = (query.order_by(PostModel.id.desc()).limit(
                    PostLimitEnum.LIMIT.value).all())

            return [post.to_post_list_entity() for post in post_list]
        except Exception as e:
            logger.error(f"[BoardRepository][get_post_list] error : {e}")
            return []
Ejemplo n.º 23
0
 def is_post_exist(self, post_id: int) -> bool:
     return session.query(
         session.query(PostModel).filter_by(id=post_id).exists()).scalar()
Ejemplo n.º 24
0
    def get_post_like_count(self,
                            post_id: int) -> Optional[PostLikeCountEntity]:
        post_like_count = (session.query(PostLikeCountModel).filter_by(
            post_id=post_id).first())

        return post_like_count.to_entity() if post_like_count else None
Ejemplo n.º 25
0
    def get_user(self, user_id: int) -> Optional[UserEntity]:
        user = session.query(UserModel).filter_by(id=user_id).first()

        return user.to_entity() if user else None
Ejemplo n.º 26
0
    def get_post_like_state(self, user_id: int,
                            post_id: int) -> Optional[PostLikeStateEntity]:
        post_like_state = (session.query(PostLikeStateModel).filter_by(
            user_id=user_id, post_id=post_id).first())

        return post_like_state.to_entity() if post_like_state else None
Ejemplo n.º 27
0
    def get_category_ids(self) -> list:
        category_ids = (session.query(CategoryModel).with_entities(
            CategoryModel.id).all())

        return [category_id[0] for category_id in category_ids]
Ejemplo n.º 28
0
 def get_post_report(self, report_user_id: int,
                     post_id) -> Optional[PostReportEntity]:
     post_report = (session.query(PostReportModel).filter_by(
         report_user_id=report_user_id, post_id=post_id).first())
     return post_report.to_entity() if post_report else None
Ejemplo n.º 29
0
 def get_user(self, username: str = None) -> UserModels:
     user = session.query(UserModels).filter_by(username=username).first()
     if not user:
         raise NotFoundException()
     return user.to_entity()
Ejemplo n.º 30
0
    def get_region_group(self, id: int) -> Optional[RegionGroupEntity]:
        region_group = session.query(RegionGroupModel).filter_by(id=id).first()

        return region_group.to_entity() if region_group else None