USAMA BHATTI
Feat: Added Visual Search, API Key Auth, and Docker Optimization
ba2fc46
# backend/src/api/routes/auth.py
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from pydantic import BaseModel, EmailStr
from backend.src.db.session import get_db
from backend.src.models.user import User
# generate_api_key ko import kiya πŸ‘‡
from backend.src.utils.auth import get_password_hash, verify_password, create_access_token, generate_api_key
router = APIRouter()
# --- Schemas ---
class UserCreate(BaseModel):
email: EmailStr
password: str
full_name: str | None = None
# Response model ko extend kiya taake registration par API Key nazar aaye
class RegistrationResponse(BaseModel):
access_token: str
token_type: str
api_key: str # User ko registeration par hi uski chabi mil jayegi πŸ”‘
class Token(BaseModel):
access_token: str
token_type: str
# --- 1. Registration Endpoint ---
@router.post("/auth/register", response_model=RegistrationResponse)
async def register(user_in: UserCreate, db: AsyncSession = Depends(get_db)):
# Check agar email pehle se exist karta hai
result = await db.execute(select(User).where(User.email == user_in.email))
existing_user = result.scalars().first()
if existing_user:
raise HTTPException(
status_code=400,
detail="Email already registered"
)
# Naya User Banao + API Key Generate Karo (πŸ”)
new_user = User(
email=user_in.email,
hashed_password=get_password_hash(user_in.password),
full_name=user_in.full_name,
api_key=generate_api_key(), # <--- Yeh line jadoo karegi
allowed_domains="*" # Default: Har jagah allow karo, user baad mein settings se lock kar lega
)
db.add(new_user)
await db.commit()
await db.refresh(new_user)
# Direct Login Token do
access_token = create_access_token(data={"sub": str(new_user.id)})
return {
"access_token": access_token,
"token_type": "bearer",
"api_key": new_user.api_key # Registeration ke waqt hi key show kar di
}
# --- 2. Login Endpoint ---
@router.post("/auth/login", response_model=Token)
async def login(form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)):
result = await db.execute(select(User).where(User.email == form_data.username))
user = result.scalars().first()
if not user or not verify_password(form_data.password, user.hashed_password):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect email or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token(data={"sub": str(user.id)})
return {"access_token": access_token, "token_type": "bearer"}