from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy import Column, ForeignKey, Integer, String, 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(Integer, 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")