Files
banban/talkingq-url/banban/service/device.py
2026-05-06 03:33:28 +08:00

74 lines
2.1 KiB
Python

from collections.abc import Mapping
from typing import Any, List
from services.database_service_base import DatabaseServiceBase
from fastapi import HTTPException
from banban.dao.device import DeviceDAO
class DeviceService(DatabaseServiceBase):
def __init__(self):
super().__init__(service_name="device_service")
async def ensure_device_access(self, *, device_id: str, user_id: int) -> None:
db_session = await self.get_session()
try:
dao = DeviceDAO(db_session)
await dao.ensure_device_access(device_id=device_id, user_id=user_id)
finally:
await db_session.close()
async def list_device_messages(
self,
*,
device_id: str,
user_id: int,
cursor: int | None,
limit: int,
) -> List[Mapping[str, Any]]:
db_session = await self.get_session()
try:
dao = DeviceDAO(db_session)
await dao.ensure_device_access(device_id=device_id, user_id=user_id)
return await dao.list_device_messages(
device_id=device_id,
cursor=cursor,
limit=limit,
)
finally:
await db_session.close()
async def get_device_status(
self,
*,
device_id: str,
user_id: int,
) -> Mapping[str, Any]:
db_session = await self.get_session()
try:
dao = DeviceDAO(db_session)
return await dao.get_device_status(device_id=device_id, user_id=user_id)
finally:
await db_session.close()
async def set_device_volume(
self,
*,
device_id: str,
user_id: int,
level: int,
) -> str:
await self.ensure_device_access(device_id=device_id, user_id=user_id)
from handlers.mqtt_handler import TalkingQMQTTService
service = await TalkingQMQTTService.get_instance()
if service is None:
raise HTTPException(status_code=503, detail="MQTT 服务未初始化")
return await service.send_volume_command(device_id, level)
# 创建全局 DeviceService 实例
device_service = DeviceService()