fulREST ready

This commit is contained in:
Артём Кокос
2026-02-12 22:21:38 +07:00
parent c7adc24b07
commit 738edd4db9
5 changed files with 132 additions and 69 deletions

17
app/core/database.py Normal file
View File

@@ -0,0 +1,17 @@
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase
DATABASE_URL = "sqlite+aiosqlite:///./ignis.db"
engine = create_async_engine(DATABASE_URL, echo=False)
async_session = async_sessionmaker(engine, expire_on_commit=False)
class Base(DeclarativeBase):
pass
async def init_db():
async with engine.begin() as conn:
# Создает таблицы, если их еще нет
await conn.run_sync(Base.metadata.create_all)

View File

@@ -1,25 +1,25 @@
import logging
from typing import Dict, List, Optional
from app.models.device import Device, Group
from app.models.device import DeviceSchema, GroupModel
logger = logging.getLogger(__name__)
class StateManager:
def __init__(self):
# Храним устройства по MAC (уникальный ID)
self.devices: Dict[str, Device] = {}
# Группы (люстры) по их ID
self.groups: Dict[str, Group] = {}
# Храним устройства как Pydantic объекты
self.devices: Dict[str, DeviceSchema] = {}
# Группы как модели SQLAlchemy
self.groups: Dict[str, GroupModel] = {}
def update_device(self, device_data: dict):
"""Обновляет или добавляет устройство в состояние."""
mac = device_data["mac"]
device = Device(
id=mac,
ip=device_data["ip"],
name=f"WiZ {mac[-4:]}", # Временное имя
room="Default",
# Используем DeviceSchema вместо Device
device = DeviceSchema(
id=mac, ip=device_data["ip"], name=f"WiZ {mac[-4:]}", room="Default"
)
self.devices[mac] = device
@@ -29,10 +29,10 @@ class StateManager:
if not group:
return []
# Извлекаем IP по MAC-адресам, которые хранятся в группе
return [
self.devices[d_id].ip for d_id in group.device_ids if d_id in self.devices
]
# Создаем синглтон для использования во всем приложении
state_manager = StateManager()

View File

@@ -1,15 +1,44 @@
from sqlalchemy import Column, String, JSON, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base
from pydantic import BaseModel
from typing import List, Optional
class Device(BaseModel):
id: str # MAC-адрес или UUID
# --- Таблицы в БД ---
class DeviceModel(Base):
__tablename__ = "devices"
id: Mapped[str] = mapped_column(String, primary_key=True) # MAC
ip: Mapped[str] = mapped_column(String)
name: Mapped[str] = mapped_column(String)
room: Mapped[str] = mapped_column(String, default="Default")
class GroupModel(Base):
__tablename__ = "groups"
id: Mapped[str] = mapped_column(String, primary_key=True)
name: Mapped[str] = mapped_column(String)
device_ids: Mapped[list] = mapped_column(JSON) # Храним список MAC-адресов как JSON
# --- Pydantic модели для API (оставляем для валидации) ---
class DeviceSchema(BaseModel):
id: str
ip: str
name: str
room: str
class Config:
from_attributes = True
class Group(BaseModel):
class GroupCreateSchema(BaseModel):
id: str
name: str
device_ids: List[str] # Список ID устройств, входящих в люстру
macs: List[str]