mirror of
				https://github.com/bunny-lab-io/Borealis.git
				synced 2025-10-26 15:41:58 -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)
 | |
| 
 |