from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Float from sqlalchemy.orm import relationship from datetime import datetime from .base import AlchemyBase class UserBalance(AlchemyBase): __tablename__ = 'user_balances' id = Column(Integer, autoincrement=True, primary_key=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) asset_id = Column(Integer, ForeignKey('assets.id'), nullable=False) balance = Column(Float, nullable=False, default=0) updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, foreign_keys=[user_id], back_populates='balances') asset = relationship('Asset', uselist=False, foreign_keys=[asset_id], back_populates='balances') class InternalTransaction(AlchemyBase): __tablename__ = 'internal_transactions' id = Column(Integer, autoincrement=True, primary_key=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) asset_id = Column(Integer, ForeignKey('assets.id'), nullable=False) amount = Column(Float, nullable=False) is_spent = Column(Boolean, nullable=False) # transaction type spent_transaction_id = Column(Integer, ForeignKey('internal_transactions.id'), nullable=True) type = Column(String(256), nullable=False, default="NOT_SPECIFIED") created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, back_populates='internal_transactions', foreign_keys=[user_id]) asset = relationship('Asset', uselist=False, foreign_keys=[asset_id]) spent_transaction = relationship('InternalTransaction', uselist=False, foreign_keys=[spent_transaction_id]) class StarsInvoice(AlchemyBase): __tablename__ = 'stars_invoices' id = Column(Integer, autoincrement=True, primary_key=True) external_id = Column(String(1024), nullable=False) type = Column(String(256), nullable=False) amount = Column(Integer, nullable=False) user_id = Column(Integer, ForeignKey('users.id'), nullable=True) content_hash = Column(String(256), nullable=True) telegram_id = Column(Integer, nullable=True) invoice_url = Column(String(256), nullable=True) paid = Column(Boolean, nullable=False, default=False) paid_at = Column(DateTime, nullable=True) payment_tx_id = Column(String(256), nullable=True) payment_node_id = Column(String(128), nullable=True) payment_node_public_host = Column(String(256), nullable=True) bot_username = Column(String(128), nullable=True) is_remote = Column(Boolean, nullable=False, default=False) created = Column(DateTime, nullable=False, default=datetime.utcnow)