Files
ignis-core/app/api/routes/devices.py
2026-05-16 10:59:31 +07:00

77 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import logging
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import select
from app.api.schemas import RescanResponse
from app.api.deps import verify_token, require_admin
from app.core.database import async_session
from app.core.state import state_manager, discovery_service
from app.models.device import GroupModel, GroupCreateSchema
from app.drivers.wiz import WizDriver
logger = logging.getLogger(__name__)
# Создаем роутер с защитой
router = APIRouter(dependencies=[Depends(verify_token)])
wiz = WizDriver()
@router.get("")
async def get_all_devices():
return state_manager.devices
@router.get("/groups")
async def get_groups():
return state_manager.groups
@router.get("/scenes")
async def get_scenes():
return wiz.SCENES
@router.post("/groups", dependencies=[Depends(require_admin)])
async def create_group(data: GroupCreateSchema):
async with async_session() as session:
existing = await session.get(GroupModel, data.id)
if existing:
raise HTTPException(status_code=400, detail="Группа с таким ID уже есть")
new_group = GroupModel(id=data.id, name=data.name, device_ids=data.macs)
session.add(new_group)
await session.commit()
# Обновляем атрибуты из БД, чтобы избежать DetachedInstanceError
await session.refresh(new_group)
state_manager.groups[data.id] = new_group
return {"status": "created", "group": data.name}
@router.delete("/groups/{group_id}", dependencies=[Depends(require_admin)])
async def delete_group(group_id: str):
async with async_session() as session:
result = await session.execute(
select(GroupModel).where(GroupModel.id == group_id)
)
group = result.scalar_one_or_none()
if not group:
raise HTTPException(status_code=404, detail="Группа не найдена")
await session.delete(group)
await session.commit()
state_manager.groups.pop(group_id, None)
return {"status": "deleted", "id": group_id}
@router.post(
"/rescan",
dependencies=[Depends(require_admin)],
response_model=RescanResponse,
)
async def rescan_network():
summary = await discovery_service.manual_refresh(state_manager)
return {
"status": "ok",
**summary.to_dict(),
}