|  | 
| 1 | 1 | from typing import Any | 
| 2 | 2 | 
 | 
| 3 | 3 | from sqlalchemy import ( | 
| 4 |  | -    CursorResult, | 
|  | 4 | +    BigInteger, | 
| 5 | 5 |     Boolean, | 
| 6 | 6 |     Column, | 
|  | 7 | +    CursorResult, | 
| 7 | 8 |     DateTime, | 
|  | 9 | +    ForeignKey, | 
|  | 10 | +    Identity, | 
| 8 | 11 |     Insert, | 
| 9 | 12 |     Integer, | 
| 10 | 13 |     MetaData, | 
| 11 | 14 |     Select, | 
| 12 | 15 |     String, | 
| 13 | 16 |     Table, | 
| 14 |  | -    Update, | 
| 15 |  | -    Identity, | 
| 16 |  | -    ForeignKey, | 
| 17 | 17 |     UniqueConstraint, | 
| 18 |  | -    BigInteger, | 
|  | 18 | +    Update, | 
| 19 | 19 |     func, | 
| 20 | 20 | ) | 
| 21 | 21 | from sqlalchemy.dialects.postgresql import JSONB | 
|  | 
| 24 | 24 | from src.config import settings | 
| 25 | 25 | from src.constants import DB_NAMING_CONVENTION | 
| 26 | 26 | from src.storage.constants import ( | 
|  | 27 | +    MEME_MEME_SOURCE_RAW_MEME_UNIQUE_CONSTRAINT, | 
| 27 | 28 |     MEME_RAW_TELEGRAM_MEME_SOURCE_POST_UNIQUE_CONSTRAINT, | 
| 28 | 29 |     MEME_RAW_VK_MEME_SOURCE_POST_UNIQUE_CONSTRAINT, | 
| 29 |  | -    MEME_MEME_SOURCE_RAW_MEME_UNIQUE_CONSTRAINT, | 
| 30 | 30 | ) | 
| 31 | 31 | 
 | 
| 32 | 32 | DATABASE_URL = str(settings.DATABASE_URL) | 
|  | 
| 41 | 41 |     Column("id", Integer, Identity(), primary_key=True), | 
| 42 | 42 |     Column("type", String, nullable=False), | 
| 43 | 43 |     Column("url", String, nullable=False, unique=True), | 
| 44 |  | - | 
| 45 |  | -    Column("status", String, nullable=False),  # in_moderation, parsing_enabled, parsing_disabled | 
| 46 |  | - | 
|  | 44 | +    Column("status", String, nullable=False), | 
| 47 | 45 |     Column("language_code", String, index=True), | 
| 48 |  | - | 
| 49 | 46 |     Column("added_by", ForeignKey("user.id", ondelete="SET NULL")), | 
| 50 |  | - | 
| 51 | 47 |     Column("parsed_at", DateTime), | 
| 52 | 48 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 53 | 49 |     Column("updated_at", DateTime, onupdate=func.now()), | 
|  | 
| 58 | 54 |     "meme_raw_telegram", | 
| 59 | 55 |     metadata, | 
| 60 | 56 |     Column("id", Integer, Identity(), primary_key=True), | 
| 61 |  | -    Column("meme_source_id", ForeignKey("meme_source.id", ondelete="CASCADE"), nullable=False), | 
|  | 57 | +    Column( | 
|  | 58 | +        "meme_source_id", | 
|  | 59 | +        ForeignKey("meme_source.id", ondelete="CASCADE"), | 
|  | 60 | +        nullable=False, | 
|  | 61 | +    ), | 
| 62 | 62 |     Column("post_id", Integer, nullable=False), | 
| 63 |  | - | 
| 64 | 63 |     Column("url", String, nullable=False), | 
| 65 | 64 |     Column("date", DateTime, nullable=False), | 
| 66 | 65 |     Column("content", String), | 
| 67 |  | - | 
| 68 | 66 |     Column("out_links", JSONB), | 
| 69 | 67 |     Column("mentions", JSONB), | 
| 70 | 68 |     Column("hashtags", JSONB), | 
|  | 
| 73 | 71 |     Column("views", Integer, nullable=False), | 
| 74 | 72 |     Column("forwarded_url", String), | 
| 75 | 73 |     Column("link_preview", JSONB), | 
| 76 |  | - | 
| 77 | 74 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 78 | 75 |     Column("updated_at", DateTime, onupdate=func.now()), | 
| 79 |  | - | 
| 80 |  | -    UniqueConstraint("meme_source_id", "post_id", name=MEME_RAW_TELEGRAM_MEME_SOURCE_POST_UNIQUE_CONSTRAINT), | 
|  | 76 | +    UniqueConstraint( | 
|  | 77 | +        "meme_source_id", | 
|  | 78 | +        "post_id", | 
|  | 79 | +        name=MEME_RAW_TELEGRAM_MEME_SOURCE_POST_UNIQUE_CONSTRAINT, | 
|  | 80 | +    ), | 
| 81 | 81 | ) | 
| 82 | 82 | 
 | 
