1- from urllib .parse import urljoin
2-
3- from mpt_api_client .constants import APPLICATION_JSON
41from mpt_api_client .http .async_client import AsyncHTTPClient
52from mpt_api_client .http .base_service import ServiceBase
6- from mpt_api_client .http .types import QueryParam , Response
3+ from mpt_api_client .http .resource_accessor import AsyncResourceAccessor
4+ from mpt_api_client .http .url_utils import join_url_path
75from mpt_api_client .models import Model as BaseModel
8- from mpt_api_client .models import ResourceData
9- from mpt_api_client .models .collection import ResourceList
106
117
128class AsyncService [Model : BaseModel ](ServiceBase [AsyncHTTPClient , Model ]): # noqa: WPS214
@@ -21,60 +17,15 @@ class AsyncService[Model: BaseModel](ServiceBase[AsyncHTTPClient, Model]): # no
2117
2218 """
2319
24- async def _resource_do_request ( # noqa: WPS211
25- self ,
26- resource_id : str ,
27- method : str = "GET" ,
28- action : str | None = None ,
29- json : ResourceData | ResourceList | None = None ,
30- query_params : QueryParam | None = None ,
31- headers : dict [str , str ] | None = None ,
32- ) -> Response :
33- """Perform an action on a specific resource using.
34-
35- Request with action: `HTTP_METHOD /endpoint/{resource_id}/{action}`.
36- Request without action: `HTTP_METHOD /endpoint/{resource_id}`.
37-
38- Args:
39- resource_id: The resource ID to operate on.
40- method: The HTTP method to use.
41- action: The action name to use.
42- json: The updated resource data.
43- query_params: Additional query parameters.
44- headers: Additional headers.
45-
46- Raises:
47- HTTPError: If the action fails.
48- """
49- resource_url = urljoin (f"{ self .path } /" , resource_id )
50- url = urljoin (f"{ resource_url } /" , action ) if action else resource_url
51- return await self .http_client .request (
52- method , url , json = json , query_params = query_params , headers = headers
53- )
20+ def _resource (self , resource_id : str ) -> AsyncResourceAccessor [Model ]:
21+ """Return an :class:`AsyncResourceAccessor` bound to *resource_id*.
5422
55- async def _resource_action (
56- self ,
57- resource_id : str ,
58- method : str = "GET" ,
59- action : str | None = None ,
60- json : ResourceData | ResourceList | None = None ,
61- query_params : QueryParam | None = None ,
62- ) -> Model :
63- """Perform an action on a specific resource using `HTTP_METHOD /endpoint/{resource_id}`.
23+ Usage::
6424
65- Args:
66- resource_id: The resource ID to operate on.
67- method: The HTTP method to use.
68- action: The action name to use.
69- json: The updated resource data.
70- query_params: Additional query parameters.
25+ await self._resource("RES-123").post("complete", json=data)
26+ await self._resource("RES-123").get()
27+ await self._resource("RES-123").put(json=data)
28+ await self._resource("RES-123").delete()
7129 """
72- response = await self ._resource_do_request (
73- resource_id ,
74- method ,
75- action ,
76- json = json ,
77- query_params = query_params ,
78- headers = {"Accept" : APPLICATION_JSON },
79- )
80- return self ._model_class .from_response (response )
30+ resource_url = join_url_path (self .path , resource_id )
31+ return AsyncResourceAccessor (self .http_client , resource_url , self ._model_class )
0 commit comments