from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey, BigInteger, JSON from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship import datetime Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True) created_at = Column(DateTime, default=datetime.datetime.utcnow) accounts = relationship("Account", back_populates="user") files = relationship("File", back_populates="user") class Account(Base): __tablename__ = "accounts" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) google_email = Column(String, unique=True, index=True) credentials = Column(JSON) drive_space_total = Column(BigInteger) drive_space_used = Column(BigInteger) drive_space_reserved = Column(BigInteger, default=1073741824) # 1GB reserved user = relationship("User", back_populates="accounts") file_parts = relationship("FilePart", back_populates="account") class File(Base): __tablename__ = "files" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) filename = Column(String) original_size = Column(BigInteger) sha256 = Column(String) upload_time = Column(DateTime, default=datetime.datetime.utcnow) download_token = Column(String, unique=True, index=True) user = relationship("User", back_populates="files") parts = relationship("FilePart", back_populates="file") class FilePart(Base): __tablename__ = "file_parts" id = Column(Integer, primary_key=True, index=True) file_id = Column(Integer, ForeignKey("files.id")) part_index = Column(Integer) size = Column(BigInteger) account_id = Column(Integer, ForeignKey("accounts.id")) drive_file_id = Column(String) sha256 = Column(String) file = relationship("File", back_populates="parts") account = relationship("Account", back_populates="file_parts")