88from mpt_api_client .rql import RQLQuery
99
1010
11- class ServiceBase [Client , Model : BaseModel ]:
11+ class ServiceBase [Client , Model : BaseModel ]: # noqa: WPS214
1212 """Service base with agnostic HTTP client."""
1313
1414 _endpoint : str
@@ -22,11 +22,13 @@ def __init__(
2222 query_rql : RQLQuery | None = None ,
2323 query_order_by : list [str ] | None = None ,
2424 query_select : list [str ] | None = None ,
25+ endpoint_params : dict [str , str ] | None = None ,
2526 ) -> None :
2627 self .http_client = http_client
2728 self .query_rql : RQLQuery | None = query_rql
2829 self .query_order_by = query_order_by
2930 self .query_select = query_select
31+ self .endpoint_params = endpoint_params or {}
3032
3133 def clone (self ) -> Self :
3234 """Create a copy of collection client for immutable operations.
@@ -39,30 +41,40 @@ def clone(self) -> Self:
3941 query_rql = self .query_rql ,
4042 query_order_by = copy .copy (self .query_order_by ) if self .query_order_by else None ,
4143 query_select = copy .copy (self .query_select ) if self .query_select else None ,
44+ endpoint_params = self .endpoint_params ,
4245 )
4346
44- def build_url (self , query_params : dict [str , Any ] | None = None ) -> str : # noqa: WPS210
47+ @property
48+ def endpoint (self ) -> str :
49+ """Service endpoint URL."""
50+ return self ._endpoint .format (** self .endpoint_params )
51+
52+ def build_url (
53+ self ,
54+ query_params : dict [str , Any ] | None = None ,
55+ ) -> str : # noqa: WPS210
4556 """Builds the endpoint URL with all the query parameters.
4657
4758 Returns:
4859 Partial URL with query parameters.
4960 """
5061 query_params = query_params or {}
62+ if self .query_order_by :
63+ query_params .update ({"order" : "," .join (self .query_order_by )})
64+ if self .query_select :
65+ query_params .update ({"select" : "," .join (self .query_select )})
66+
5167 query_parts = [
5268 f"{ param_key } ={ param_value } " for param_key , param_value in query_params .items ()
5369 ]
54- if self .query_order_by :
55- str_order_by = "," .join (self .query_order_by )
56- query_parts .append (f"order={ str_order_by } " )
57- if self .query_select :
58- str_query_select = "," .join (self .query_select )
59- query_parts .append (f"select={ str_query_select } " )
70+
6071 if self .query_rql :
6172 query_parts .append (str (self .query_rql ))
73+
6274 if query_parts :
6375 query = "&" .join (query_parts )
64- return f"{ self ._endpoint } ?{ query } "
65- return self ._endpoint
76+ return f"{ self .endpoint } ?{ query } "
77+ return self .endpoint
6678
6779 def order_by (self , * fields : str ) -> Self :
6880 """Returns new collection with ordering setup.
@@ -109,12 +121,13 @@ def select(self, *fields: str) -> Self:
109121 new_client .query_select = list (fields )
110122 return new_client
111123
112- def _create_collection (self , response : httpx .Response ) -> Collection [Model ]:
124+ @classmethod
125+ def _create_collection (cls , response : httpx .Response ) -> Collection [Model ]:
113126 meta = Meta .from_response (response )
114127 return Collection (
115128 resources = [
116- self ._model_class .new (resource , meta )
117- for resource in response .json ().get (self ._collection_key )
129+ cls ._model_class .new (resource , meta )
130+ for resource in response .json ().get (cls ._collection_key )
118131 ],
119132 meta = meta ,
120133 )
0 commit comments