from fastapi import APIRouter, Depends, Query from typing import Optional from auth.models import TokenPayload from auth.dependencies import require_permission from devices.models import ( DeviceCreate, DeviceUpdate, DeviceInDB, DeviceListResponse, DeviceUsersResponse, DeviceUserInfo, ) from devices import service router = APIRouter(prefix="/api/devices", tags=["devices"]) @router.get("", response_model=DeviceListResponse) async def list_devices( search: Optional[str] = Query(None), online: Optional[bool] = Query(None), tier: Optional[str] = Query(None), _user: TokenPayload = Depends(require_permission("devices", "view")), ): devices = service.list_devices( search=search, online_only=online, subscription_tier=tier, ) return DeviceListResponse(devices=devices, total=len(devices)) @router.get("/{device_id}", response_model=DeviceInDB) async def get_device( device_id: str, _user: TokenPayload = Depends(require_permission("devices", "view")), ): return service.get_device(device_id) @router.get("/{device_id}/users", response_model=DeviceUsersResponse) async def get_device_users( device_id: str, _user: TokenPayload = Depends(require_permission("devices", "view")), ): users_data = service.get_device_users(device_id) users = [DeviceUserInfo(**u) for u in users_data] return DeviceUsersResponse(users=users, total=len(users)) @router.post("", response_model=DeviceInDB, status_code=201) async def create_device( body: DeviceCreate, _user: TokenPayload = Depends(require_permission("devices", "add")), ): return service.create_device(body) @router.put("/{device_id}", response_model=DeviceInDB) async def update_device( device_id: str, body: DeviceUpdate, _user: TokenPayload = Depends(require_permission("devices", "edit")), ): return service.update_device(device_id, body) @router.delete("/{device_id}", status_code=204) async def delete_device( device_id: str, _user: TokenPayload = Depends(require_permission("devices", "delete")), ): service.delete_device(device_id)