from typing import Any from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from sqlalchemy import select from sqlalchemy.orm import Session from app.auth.deps import get_current_user from app.auth.service import create_user, find_user_by_token, user_to_dict from app.db.base import get_db from app.db.models import User router = APIRouter(prefix="/auth", tags=["auth"]) class LoginRequest(BaseModel): token: str = Field(min_length=8, max_length=256) class CreateUserRequest(BaseModel): username: str = Field(min_length=2, max_length=64) display_name: str = "" token: str | None = Field(default=None, min_length=8, max_length=256) @router.post("/login") def login(payload: LoginRequest, db: Session = Depends(get_db)) -> dict[str, Any]: user = find_user_by_token(db, payload.token) if not user: raise HTTPException(status_code=401, detail="Неверный токен") return {"ok": True, "user": user_to_dict(user), "token": payload.token.strip()} @router.get("/me") def me(user: User = Depends(get_current_user)) -> dict[str, Any]: return {"ok": True, "user": user_to_dict(user)} @router.get("/users") def list_users( db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, Any]: rows = db.scalars(select(User).where(User.is_active.is_(True)).order_by(User.id)).all() return { "ok": True, "users": [user_to_dict(row) for row in rows], "current_user_id": user.id, } @router.post("/users") def register_user( payload: CreateUserRequest, db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> dict[str, Any]: try: new_user, plain_token = create_user( db, username=payload.username, display_name=payload.display_name, api_token=payload.token, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc return { "ok": True, "user": user_to_dict(new_user), "token": plain_token, "created_by": user.username, }