| 83 | 83 | 
 | 
| 84 | 84 | meme_raw_vk = Table( | 
| 85 | 85 |     "meme_raw_vk", | 
| 86 | 86 |     metadata, | 
| 87 | 87 |     Column("id", Integer, Identity(), primary_key=True), | 
| 88 |  | -    Column("meme_source_id", ForeignKey("meme_source.id", ondelete="CASCADE"), nullable=False), | 
|  | 88 | +    Column( | 
|  | 89 | +        "meme_source_id", | 
|  | 90 | +        ForeignKey("meme_source.id", ondelete="CASCADE"), | 
|  | 91 | +        nullable=False, | 
|  | 92 | +    ), | 
| 89 | 93 |     Column("post_id", String, nullable=False), | 
| 90 |  | - | 
| 91 | 94 |     Column("url", String, nullable=False), | 
| 92 | 95 |     Column("content", String), | 
| 93 | 96 |     Column("date", DateTime, nullable=False), | 
| 94 |  | - | 
| 95 | 97 |     Column("media", JSONB), | 
| 96 | 98 |     Column("views", Integer, nullable=False), | 
| 97 | 99 |     Column("likes", Integer, nullable=False), | 
| 98 | 100 |     Column("reposts", Integer, nullable=False), | 
| 99 | 101 |     Column("comments", Integer, nullable=False), | 
| 100 |  | - | 
| 101 | 102 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 102 | 103 |     Column("updated_at", DateTime, onupdate=func.now()), | 
| 103 |  | - | 
| 104 |  | -    UniqueConstraint("meme_source_id", "post_id", name=MEME_RAW_VK_MEME_SOURCE_POST_UNIQUE_CONSTRAINT), | 
|  | 104 | +    UniqueConstraint( | 
|  | 105 | +        "meme_source_id", "post_id", name=MEME_RAW_VK_MEME_SOURCE_POST_UNIQUE_CONSTRAINT | 
|  | 106 | +    ), | 
| 105 | 107 | ) | 
| 106 | 108 | 
 | 
| 107 | 109 | 
 | 
|  | 
| 116 | 118 |     "meme", | 
| 117 | 119 |     metadata, | 
| 118 | 120 |     Column("id", Integer, Identity(), primary_key=True), | 
| 119 |  | -    Column("meme_source_id", ForeignKey("meme_source.id", ondelete="CASCADE"), nullable=False), | 
|  | 121 | +    Column( | 
|  | 122 | +        "meme_source_id", | 
|  | 123 | +        ForeignKey("meme_source.id", ondelete="CASCADE"), | 
|  | 124 | +        nullable=False, | 
|  | 125 | +    ), | 
| 120 | 126 |     Column("raw_meme_id", Integer, nullable=False, index=True), | 
| 121 | 127 |     Column("status", String, nullable=False), | 
| 122 |  | - | 
| 123 | 128 |     Column("type", String, nullable=False, index=True), | 
| 124 | 129 |     Column("telegram_file_id", String), | 
| 125 | 130 |     Column("caption", String), | 
| 126 | 131 |     Column("language_code", String, index=True), | 
| 127 |  | - | 
| 128 | 132 |     Column("ocr_result", JSONB), | 
| 129 | 133 |     Column("duplicate_of", ForeignKey("meme.id", ondelete="SET NULL")), | 
| 130 |  | - | 
| 131 | 134 |     Column("published_at", DateTime, nullable=False), | 
| 132 | 135 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 133 | 136 |     Column("updated_at", DateTime, onupdate=func.now()), | 
| 134 |  | - | 
| 135 |  | -    UniqueConstraint("meme_source_id", "raw_meme_id", name=MEME_MEME_SOURCE_RAW_MEME_UNIQUE_CONSTRAINT), | 
|  | 137 | +    UniqueConstraint( | 
|  | 138 | +        "meme_source_id", | 
|  | 139 | +        "raw_meme_id", | 
|  | 140 | +        name=MEME_MEME_SOURCE_RAW_MEME_UNIQUE_CONSTRAINT, | 
|  | 141 | +    ), | 
| 136 | 142 | ) | 
| 137 | 143 | 
 | 
