from fastapi import FastAPI
from fastapi_login import LoginManager, User, PasswordReset
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import sessionmaker, aliased
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class UserModel(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String(255), unique=True)
hashed_password = Column(String(255))
class PasswordResetModel(Base):
__tablename__ = "password_resets"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
token = Column(String(255))
created_at = Column(DateTime)
engine = create_engine("sqlite:///./users.db")
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base.metadata.create_all(engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
app = FastAPI()
login_manager = LoginManager(app, authenticate_user=authenticate_user, user_loader=load_user)
password_reset = PasswordReset(app, token_storage=RedisStorage())
@login_manager.user_loader
def load_user(username: str) -> User | None:
with get_db() as db:
user = db.query(UserModel).filter(UserModel.username == username).first()
return User(id=user.id, username=user.username, hashed_password=user.hashed_password) if user else None