File size: 1,612 Bytes
ede7942 bced5a1 ede7942 bced5a1 ede7942 11463f1 ede7942 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | """SQLAlchemy ORM models for users and history."""
from datetime import datetime
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String(64), unique=True, index=True, nullable=False)
email = Column(String(255), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
is_premium = Column(Boolean, default=False, nullable=False)
is_admin = Column(Boolean, default=False, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
# Password reset. Only the SHA-256 hash of the token is stored, so a database
# leak cannot be replayed to take over accounts. Both columns are cleared
# once a token is used, making each token single-use.
reset_token_hash = Column(String(64), nullable=True, index=True)
reset_token_expires = Column(DateTime, nullable=True)
history = relationship("HistoryEntry", back_populates="user", cascade="all, delete-orphan")
class HistoryEntry(Base):
__tablename__ = "history"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
tool = Column(String(64), nullable=False)
input_text = Column(Text, nullable=False)
output_text = Column(Text, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
user = relationship("User", back_populates="history")
|