Beispiel #1
0
class CommentModel(db.Model):
    __tablename__ = "comments"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    post_id = Column(BigInteger, ForeignKey(PostModel.id), nullable=False)
    user_id = Column(BigInteger, ForeignKey(UserModel.id), nullable=False)
    parent_id = Column(BigInteger, ForeignKey("comments.id"), nullable=False)
    body = Column(String(500))
    is_deleted = Column(Boolean, nullable=False, default=False)
    is_blocked = Column(Boolean, nullable=False, default=False)
    report_count = Column(Integer, default=0)
    last_user_action = Column(String(20), nullable=False, default="default")
    last_user_action_at = Column(DateTime, nullable=True)
    last_admin_action = Column(String(20), nullable=False, default="default")
    last_admin_action_at = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    post = relationship("PostModel", backref="comments")
    user = relationship("UserModel", backref="comments")
    parent = relationship(lambda: CommentModel,
                          remote_side=id,
                          backref="child")

    def to_entity(self):
        pass
class PostReportModel(db.Model):
    __tablename__ = "post_reports"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    post_id = Column(BigInteger, ForeignKey(PostModel.id), nullable=False)
    report_user_id = Column(BigInteger, nullable=True)
    status = Column(String(20))
    context = Column(String(100))
    confirm_admin_id = Column(Integer)
    is_system_report = Column(Boolean)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    post = relationship("PostModel", backref="post_report")

    def to_entity(self) -> PostReportEntity:
        return PostReportEntity(
            id=self.id,
            post_id=self.post_id,
            report_user_id=self.report_user_id,
            status=self.status,
            context=self.context,
            confirm_admin_id=self.confirm_admin_id,
            is_system_report=self.is_system_report,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #3
0
class ArticleModel(db.Model):
    __tablename__ = "articles"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    post_id = Column(
        BigInteger().with_variant(Integer, "sqlite"),
        ForeignKey(PostModel.id),
        nullable=False,
    )
    # TODO : 성능상 글자 수 변경될 수 있음.
    body = Column(String(length=2000), nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    post = relationship("PostModel", backref=backref("article", uselist=False))

    def to_entity(self) -> ArticleEntity:
        return ArticleEntity(
            id=self.id,
            post_id=self.post_id,
            body=self.body,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #4
0
class AttachmentModel(db.Model):
    __tablename__ = "attachments"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    post_id = Column(BigInteger, ForeignKey(PostModel.id), nullable=False)
    type = Column(String(10), nullable=False)
    uuid = Column(String(50), default=uuid.uuid4(), nullable=False)
    file_name = Column(String(50), nullable=False)
    path = Column(String(50), nullable=False)
    extension = Column(String(50), nullable=False)
    created_at = Column(DateTime(), default=get_server_timestamp())
    updated_at = Column(DateTime(), default=get_server_timestamp())

    post = relationship("PostModel", backref="attachments")

    def to_entity(self) -> AttachmentEntity:
        return AttachmentEntity(
            id=self.id,
            post_id=self.post_id,
            type=self.type,
            uuid=self.uuid,
            file_name=self.file_name,
            path=self.path,
            extension=self.extension,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #5
0
class CategoryModel(db.Model):
    __tablename__ = "categories"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    name = Column(String(40), nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())
Beispiel #6
0
class RegionGroupModel(db.Model):
    __tablename__ = "region_groups"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    name = Column(String(length=50), nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    def to_entity(self) -> RegionGroupEntity:
        return RegionGroupEntity(
            id=self.id,
            name=self.name,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #7
0
class UserModel(db.Model):
    __tablename__ = "users"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    login_id = Column(String(50), nullable=False)
    nickname = Column(String(50), nullable=False)
    password = Column(String(50), nullable=False)
    profile_id = Column(
        BigInteger,
        ForeignKey(UserProfileModel.id),
        nullable=False,
    )
    status = Column(String(10), nullable=False)
    provider = Column(String(20), nullable=False)
    region_id = Column(
        SmallInteger,
        ForeignKey(RegionModel.id),
        nullable=False,
    )
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    user_profile = relationship("UserProfileModel",
                                backref=backref("user", uselist=False))
    region = relationship("RegionModel",
                          backref=backref("user", uselist=False))

    def to_entity(self) -> UserEntity:
        return UserEntity(
            id=self.id,
            login_id=self.login_id,
            nickname=self.nickname,
            profile_id=self.profile_id,
            status=self.status,
            provider=self.provider,
            region_id=self.region_id,
            created_at=self.created_at,
            updated_at=self.updated_at,
            user_profile=self.user_profile.path + self.user_profile.uuid +
            self.user_profile.extension if self.user_profile else None,
            region=self.region.to_entity(),
        )
Beispiel #8
0
class NotificationModel(db.Model):
    __tablename__ = "notifications"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    user_id = Column(
        BigInteger().with_variant(Integer, "sqlite"),
        ForeignKey(UserModel.id),
        nullable=False,
    )
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())
    is_available = Column(Boolean, nullable=False, default=True)
    use_bantime = Column(Boolean, nullable=False, default=False)
    use_keyword = Column(Boolean, nullable=False, default=True)
    use_chat = Column(Boolean, nullable=False, default=True)
    use_etc = Column(Boolean, nullable=False, default=True)
    ban_time_from = Column(String(4), nullable=False, default="2300")
    ban_time_to = Column(String(4), nullable=False, default="0900")

    user = relationship("UserModel", backref="notifications")
class UserProfileModel(db.Model):
    __tablename__ = "user_profiles"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    uuid = Column(String(length=50), nullable=False)
    file_name = Column(String(length=50), nullable=False)
    path = Column(String(length=100), nullable=False)
    extension = Column(String(length=5), nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    def to_entity(self) -> UserProfileEntity:
        return UserProfileEntity(
            id=self.id,
            uuid=self.uuid,
            file_name=self.file_name,
            path=self.path,
            extension=self.extension,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #10
0
class PostLikeCountModel(db.Model):
    __tablename__ = "post_like_counts"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    post_id = Column(BigInteger, ForeignKey(PostModel.id), nullable=False)
    count = Column(Integer, default=0, nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    post = relationship("PostModel",
                        backref=backref("post_like_count", uselist=False))

    def to_entity(self) -> PostLikeCountEntity:
        return PostLikeCountEntity(
            id=self.id,
            post_id=self.post_id,
            count=self.count,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
class PostLikeStateModel(db.Model):
    __tablename__ = "post_like_states"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    post_id = Column(BigInteger, ForeignKey(PostModel.id), nullable=False)
    user_id = Column(BigInteger, ForeignKey(UserModel.id), nullable=False)
    state = Column(String(10))
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    post = relationship("PostModel", backref="post_like_state")
    user = relationship("UserModel", backref="post_like_state")

    def to_entity(self) -> PostLikeStateEntity:
        return PostLikeStateEntity(
            id=self.id,
            post_id=self.post_id,
            user_id=self.user_id,
            state=self.state,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #12
0
class RegionModel(db.Model):
    __tablename__ = "regions"

    id = Column(SmallInteger().with_variant(Integer, "sqlite"),
                primary_key=True)
    region_group_id = Column(
        SmallInteger,
        ForeignKey(RegionGroupModel.id),
        nullable=False,
    )
    name = Column(String(length=50), nullable=False)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())

    region_group = relationship("RegionGroupModel", backref="region")

    def to_entity(self) -> RegionEntity:
        return RegionEntity(
            id=self.id,
            region_group_id=self.region_group_id,
            name=self.name,
            created_at=self.created_at,
            updated_at=self.updated_at,
        )
Beispiel #13
0
 def to_dict(dto: MessageDto):
     return {
         "message": {
             "uuid": str(uuid.uuid4()),
             "token": dto.token,
             "category": dto.category,
             "type": dto.type,
             "notification": {
                 "title": dto.title,
                 "body": dto.body,
             },
             "data": {
                 "post_id":
                 dto.post_id,
                 "user_id":
                 dto.user_id,
                 "created_at":
                 str(get_server_timestamp().replace(microsecond=0)),
             },
         }
     }
Beispiel #14
0
class PostModel(db.Model):
    __tablename__ = "posts"

    id = Column(BigInteger().with_variant(Integer, "sqlite"), primary_key=True)
    user_id = Column(
        BigInteger().with_variant(Integer, "sqlite"),
        ForeignKey(UserModel.id),
        nullable=False,
    )
    title = Column(String(100), nullable=False)
    region_group_id = Column(
        SmallInteger,
        ForeignKey(RegionGroupModel.id),
        nullable=False,
    )
    type = Column(String(20), nullable=False)
    is_comment_disabled = Column(Boolean, nullable=False, default=False)
    is_deleted = Column(Boolean, nullable=False, default=False)
    is_blocked = Column(Boolean, nullable=False, default=False)
    report_count = Column(Integer, default=0)
    read_count = Column(Integer, default=0)
    last_user_action = Column(String(20), nullable=False, default="default")
    last_user_action_at = Column(DateTime, nullable=True)
    last_admin_action = Column(String(20), nullable=False, default="default")
    last_admin_action_at = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=get_server_timestamp())
    updated_at = Column(DateTime, default=get_server_timestamp())
    amount = Column(SmallInteger, default=0)
    unit = Column(String(5))
    price_per_unit = Column(Integer)
    status = Column(String(20),
                    default=PostStatusEnum.SELLING.value,
                    nullable=False)

    categories = relationship(
        "CategoryModel",
        secondary="post_category",
        primaryjoin="PostModel.id == PostCategoryModel.post_id",
        secondaryjoin="PostCategoryModel.category_id == CategoryModel.id",
        backref="post",
    )
    user = relationship("UserModel", backref="post")
    region_group = relationship("RegionGroupModel",
                                backref=backref("post", uselist=False))

    def to_entity(self) -> PostEntity:
        return PostEntity(
            id=self.id,
            user_id=self.user_id,
            title=self.title,
            body=self.article.body if self.article else None,
            region_name=self.user.region.name if self.user.region else None,
            region_group_id=self.region_group_id,
            region_group_name=self.region_group.name
            if self.region_group else None,
            type=self.type,
            is_comment_disabled=self.is_comment_disabled,
            is_deleted=self.is_deleted,
            is_blocked=self.is_blocked,
            report_count=self.report_count,
            read_count=self.read_count,
            last_user_action=self.last_user_action,
            last_user_action_at=self.last_user_action_at,
            last_admin_action=self.last_admin_action,
            last_admin_action_at=self.last_admin_action_at,
            created_at=self.created_at,
            updated_at=self.updated_at,
            user=self.user.to_entity() if self.user else None,
            amount=self.amount,
            unit=self.unit,
            price_per_unit=self.price_per_unit,
            status=self.status,
            post_like_count=self.post_like_count.count
            if self.post_like_count else 0,
            post_like_state=self.post_like_state[0].state
            if self.post_like_state else PostLikeStateEnum.DEFAULT.value,
            category_ids=[category.id for category in self.categories]
            if self.categories else [],
            attachments=[
                attachment.path + attachment.uuid + attachment.extension
                for attachment in self.attachments
            ] if self.attachments else [],
        )

    def to_post_list_entity(self) -> PostListEntity:
        # 게시글 리스트 응답용 entity
        return PostListEntity(
            id=self.id,
            user_id=self.user_id,
            title=self.title,
            body=self.article.body if self.article else None,
            region_name=self.user.region.name if self.user.region else None,
            region_group_id=self.region_group_id,
            region_group_name=self.user.region.region_group.name
            if self.user.region.region_group else None,
            type=self.type,
            is_comment_disabled=self.is_comment_disabled,
            is_deleted=self.is_deleted,
            is_blocked=self.is_blocked,
            report_count=self.report_count,
            read_count=self.read_count,
            last_user_action=self.last_user_action,
            last_user_action_at=self.last_user_action_at,
            last_admin_action=self.last_admin_action,
            last_admin_action_at=self.last_admin_action_at,
            created_at=self.created_at,
            updated_at=self.updated_at,
            user=self.user.to_entity() if self.user else None,
            user_profile=self.user.user_profile.to_entity()
            if self.user.user_profile else None,
            amount=self.amount,
            unit=self.unit,
            price_per_unit=self.price_per_unit,
            status=self.status,
            post_like_count=self.post_like_count.count
            if self.post_like_count else 0,
            category_ids=[category.id for category in self.categories]
            if self.categories else [],
            attachments=[
                attachment.path + attachment.uuid + attachment.extension
                for attachment in self.attachments
            ] if self.attachments else [],
        )