from fastapi import Depends, HTTPException from fastapi.security import OAuth2PasswordBearer from jose import JWTError, jwt from datetime import datetime, timedelta from passlib.context import CryptContext from models.user import User from core.database import get_db from sqlalchemy.orm import Session from typing import Optional # OAuth2 scheme oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login") # Password hashing pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") SECRET_KEY = "demo-secret-key" ALGORITHM = "HS256" def get_password_hash(password: str): return pwd_context.hash(password) def verify_password(plain_password: str, hashed_password: str): return pwd_context.verify(plain_password, hashed_password) def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=15) to_encode.update({"exp": expire}) return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) async def get_current_user_demo( token: str = Depends(oauth2_scheme), db: Session = Depends(get_db) ): credentials_exception = HTTPException( status_code=401, detail="Could not validate credentials" ) try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) user_id: str = payload.get("sub") if user_id is None: raise credentials_exception except JWTError: raise credentials_exception user = db.query(User).filter(User.id == user_id).first() if not user: raise credentials_exception return user