55
66from mpt_api_client .http .async_client import AsyncHTTPClient
77from mpt_api_client .http .base_service import ServiceBase
8+ from mpt_api_client .http .helper import prepare_query_params
9+ from mpt_api_client .http .types import QueryParam
810from mpt_api_client .models import Collection , ResourceData
911from mpt_api_client .models import Model as BaseModel
1012from mpt_api_client .models .collection import ResourceList
@@ -23,7 +25,11 @@ class AsyncService[Model: BaseModel](ServiceBase[AsyncHTTPClient, Model]): # no
2325 """
2426
2527 async def fetch_page (self , limit : int = 100 , offset : int = 0 ) -> Collection [Model ]:
26- """Fetch one page of resources."""
28+ """Fetch one page of resources.
29+
30+ Returns:
31+ Collection of resources.
32+ """
2733 response = await self ._fetch_page_as_response (limit = limit , offset = offset )
2834 return self ._create_collection (response )
2935
@@ -83,16 +89,39 @@ async def create(self, resource_data: ResourceData) -> Model:
8389
8490 return self ._model_class .from_response (response )
8591
86- async def get (self , resource_id : str ) -> Model :
87- """Fetch a specific resource using `GET /endpoint/{resource_id}`."""
88- return await self ._resource_action (resource_id = resource_id )
92+ async def get (self , resource_id : str , select : list [str ] | str | None = None ) -> Model :
93+ """Fetch a specific resource using `GET /endpoint/{resource_id}`.
94+
95+ Args:
96+ resource_id: Resource ID.
97+ select: List of fields to select.
98+
99+ Returns:
100+ Resource object.
101+ """
102+ if isinstance (select , list ):
103+ select = "," .join (select ) if select else None
104+ return await self ._resource_action (resource_id = resource_id , query_params = {"select" : select })
89105
90106 async def update (self , resource_id : str , resource_data : ResourceData ) -> Model :
91- """Update a resource using `PUT /endpoint/{resource_id}`."""
107+ """Update a resource using `PUT /endpoint/{resource_id}`.
108+
109+ Args:
110+ resource_id: Resource ID.
111+ resource_data: Resource data.
112+
113+ Returns:
114+ Resource object.
115+
116+ """
92117 return await self ._resource_action (resource_id , "PUT" , json = resource_data )
93118
94119 async def delete (self , resource_id : str ) -> None :
95- """Delete resource using `DELETE /endpoint/{resource_id}`."""
120+ """Delete resource using `DELETE /endpoint/{resource_id}`.
121+
122+ Args:
123+ resource_id: Resource ID.
124+ """
96125 url = urljoin (f"{ self ._endpoint } /" , resource_id )
97126 response = await self .http_client .delete (url )
98127 response .raise_for_status ()
@@ -118,6 +147,7 @@ async def _resource_do_request(
118147 method : str = "GET" ,
119148 action : str | None = None ,
120149 json : ResourceData | ResourceList | None = None ,
150+ query_params : QueryParam | None = None ,
121151 ) -> httpx .Response :
122152 """Perform an action on a specific resource using.
123153
@@ -129,13 +159,16 @@ async def _resource_do_request(
129159 method: The HTTP method to use.
130160 action: The action name to use.
131161 json: The updated resource data.
162+ query_params: Additional query parameters.
132163
133164 Raises:
134165 HTTPError: If the action fails.
135166 """
136167 resource_url = urljoin (f"{ self ._endpoint } /" , resource_id )
137168 url = urljoin (f"{ resource_url } /" , action ) if action else resource_url
138- response = await self .http_client .request (method , url , json = json )
169+ response = await self .http_client .request (
170+ method , url , json = json , params = prepare_query_params (query_params )
171+ )
139172 response .raise_for_status ()
140173 return response
141174
@@ -145,7 +178,18 @@ async def _resource_action(
145178 method : str = "GET" ,
146179 action : str | None = None ,
147180 json : ResourceData | ResourceList | None = None ,
181+ query_params : QueryParam | None = None ,
148182 ) -> Model :
149- """Perform an action on a specific resource using `HTTP_METHOD /endpoint/{resource_id}`."""
150- response = await self ._resource_do_request (resource_id , method , action , json = json )
183+ """Perform an action on a specific resource using `HTTP_METHOD /endpoint/{resource_id}`.
184+
185+ Args:
186+ resource_id: The resource ID to operate on.
187+ method: The HTTP method to use.
188+ action: The action name to use.
189+ json: The updated resource data.
190+ query_params: Additional query parameters.
191+ """
192+ response = await self ._resource_do_request (
193+ resource_id , method , action , json = json , query_params = query_params
194+ )
151195 return self ._model_class .from_response (response )
0 commit comments