30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import UTC, datetime
|
|
|
|
from fastapi import HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.config import settings
|
|
from app.core.security import create_access_token, verify_password
|
|
from app.models.user import User
|
|
from app.repositories.domain import UserRepository
|
|
|
|
|
|
class AuthService:
|
|
def __init__(self, session: Session) -> None:
|
|
self.users = UserRepository(session)
|
|
|
|
def login(self, email: str, password: str) -> tuple[str, User]:
|
|
user = self.users.by_email(email)
|
|
if user is None or not verify_password(password, user.password_hash):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Invalid credentials",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
if not user.is_active:
|
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Inactive user")
|
|
user.last_login_at = datetime.now(UTC)
|
|
self.users.session.commit()
|
|
return create_access_token(user.id, user.role), user
|