# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/finance_admin.py """ Finance Admin API endpoints for managing Issuers with strict RBAC protection. Protected by DB-driven RequirePermission("finance:view") dependency. """ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from typing import List from app.api import deps from app.models.identity import User from app.models.marketplace.finance import Issuer from app.schemas.finance import IssuerResponse, IssuerUpdate router = APIRouter() @router.get("/", response_model=List[IssuerResponse], tags=["finance-admin"]) async def list_issuers( db: AsyncSession = Depends(deps.get_db), current_user: User = Depends(deps.get_current_active_user), _ = Depends(deps.RequirePermission("finance:view")), ): """ List all Issuers (billing entities). Protected by RequirePermission("finance:view"). """ result = await db.execute(select(Issuer).order_by(Issuer.id)) issuers = result.scalars().all() return issuers @router.patch("/{issuer_id}", response_model=IssuerResponse, tags=["finance-admin"]) async def update_issuer( issuer_id: int, issuer_update: IssuerUpdate, db: AsyncSession = Depends(deps.get_db), current_user: User = Depends(deps.get_current_active_user), _ = Depends(deps.RequirePermission("finance:edit")), ): """ Update an Issuer's details (activate/deactivate, revenue limit, API config). Protected by RequirePermission("finance:edit"). """ result = await db.execute(select(Issuer).where(Issuer.id == issuer_id)) issuer = result.scalar_one_or_none() if not issuer: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Issuer with ID {issuer_id} not found." ) # Update fields if provided update_data = issuer_update.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(issuer, field, value) await db.commit() await db.refresh(issuer) return issuer