11from urllib .parse import urljoin
22
3- from mpt_api_client .constants import APPLICATION_JSON
43from mpt_api_client .http .async_client import AsyncHTTPClient
54from mpt_api_client .http .base_service import ServiceBase
6- from mpt_api_client .http .types import QueryParam , Response
5+ from mpt_api_client .http .resource_accessor import AsyncResourceAccessor
76from 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
107
118
129class AsyncService [Model : BaseModel ](ServiceBase [AsyncHTTPClient , Model ]): # noqa: WPS214
@@ -21,60 +18,15 @@ class AsyncService[Model: BaseModel](ServiceBase[AsyncHTTPClient, Model]): # no
2118
2219 """
2320
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.
21+ def _resource (self , resource_id : str ) -> AsyncResourceAccessor [Model ]:
22+ """Return an :class:`AsyncResourceAccessor` bound to *resource_id*.
3423
35- Request with action: `HTTP_METHOD /endpoint/{resource_id}/{action}`.
36- Request without action: `HTTP_METHOD /endpoint/{resource_id}`.
24+ Usage::
3725
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.
26+ await self._resource("RES-123").post("complete", json=data)
27+ await self._resource("RES-123").get()
28+ await self._resource("RES-123").put(json=data)
29+ await self._resource("RES-123").delete()
4830 """
4931 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- )
54-
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}`.
64-
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.
71- """
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 )
32+ return AsyncResourceAccessor (self .http_client , resource_url , self ._model_class )
0 commit comments