74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
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,
|
|
}
|