"""This module contains endpoints for admin operations.""" from typing import Annotated from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from todo.database.engine import get_db from todo.schemas import users as userschema from todo.schemas import common as commonschema from todo.crud import users as usercrud from todo.utils.exceptions import NotFoundException, InvalidFilterParameterException from todo.utils.exceptions import create_exception_dict as fmt from todo.dependencies.users import UserSortablePaginationParams import todo.auth.auth as auth auth_handler = auth.AuthHandler() router = APIRouter( prefix="/admin", tags=["admin"], dependencies=[Depends(auth_handler.asset_current_user_is_admin)], ) tag_metadata = { "name": "admin", "description": "Operations for administrators." } @router.post("/users/", response_model=userschema.User) def create_user( user: userschema.UserCreate, db: Session = Depends(get_db), ): # Check if user already exists try: usercrud.read_user_by_email(db, email=user.email) raise HTTPException(400, "A user with this email address is already registered.") except NotFoundException: pass return usercrud.create_user(db=db, user=user) @router.get("/users/", response_model=list[userschema.User]) def read_users( commons: Annotated[UserSortablePaginationParams, Depends(UserSortablePaginationParams)], db: Session = Depends(get_db), ): try: return usercrud.read_users( db=db, skip=commons.skip, limit=commons.limit, sortby=commons.sortby, sortorder=commons.sortorder ) except InvalidFilterParameterException as e: raise HTTPException(400, fmt(str(e))) @router.get("/users/total/", response_model=commonschema.ItemCount) def read_users_count(db: Session = Depends(get_db)): return commonschema.ItemCount(total=usercrud.read_users_count(db=db))