feat(api): add device_type filter to device list endpoint

Operators can now filter the device list by device_type (routeros, snmp)
via ?device_type=snmp query parameter. Enables the frontend type filter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jason Staack
2026-03-22 08:16:57 -05:00
parent 36c0e25aea
commit 1cb869a195
2 changed files with 6 additions and 0 deletions

View File

@@ -91,6 +91,7 @@ async def list_devices(
sort_order: str = Query("desc", description="asc or desc"), sort_order: str = Query("desc", description="asc or desc"),
site_id: Optional[uuid.UUID] = Query(None, description="Filter by site"), site_id: Optional[uuid.UUID] = Query(None, description="Filter by site"),
sector_id: Optional[uuid.UUID] = Query(None, description="Filter by sector"), sector_id: Optional[uuid.UUID] = Query(None, description="Filter by sector"),
device_type: Optional[str] = Query(None, description="Filter by device type (routeros, snmp)"),
current_user: CurrentUser = Depends(get_current_user), current_user: CurrentUser = Depends(get_current_user),
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
) -> DeviceListResponse: ) -> DeviceListResponse:
@@ -110,6 +111,7 @@ async def list_devices(
sort_order=sort_order, sort_order=sort_order,
site_id=site_id, site_id=site_id,
sector_id=sector_id, sector_id=sector_id,
device_type=device_type,
) )
return DeviceListResponse(items=items, total=total, page=page, page_size=page_size) return DeviceListResponse(items=items, total=total, page=page, page_size=page_size)

View File

@@ -229,6 +229,7 @@ async def get_devices(
sort_order: str = "desc", sort_order: str = "desc",
site_id: Optional[uuid.UUID] = None, site_id: Optional[uuid.UUID] = None,
sector_id: Optional[uuid.UUID] = None, sector_id: Optional[uuid.UUID] = None,
device_type: Optional[str] = None,
) -> tuple[list[DeviceResponse], int]: ) -> tuple[list[DeviceResponse], int]:
""" """
Return a paginated list of devices with optional filtering and sorting. Return a paginated list of devices with optional filtering and sorting.
@@ -273,6 +274,9 @@ async def get_devices(
if sector_id: if sector_id:
base_q = base_q.where(Device.sector_id == sector_id) base_q = base_q.where(Device.sector_id == sector_id)
if device_type:
base_q = base_q.where(Device.device_type == device_type)
# Count total before pagination # Count total before pagination
count_q = select(func.count()).select_from(base_q.subquery()) count_q = select(func.count()).select_from(base_q.subquery())
total_result = await db.execute(count_q) total_result = await db.execute(count_q)