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, )
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, )
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, )
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())
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, )
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(), )
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, )
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, )
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, )
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)), }, } }
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 [], )