from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy import ( Column, ForeignKey, Integer, String, BigInteger, Float, Boolean, UniqueConstraint, ) from sqlalchemy.orm import relationship Base = declarative_base(cls=AsyncAttrs) class User(Base): """User model.""" __tablename__ = "users" id = Column(Integer, primary_key=True, autoincrement=True) tg_id = Column(BigInteger, nullable=False, unique=True) username = Column(String, nullable=False) user_api = relationship( "UserApi", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, uselist=False, ) user_symbol = relationship( "UserSymbol", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, uselist=False, ) user_additional_settings = relationship( "UserAdditionalSettings", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, uselist=False, ) user_risk_management = relationship( "UserRiskManagement", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, uselist=False, ) user_conditional_settings = relationship( "UserConditionalSettings", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, uselist=False, ) user_deals = relationship( "UserDeals", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, ) user_auto_trading = relationship( "UserAutoTrading", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, ) class UserApi(Base): """User API model.""" __tablename__ = "user_api" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True ) api_key = Column(String, nullable=False) api_secret = Column(String, nullable=False) user = relationship("User", back_populates="user_api") class UserSymbol(Base): """User symbol model.""" __tablename__ = "user_symbol" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True ) symbol = Column(String, nullable=False, default="BTCUSDT") user = relationship("User", back_populates="user_symbol") class UserAdditionalSettings(Base): """User additional settings model.""" __tablename__ = "user_additional_settings" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True ) trade_mode = Column(String, nullable=False, default="Merged_Single") switch_side = Column(String, nullable=False, default="По направлению") trigger_price = Column(Float, nullable=False, default=0.0) margin_type = Column(String, nullable=False, default="ISOLATED_MARGIN") leverage = Column(String, nullable=False, default="10") order_quantity = Column(Float, nullable=False, default=5.0) martingale_factor = Column(Float, nullable=False, default=1.0) max_bets_in_series = Column(Integer, nullable=False, default=1) user = relationship("User", back_populates="user_additional_settings") class UserRiskManagement(Base): """User risk management model.""" __tablename__ = "user_risk_management" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True ) take_profit_percent = Column(Float, nullable=False, default=1) stop_loss_percent = Column(Float, nullable=False, default=1) commission_fee = Column(String, nullable=False, default="Yes_commission_fee") user = relationship("User", back_populates="user_risk_management") class UserConditionalSettings(Base): """User conditional settings model.""" __tablename__ = "user_conditional_settings" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True ) timer_start = Column(Integer, nullable=False, default=0) timer_end = Column(Integer, nullable=False, default=0) user = relationship("User", back_populates="user_conditional_settings") class UserDeals(Base): """User deals model.""" __tablename__ = "user_deals" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) current_step = Column(Integer, nullable=True) symbol = Column(String, nullable=True) trade_mode = Column(String, nullable=True) base_quantity = Column(Float, nullable=True) margin_type = Column(String, nullable=True) leverage = Column(String, nullable=True) last_side = Column(String, nullable=True) closed_side = Column(String, nullable=True) order_quantity = Column(Float, nullable=True) martingale_factor = Column(Float, nullable=True) max_bets_in_series = Column(Integer, nullable=True) take_profit_percent = Column(Integer, nullable=True) stop_loss_percent = Column(Integer, nullable=True) trigger_price = Column(Float, nullable=True) user = relationship("User", back_populates="user_deals") __table_args__ = (UniqueConstraint("user_id", "symbol", name="uq_user_symbol"),) class UserAutoTrading(Base): """User auto trading model.""" __tablename__ = "user_auto_trading" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) symbol = Column(String, nullable=True) auto_trading = Column(Boolean, nullable=True) fee = Column(Float, nullable=True) total_fee = Column(Float, nullable=True) user = relationship("User", back_populates="user_auto_trading")