mirror of
https://github.com/bunny-lab-io/Borealis.git
synced 2025-10-26 15:21:57 -06:00
74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
"""Service exposing CRUD for saved device list views."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import List, Optional
|
|
|
|
from Data.Engine.domain.device_views import DeviceListView
|
|
from Data.Engine.repositories.sqlite.device_view_repository import SQLiteDeviceViewRepository
|
|
|
|
__all__ = ["DeviceViewService"]
|
|
|
|
|
|
class DeviceViewService:
|
|
def __init__(
|
|
self,
|
|
repository: SQLiteDeviceViewRepository,
|
|
*,
|
|
logger: Optional[logging.Logger] = None,
|
|
) -> None:
|
|
self._repo = repository
|
|
self._log = logger or logging.getLogger("borealis.engine.services.device_views")
|
|
|
|
def list_views(self) -> List[DeviceListView]:
|
|
return self._repo.list_views()
|
|
|
|
def get_view(self, view_id: int) -> Optional[DeviceListView]:
|
|
return self._repo.get_view(view_id)
|
|
|
|
def create_view(self, name: str, columns: List[str], filters: dict) -> DeviceListView:
|
|
normalized_name = (name or "").strip()
|
|
if not normalized_name:
|
|
raise ValueError("missing_name")
|
|
if normalized_name.lower() == "default view":
|
|
raise ValueError("reserved")
|
|
return self._repo.create_view(normalized_name, list(columns), dict(filters))
|
|
|
|
def update_view(
|
|
self,
|
|
view_id: int,
|
|
*,
|
|
name: Optional[str] = None,
|
|
columns: Optional[List[str]] = None,
|
|
filters: Optional[dict] = None,
|
|
) -> DeviceListView:
|
|
updates: dict = {}
|
|
if name is not None:
|
|
normalized = (name or "").strip()
|
|
if not normalized:
|
|
raise ValueError("missing_name")
|
|
if normalized.lower() == "default view":
|
|
raise ValueError("reserved")
|
|
updates["name"] = normalized
|
|
if columns is not None:
|
|
if not isinstance(columns, list) or not all(isinstance(col, str) for col in columns):
|
|
raise ValueError("invalid_columns")
|
|
updates["columns"] = list(columns)
|
|
if filters is not None:
|
|
if not isinstance(filters, dict):
|
|
raise ValueError("invalid_filters")
|
|
updates["filters"] = dict(filters)
|
|
if not updates:
|
|
raise ValueError("no_fields")
|
|
return self._repo.update_view(
|
|
view_id,
|
|
name=updates.get("name"),
|
|
columns=updates.get("columns"),
|
|
filters=updates.get("filters"),
|
|
)
|
|
|
|
def delete_view(self, view_id: int) -> bool:
|
|
return self._repo.delete_view(view_id)
|
|
|