60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""HTTP boundary for the Internal Alpha Miner Detail overview."""
|
|
|
|
from typing import Annotated
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Response, status
|
|
|
|
from app.identity import require_permission, user_has_permission
|
|
from app.inventory.exceptions import MinerNotFound
|
|
from app.miner_detail.dependencies import get_miner_detail_service
|
|
from app.miner_detail.models import (
|
|
MinerDetailAccess,
|
|
MinerDetailOverviewResponse,
|
|
)
|
|
from app.miner_detail.service import MinerDetailService
|
|
|
|
|
|
router = APIRouter(prefix="/api/miners", tags=["miners"])
|
|
MinerDetailUser = Annotated[dict, Depends(require_permission("miners.view"))]
|
|
MinerDetailServiceDependency = Annotated[
|
|
MinerDetailService,
|
|
Depends(get_miner_detail_service),
|
|
]
|
|
|
|
|
|
@router.get(
|
|
"/{miner_id}/overview",
|
|
response_model=MinerDetailOverviewResponse,
|
|
)
|
|
def get_miner_detail_overview(
|
|
miner_id: UUID,
|
|
current_user: MinerDetailUser,
|
|
service: MinerDetailServiceDependency,
|
|
response: Response,
|
|
) -> MinerDetailOverviewResponse:
|
|
response.headers["Cache-Control"] = "no-store"
|
|
try:
|
|
return service.get_overview(
|
|
miner_id,
|
|
MinerDetailAccess(
|
|
can_view_locations=user_has_permission(
|
|
current_user, "locations.view"
|
|
),
|
|
can_read_repairs=user_has_permission(
|
|
current_user, "repairs.read"
|
|
),
|
|
can_view_repairs=user_has_permission(
|
|
current_user, "repairs.view"
|
|
),
|
|
can_read_components=user_has_permission(
|
|
current_user, "components.read"
|
|
),
|
|
),
|
|
)
|
|
except MinerNotFound as exc:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="Miner not found",
|
|
) from exc
|