from __future__ import annotations from datetime import date, datetime, timedelta from typing import Optional from jose import JWTError, jwt from passlib.context import CryptContext from sqlalchemy.orm import Session from app.config import settings from app.models import Profile, User pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def hash_password(password: str) -> str: return pwd_context.hash(password) def verify_password(password: str, password_hash: str) -> bool: return pwd_context.verify(password, password_hash) def create_access_token(subject: str = "user") -> str: expire = datetime.utcnow() + timedelta(minutes=settings.access_token_expire_minutes) return jwt.encode( {"sub": subject, "exp": expire}, settings.secret_key, algorithm="HS256", ) def decode_token(token: str) -> Optional[str]: try: payload = jwt.decode(token, settings.secret_key, algorithms=["HS256"]) return payload.get("sub") except JWTError: return None def get_or_create_profile(db: Session) -> Profile: profile = db.query(Profile).first() if not profile: profile = Profile() db.add(profile) db.commit() db.refresh(profile) return profile def has_password(db: Session) -> bool: return db.query(User).first() is not None def get_user(db: Session) -> Optional[User]: return db.query(User).first()