from datetime import datetime, timedelta from typing import Optional from jose import JWTError, jwt from passlib.context import CryptContext from sqlalchemy.orm import Session from ..models.user import User from ..config import settings pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def hash_password(password: str) -> str: return pwd_context.hash(password) def verify_password(plain: str, hashed: str) -> bool: return pwd_context.verify(plain, hashed) def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str: to_encode = data.copy() expire = datetime.utcnow() + (expires_delta or timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)) to_encode["exp"] = expire return jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) def decode_token(token: str) -> Optional[dict]: try: return jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) except JWTError: return None def get_user_by_email(db: Session, email: str) -> Optional[User]: return db.query(User).filter(User.email == email).first() def get_user_by_id(db: Session, user_id: int) -> Optional[User]: return db.query(User).filter(User.id == user_id).first() def create_user(db: Session, full_name: str, email: Optional[str], phone: Optional[str], password: str) -> User: user = User( full_name=full_name, email=email, phone=phone, hashed_password=hash_password(password), ) db.add(user) db.commit() db.refresh(user) return user def get_or_create_oauth_user(db: Session, provider: str, oauth_id: str, email: Optional[str], full_name: Optional[str]) -> User: user = db.query(User).filter(User.oauth_provider == provider, User.oauth_id == oauth_id).first() if user: return user if email: user = db.query(User).filter(User.email == email).first() if user: user.oauth_provider = provider user.oauth_id = oauth_id db.commit() db.refresh(user) return user user = User( full_name=full_name or "Usuario", email=email, oauth_provider=provider, oauth_id=oauth_id, ) db.add(user) db.commit() db.refresh(user) return user