137 lines
5.6 KiB
Python
137 lines
5.6 KiB
Python
import time
|
|
|
|
from sqlalchemy import JSON, Boolean, Column, ForeignKey, Index, Integer, String
|
|
|
|
from services.db import Base
|
|
|
|
# from sqlalchemy_utils import TSVectorType
|
|
|
|
|
|
class AuthorRating(Base):
|
|
"""
|
|
Рейтинг автора от другого автора.
|
|
|
|
Attributes:
|
|
rater (int): ID оценивающего автора
|
|
author (int): ID оцениваемого автора
|
|
plus (bool): Положительная/отрицательная оценка
|
|
"""
|
|
|
|
__tablename__ = "author_rating"
|
|
|
|
id = None # type: ignore
|
|
rater = Column(ForeignKey("author.id"), primary_key=True)
|
|
author = Column(ForeignKey("author.id"), primary_key=True)
|
|
plus = Column(Boolean)
|
|
|
|
# Определяем индексы
|
|
__table_args__ = (
|
|
# Индекс для быстрого поиска всех оценок конкретного автора
|
|
Index("idx_author_rating_author", "author"),
|
|
# Индекс для быстрого поиска всех оценок, оставленных конкретным автором
|
|
Index("idx_author_rating_rater", "rater"),
|
|
)
|
|
|
|
|
|
class AuthorFollower(Base):
|
|
"""
|
|
Подписка одного автора на другого.
|
|
|
|
Attributes:
|
|
follower (int): ID подписчика
|
|
author (int): ID автора, на которого подписываются
|
|
created_at (int): Время создания подписки
|
|
auto (bool): Признак автоматической подписки
|
|
"""
|
|
|
|
__tablename__ = "author_follower"
|
|
|
|
id = None # type: ignore
|
|
follower = Column(ForeignKey("author.id"), primary_key=True)
|
|
author = Column(ForeignKey("author.id"), primary_key=True)
|
|
created_at = Column(Integer, nullable=False, default=lambda: int(time.time()))
|
|
auto = Column(Boolean, nullable=False, default=False)
|
|
|
|
# Определяем индексы
|
|
__table_args__ = (
|
|
# Индекс для быстрого поиска всех подписчиков автора
|
|
Index("idx_author_follower_author", "author"),
|
|
# Индекс для быстрого поиска всех авторов, на которых подписан конкретный автор
|
|
Index("idx_author_follower_follower", "follower"),
|
|
)
|
|
|
|
|
|
class AuthorBookmark(Base):
|
|
"""
|
|
Закладка автора на публикацию.
|
|
|
|
Attributes:
|
|
author (int): ID автора
|
|
shout (int): ID публикации
|
|
"""
|
|
|
|
__tablename__ = "author_bookmark"
|
|
|
|
id = None # type: ignore
|
|
author = Column(ForeignKey("author.id"), primary_key=True)
|
|
shout = Column(ForeignKey("shout.id"), primary_key=True)
|
|
|
|
# Определяем индексы
|
|
__table_args__ = (
|
|
# Индекс для быстрого поиска всех закладок автора
|
|
Index("idx_author_bookmark_author", "author"),
|
|
# Индекс для быстрого поиска всех авторов, добавивших публикацию в закладки
|
|
Index("idx_author_bookmark_shout", "shout"),
|
|
)
|
|
|
|
|
|
class Author(Base):
|
|
"""
|
|
Модель автора в системе.
|
|
|
|
Attributes:
|
|
name (str): Отображаемое имя
|
|
slug (str): Уникальный строковый идентификатор
|
|
bio (str): Краткая биография/статус
|
|
about (str): Полное описание
|
|
pic (str): URL изображения профиля
|
|
links (dict): Ссылки на социальные сети и сайты
|
|
created_at (int): Время создания профиля
|
|
last_seen (int): Время последнего посещения
|
|
updated_at (int): Время последнего обновления
|
|
deleted_at (int): Время удаления (если профиль удален)
|
|
"""
|
|
|
|
__tablename__ = "author"
|
|
|
|
name = Column(String, nullable=True, comment="Display name")
|
|
slug = Column(String, unique=True, comment="Author's slug")
|
|
bio = Column(String, nullable=True, comment="Bio") # status description
|
|
about = Column(String, nullable=True, comment="About") # long and formatted
|
|
pic = Column(String, nullable=True, comment="Picture")
|
|
links = Column(JSON, nullable=True, comment="Links")
|
|
created_at = Column(Integer, nullable=False, default=lambda: int(time.time()))
|
|
last_seen = Column(Integer, nullable=False, default=lambda: int(time.time()))
|
|
updated_at = Column(Integer, nullable=False, default=lambda: int(time.time()))
|
|
deleted_at = Column(Integer, nullable=True, comment="Deleted at")
|
|
|
|
# search_vector = Column(
|
|
# TSVectorType("name", "slug", "bio", "about", regconfig="pg_catalog.russian")
|
|
# )
|
|
|
|
# Определяем индексы
|
|
__table_args__ = (
|
|
# Индекс для быстрого поиска по имени
|
|
Index("idx_author_name", "name"),
|
|
# Индекс для быстрого поиска по slug
|
|
Index("idx_author_slug", "slug"),
|
|
# Индекс для фильтрации неудаленных авторов
|
|
Index(
|
|
"idx_author_deleted_at", "deleted_at", postgresql_where=deleted_at.is_(None)
|
|
),
|
|
# Индекс для сортировки по времени создания (для новых авторов)
|
|
Index("idx_author_created_at", "created_at"),
|
|
# Индекс для сортировки по времени последнего посещения
|
|
Index("idx_author_last_seen", "last_seen"),
|
|
)
|