70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from typing import Optional
|
|
from auth.models import TokenPayload
|
|
from auth.dependencies import require_device_access, require_viewer
|
|
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_viewer),
|
|
):
|
|
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_viewer),
|
|
):
|
|
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_viewer),
|
|
):
|
|
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_device_access),
|
|
):
|
|
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_device_access),
|
|
):
|
|
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_device_access),
|
|
):
|
|
service.delete_device(device_id)
|