from typing import List, Optional from sqlalchemy import CHAR, Computed, ForeignKeyConstraint, Index, LargeBinary, String, TIMESTAMP, VARBINARY, text from sqlalchemy.dialects.mysql import BIGINT, INTEGER, TINYINT from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship import datetime class Base(DeclarativeBase): pass class AccountMessages(Base): __tablename__ = 'account_messages' __table_args__ = ( Index('account', 'account', 'history_id'), ) history_id: Mapped[int] = mapped_column(BIGINT(20), primary_key=True) account: Mapped[bytes] = mapped_column(VARBINARY(64)) class AlertEndpoints(Base): __tablename__ = 'alert_endpoints' __table_args__ = ( Index('ix_alert_endpoints_username', 'username'), Index('url', 'url', unique=True) ) id: Mapped[int] = mapped_column(INTEGER(11), primary_key=True) username: Mapped[Optional[str]] = mapped_column(String(64)) url: Mapped[Optional[str]] = mapped_column(String(2048)) auth: Mapped[Optional[str]] = mapped_column(String(2048)) p256dh: Mapped[Optional[str]] = mapped_column(String(2048)) created_at: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('current_timestamp()')) class Forget(Base): __tablename__ = 'forget' id: Mapped[int] = mapped_column(BIGINT(20), primary_key=True) account: Mapped[bytes] = mapped_column(VARBINARY(64)) class History(Base): __tablename__ = 'history' __table_args__ = ( Index('msgid', 'msgid'), ) msgid: Mapped[int] = mapped_column(BIGINT(20), primary_key=True) data: Mapped[bytes] = mapped_column(LargeBinary) target: Mapped[bytes] = mapped_column(VARBINARY(64)) sender: Mapped[bytes] = mapped_column(VARBINARY(64)) nanotime: Mapped[int] = mapped_column(BIGINT(20)) pm: Mapped[Optional[int]] = mapped_column(TINYINT(1), Computed("(substr(`target`,1,1) <> '#')", persisted=True)) class Metadata(Base): __tablename__ = 'metadata' key_name: Mapped[str] = mapped_column(String(32), primary_key=True) value: Mapped[str] = mapped_column(String(32)) class Uploads(Base): __tablename__ = 'uploads' hash: Mapped[str] = mapped_column(CHAR(64), primary_key=True) expiry: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('(current_timestamp()')) class Users(Base): __tablename__ = 'users' username: Mapped[str] = mapped_column(String(64), primary_key=True) password: Mapped[str] = mapped_column(String(128)) created_at: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('current_timestamp()')) temporary: Mapped[Optional[int]] = mapped_column(TINYINT(1), server_default=text('1')) invite_code: Mapped[Optional[str]] = mapped_column(String(32)) invited_by: Mapped[Optional[str]] = mapped_column(String(64)) sessions: Mapped[List['Sessions']] = relationship('Sessions', back_populates='users') tokens: Mapped[List['Tokens']] = relationship('Tokens', back_populates='users') class Sessions(Base): __tablename__ = 'sessions' __table_args__ = ( ForeignKeyConstraint(['username'], ['users.username'], ondelete='CASCADE', name='sessions_ibfk_1'), Index('ix_sessions_username', 'username') ) id: Mapped[int] = mapped_column(INTEGER(11), primary_key=True) username: Mapped[Optional[str]] = mapped_column(String(64)) hash: Mapped[Optional[str]] = mapped_column(String(128)) expiry: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP) users: Mapped['Users'] = relationship('Users', back_populates='sessions') class Tokens(Base): __tablename__ = 'tokens' __table_args__ = ( ForeignKeyConstraint(['username'], ['users.username'], ondelete='CASCADE', name='token_username_fk'), Index('ix_tokens_username', 'username') ) id: Mapped[int] = mapped_column(INTEGER(11), primary_key=True) username: Mapped[Optional[str]] = mapped_column(String(64)) hash: Mapped[Optional[str]] = mapped_column(String(128)) name: Mapped[Optional[str]] = mapped_column(String(128)) created_at: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('current_timestamp()')) users: Mapped['Users'] = relationship('Users', back_populates='tokens')