7:from fastapi import APIRouter, Depends, HTTPException, Request, Response
53:@router.post("/register", status_code=201)
55:                   db: AsyncSession = Depends(get_db)):
70:@router.post("/login")
72:                db: AsyncSession = Depends(get_db)):
85:@router.post("/logout")
92:@router.get("/me")
93:async def me(user=Depends(get_current_user)):
116:@router.get("/google/start")
117:async def google_start(request: Request, user=Depends(get_current_user)):
121:@router.get("/google/callback")
123:                          db: AsyncSession = Depends(get_db)):
===
"""Authentication: user register/login (JWT in HttpOnly cookie), Google OAuth 2.0 flow."""
import json
import secrets
from datetime import datetime, timezone

import redis as redis_lib
from fastapi import APIRouter, Depends, HTTPException, Request, Response
from fastapi.responses import HTMLResponse, RedirectResponse
from pydantic import BaseModel, EmailStr, Field
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_current_user, get_db
from app.core.config import settings
from app.core.security import (create_access_token, hash_password, log_audit,
                               verify_password)
from app.db.session import AsyncSessionLocal
from app.models import User
from app.services import gmail_service

router = APIRouter(prefix="/auth", tags=["auth"])

try:
    _oauth_redis = redis_lib.from_url(settings.REDIS_URL, socket_timeout=2)
except Exception:
    _oauth_redis = None


class RegisterIn(BaseModel):
    email: EmailStr
    password: str = Field(min_length=10, max_length=128)
    full_name: str = ""


class LoginIn(BaseModel):
    email: EmailStr
    password: str


def _set_session_cookie(response: Response, token: str) -> None:
