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 .types import QueryParam
89from mpt_api_client .models import Collection , ResourceData
910from mpt_api_client .models import Model as BaseModel
1011from mpt_api_client .models .collection import ResourceList
@@ -23,7 +24,11 @@ class AsyncService[Model: BaseModel](ServiceBase[AsyncHTTPClient, Model]): # no
2324 """
2425
2526 async def fetch_page (self , limit : int = 100 , offset : int = 0 ) -> Collection [Model ]:
26- """Fetch one page of resources."""
27+ """Fetch one page of resources.
28+
29+ Returns:
30+ Collection of resources.
31+ """
2732 response = await self ._fetch_page_as_response (limit = limit , offset = offset )
2833 return self ._create_collection (response )
2934
@@ -72,30 +77,32 @@ async def iterate(self, batch_size: int = 100) -> AsyncIterator[Model]:
7277 break
7378 offset = items_collection .meta .pagination .next_offset ()
7479
75- async def create (self , resource_data : ResourceData ) -> Model :
76- """Create a new resource using `POST /endpoint`.
80+ async def get (self , resource_id : str , select : list [str ] | str | None = None ) -> Model :
81+ """Fetch a specific resource using `GET /endpoint/{resource_id}`.
82+
83+ Args:
84+ resource_id: Resource ID.
85+ select: List of fields to select.
7786
7887 Returns:
79- New resource created .
88+ Resource object .
8089 """
81- response = await self .http_client .post (self ._endpoint , json = resource_data )
82- response .raise_for_status ()
90+ if isinstance (select , list ):
91+ select = "," .join (select ) if select else None
92+ return await self ._resource_action (resource_id = resource_id , query_params = {"select" : select })
8393
84- return self ._model_class .from_response (response )
94+ async def update (self , resource_id : str , resource_data : ResourceData ) -> Model :
95+ """Update a resource using `PUT /endpoint/{resource_id}`.
8596
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 )
97+ Args :
98+ resource_id: Resource ID.
99+ resource_data: Resource data.
89100
90- async def update (self , resource_id : str , resource_data : ResourceData ) -> Model :
91- """Update a resource using `PUT /endpoint/{resource_id}`."""
92- return await self ._resource_action (resource_id , "PUT" , json = resource_data )
101+ Returns:
102+ Resource object.
93103
94- async def delete (self , resource_id : str ) -> None :
95- """Delete resource using `DELETE /endpoint/{resource_id}`."""
96- url = urljoin (f"{ self ._endpoint } /" , resource_id )
97- response = await self .http_client .delete (url )
98- response .raise_for_status ()
104+ """
105+ return await self ._resource_action (resource_id , "PUT" , json = resource_data )
99106
100107 async def _fetch_page_as_response (self , limit : int = 100 , offset : int = 0 ) -> httpx .Response :
101108 """Fetch one page of resources.
@@ -118,6 +125,7 @@ async def _resource_do_request(
118125 method : str = "GET" ,
119126 action : str | None = None ,
120127 json : ResourceData | ResourceList | None = None ,
128+ query_params : QueryParam | None = None ,
121129 ) -> httpx .Response :
122130 """Perform an action on a specific resource using.
123131
@@ -129,13 +137,14 @@ async def _resource_do_request(
129137 method: The HTTP method to use.
130138 action: The action name to use.
131139 json: The updated resource data.
140+ query_params: Additional query parameters.
132141
133142 Raises:
134143 HTTPError: If the action fails.
135144 """
136145 resource_url = urljoin (f"{ self ._endpoint } /" , resource_id )
137146 url = urljoin (f"{ resource_url } /" , action ) if action else resource_url
138- response = await self .http_client .request (method , url , json = json )
147+ response = await self .http_client .request (method , url , json = json , params = query_params )
139148 response .raise_for_status ()
140149 return response
141150
@@ -145,7 +154,18 @@ async def _resource_action(
145154 method : str = "GET" ,
146155 action : str | None = None ,
147156 json : ResourceData | ResourceList | None = None ,
157+ query_params : QueryParam | None = None ,
148158 ) -> 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 )
159+ """Perform an action on a specific resource using `HTTP_METHOD /endpoint/{resource_id}`.
160+
161+ Args:
162+ resource_id: The resource ID to operate on.
163+ method: The HTTP method to use.
164+ action: The action name to use.
165+ json: The updated resource data.
166+ query_params: Additional query parameters.
167+ """
168+ response = await self ._resource_do_request (
169+ resource_id , method , action , json = json , query_params = query_params
170+ )
151171 return self ._model_class .from_response (response )
0 commit comments