wag-managment-api-service-v.../Services/MongoDb/Models/response.py

86 lines
2.4 KiB
Python

"""
Response handler for MongoDB query results.
This module provides a wrapper class for MongoDB query results,
adding convenience methods for accessing data and managing query state.
"""
from typing import Any, Dict, List, Optional, TypeVar, Generic, Union
from pymongo.cursor import Cursor
T = TypeVar("T")
class MongoResponse(Generic[T]):
"""
Wrapper for MongoDB query results.
Attributes:
cursor: MongoDB cursor object
first: Whether to return first result only
data: Query results (lazy loaded)
count: Total count of results
"""
def __init__(
self,
cursor: Optional[Cursor] = None,
first: bool = False,
status: bool = True,
message: str = "",
error: Optional[str] = None,
data: Optional[Union[List[T], T]] = None,
):
self._cursor = cursor
self._first = first
self.status = status
self.message = message
self.error = error
self._data: Optional[Union[List[T], T]] = data
self._count: Optional[int] = None
@property
def data(self) -> Union[List[T], T, None]:
"""
Lazy load and return query results.
Returns first item if first=True, otherwise returns all results.
"""
if self._data is None and self._cursor is not None:
results = list(self._cursor)
self._data = results[0] if self._first and results else results
return self._data
@property
def count(self) -> int:
"""Lazy load and return total count of results."""
if self._count is None:
if self._cursor is not None:
self._count = self._cursor.count()
else:
self._count = len(self.all)
return self._count
@property
def all(self) -> List[T]:
"""Get all results as list."""
return (
self.data
if isinstance(self.data, list)
else [self.data] if self.data else []
)
@property
def first(self) -> Optional[T]:
"""Get first result only."""
return self.data if self._first else (self.data[0] if self.data else None)
def as_dict(self) -> Dict[str, Any]:
"""Convert response to dictionary format."""
return {
"status": self.status,
"message": self.message,
"data": self.data,
"count": self.count,
"error": self.error,
}