production-evyos-systems-an.../ServicesApi/Validations/response/base.py

194 lines
5.4 KiB
Python

"""
Response handler for PostgreSQL query results.
This module provides a wrapper class for SQLAlchemy query results,
adding convenience methods for accessing data and managing query state.
"""
from typing import Any, Dict, Optional, TypeVar, Generic, Union
from pydantic import BaseModel
from sqlalchemy.orm import Query
T = TypeVar("T")
class PostgresResponse(Generic[T]):
"""
Wrapper for PostgreSQL/SQLAlchemy query results.
Properties:
count: Total count of results
query: Get query object
as_dict: Convert response to dictionary format
"""
def __init__(self, query: Query, base_model: Optional[BaseModel] = None):
self._query = query
self._count: Optional[int] = None
self._base_model: Optional[BaseModel] = base_model
self.single = False
@property
def query(self) -> Query:
"""Get query object."""
return self._query
@property
def data(self) -> Union[list[T], T]:
"""Get query object."""
return self._query.all()
@property
def count(self) -> int:
"""Get query object."""
return self._query.count()
@property
def to_dict(self, **kwargs) -> list[dict]:
"""Get query object."""
if self._base_model:
return [self._base_model(**item.to_dict()).model_dump(**kwargs) for item in self.data]
return [item.to_dict() for item in self.data]
@property
def as_dict(self) -> Dict[str, Any]:
"""Convert response to dictionary format."""
return {
"query": str(self.query),
"count": self.count,
"data": self.to_dict,
}
class PostgresResponseSingle(Generic[T]):
"""
Wrapper for PostgreSQL/SQLAlchemy query results.
Properties:
count: Total count of results
query: Get query object
as_dict: Convert response to dictionary format
data: Get query object
"""
def __init__(self, query: Query, base_model: Optional[BaseModel] = None):
self._query = query
self._count: Optional[int] = None
self._base_model: Optional[BaseModel] = base_model
self.single = True
@property
def query(self) -> Query:
"""Get query object."""
return self._query
@property
def to_dict(self, **kwargs) -> dict:
"""Get query object."""
if self._base_model:
return self._base_model(**self._query.first().to_dict()).model_dump(**kwargs)
return self._query.first().to_dict()
@property
def data(self) -> T:
"""Get query object."""
return self._query.first()
@property
def count(self) -> int:
"""Get query object."""
return self._query.count()
@property
def as_dict(self) -> Dict[str, Any]:
"""Convert response to dictionary format."""
return {"query": str(self.query),"data": self.to_dict, "count": self.count}
class ResultQueryJoin:
"""
ResultQueryJoin
params:
list_of_instrumented_attributes: list of instrumented attributes
query: query object
"""
def __init__(self, list_of_instrumented_attributes, query):
"""Initialize ResultQueryJoin"""
self.list_of_instrumented_attributes = list_of_instrumented_attributes
self._query = query
@property
def query(self):
"""Get query object."""
return self._query
@property
def to_dict(self):
"""Convert response to dictionary format."""
list_of_dictionaries, result = [], dict()
for user_orders_shipping_iter in self.query.all():
for index, instrumented_attribute_iter in enumerate(self.list_of_instrumented_attributes):
result[str(instrumented_attribute_iter)] = user_orders_shipping_iter[index]
list_of_dictionaries.append(result)
return list_of_dictionaries
@property
def count(self):
"""Get count of query."""
return self.query.count()
@property
def data(self):
"""Get query object."""
return self.query.all()
@property
def as_dict(self):
"""Convert response to dictionary format."""
return {"query": str(self.query), "data": self.data, "count": self.count}
class ResultQueryJoinSingle:
"""
ResultQueryJoinSingle
params:
list_of_instrumented_attributes: list of instrumented attributes
query: query object
"""
def __init__(self, list_of_instrumented_attributes, query):
"""Initialize ResultQueryJoinSingle"""
self.list_of_instrumented_attributes = list_of_instrumented_attributes
self._query = query
@property
def query(self):
"""Get query object."""
return self._query
@property
def to_dict(self):
"""Convert response to dictionary format."""
data, result = self.query.first(), dict()
for index, instrumented_attribute_iter in enumerate(self.list_of_instrumented_attributes):
result[str(instrumented_attribute_iter)] = data[index]
return result
@property
def count(self):
"""Get count of query."""
return self.query.count()
@property
def data(self):
"""Get query object."""
return self._query.first()
@property
def as_dict(self):
"""Convert response to dictionary format."""
return {"query": str(self.query), "data": self.data, "count": self.count}