74 lines
2.1 KiB
Python
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()
|