| 138 | 144 | 
 | 
|  | 
| 146 | 152 |     Column("is_premium", Boolean), | 
| 147 | 153 |     Column("language_code", String),  # IETF language tag from telegram | 
| 148 | 154 |     Column("deep_link", String), | 
| 149 |  | - | 
| 150 |  | -    # Column("first_chat_id", BigInteger, nullable=False),  # chat_id where user first appeared | 
| 151 |  | - | 
| 152 | 155 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 153 | 156 |     Column("updated_at", DateTime, onupdate=func.now()), | 
| 154 | 157 | ) | 
|  | 
| 158 | 161 |     "user", | 
| 159 | 162 |     metadata, | 
| 160 | 163 |     Column("id", BigInteger, primary_key=True), | 
| 161 |  | -    Column("type", String, nullable=False),  # super_user, moderator,  | 
| 162 |  | - | 
|  | 164 | +    Column("type", String, nullable=False),  # super_user, moderator, | 
| 163 | 165 |     Column("created_at", DateTime, server_default=func.now(), nullable=False), | 
| 164 | 166 |     Column("last_active_at", DateTime, onupdate=func.now()), | 
| 165 | 167 |     Column("blocked_bot_at", DateTime), | 
|  | 
| 208 | 210 |     Column("nmemes_sent", Integer, nullable=False, server_default="0"), | 
| 209 | 211 |     Column("nsessions", Integer, nullable=False, server_default="0"), | 
| 210 | 212 |     Column("active_days_count", Integer, nullable=False, server_default="0"), | 
| 211 |  | - | 
| 212 |  | -    Column("updated_at", DateTime, server_default=func.now(), nullable=False, onupdate=func.now()), | 
|  | 213 | +    Column( | 
|  | 214 | +        "updated_at", | 
|  | 215 | +        DateTime, | 
|  | 216 | +        server_default=func.now(), | 
|  | 217 | +        nullable=False, | 
|  | 218 | +        onupdate=func.now(), | 
|  | 219 | +    ), | 
| 213 | 220 | ) | 
| 214 | 221 | 
 | 
| 215 | 222 | 
 | 
| 216 | 223 | user_meme_source_stats = Table( | 
| 217 | 224 |     "user_meme_source_stats", | 
| 218 | 225 |     metadata, | 
| 219 | 226 |     Column("user_id", ForeignKey("user.id", ondelete="CASCADE"), primary_key=True), | 
| 220 |  | -    Column("meme_source_id", ForeignKey("meme_source.id", ondelete="CASCADE"), primary_key=True), | 
|  | 227 | +    Column( | 
|  | 228 | +        "meme_source_id", | 
|  | 229 | +        ForeignKey("meme_source.id", ondelete="CASCADE"), | 
|  | 230 | +        primary_key=True, | 
|  | 231 | +    ), | 
| 221 | 232 |     Column("nlikes", Integer, nullable=False, server_default="0"), | 
| 222 | 233 |     Column("ndislikes", Integer, nullable=False, server_default="0"), | 
| 223 |  | -     | 
| 224 |  | -    Column("updated_at", DateTime, server_default=func.now(), nullable=False, onupdate=func.now()), | 
|  | 234 | +    Column( | 
|  | 235 | +        "updated_at", | 
|  | 236 | +        DateTime, | 
|  | 237 | +        server_default=func.now(), | 
|  | 238 | +        nullable=False, | 
|  | 239 | +        onupdate=func.now(), | 
|  | 240 | +    ), | 
| 225 | 241 | ) | 
| 226 | 242 | 
 | 
| 227 | 243 | 
 | 
|  | 
| 234 | 250 |     Column("nmemes_sent", Integer, nullable=False, server_default="0"), | 
| 235 | 251 |     Column("age_days", Integer, nullable=False, server_default="99999"), | 
| 236 | 252 |     Column("raw_impr_rank", Integer, nullable=False, server_default="99999"), | 
| 237 |  | -    Column("updated_at", DateTime, server_default=func.now(), nullable=False, onupdate=func.now()), | 
|  | 253 | +    Column( | 
|  | 254 | +        "updated_at", | 
|  | 255 | +        DateTime, | 
|  | 256 | +        server_default=func.now(), | 
|  | 257 | +        nullable=False, | 
|  | 258 | +        onupdate=func.now(), | 
|  | 259 | +    ), | 
| 238 | 260 | ) | 
| 239 | 261 | 
 | 
| 240 | 262 | 
 | 
|  | 
0 commit comments