Source code for fmn.api.handlers.admin

# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT

import logging

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from ...database.model import Rule, User
from ...messages.rule import RuleUpdateV1
from .. import api_models
from ..auth import Identity, get_identity_admin
from ..database import gen_db_session
from ..messaging import publish

log = logging.getLogger(__name__)

router = APIRouter(prefix="/admin")


[docs]@router.get("/rules", response_model=list[api_models.Rule], tags=["users/rules"]) async def get_rules( disabled: bool | None = None, username: str | None = None, identity: Identity = Depends(get_identity_admin), db_session: AsyncSession = Depends(gen_db_session), ): query = Rule.select_related() if disabled is not None: query = query.filter_by(disabled=disabled) if username is not None: query = query.filter(Rule.user.has(name=username)) query = query.order_by(Rule.id) db_result = await db_session.execute(query) return db_result.scalars().all()
[docs]@router.get("/users", response_model=list[api_models.User], tags=["users/rules"]) async def get_users( search: str = None, identity: Identity = Depends(get_identity_admin), db_session: AsyncSession = Depends(gen_db_session), ): query = select(User) if search is not None: query = query.where(User.name.contains(search)) db_result = await db_session.execute(query) return db_result.scalars().all()
[docs]@router.patch("/rules/{id}", response_model=api_models.Rule, tags=["users/rules"]) async def patch_rule( id: int, rule: api_models.RulePatch, identity: Identity = Depends(get_identity_admin), db_session: AsyncSession = Depends(gen_db_session), ): rule_db = (await db_session.execute(Rule.select_related().filter(Rule.id == id))).scalar() if not rule_db: raise HTTPException(status_code=404, detail=f"Rule with ID: {id} not found") if rule.disabled is not None: rule_db.disabled = rule.disabled await db_session.commit() message = RuleUpdateV1( body={ "rule": api_models.Rule.from_orm(rule_db).dict(), "user": api_models.User.from_orm(rule_db.user).dict(), } ) await publish(message) return rule_db