edc_connector_client/api/
edrs.rs

1use reqwest::StatusCode;
2
3use crate::{
4    client::EdcConnectorClientInternal,
5    types::{
6        context::{WithContext, WithContextRef},
7        data_address::DataAddress,
8        edr::EndpointDataReferenceEntry,
9        query::Query,
10    },
11    EdcResult,
12};
13
14pub struct EdrApi<'a>(&'a EdcConnectorClientInternal);
15
16impl<'a> EdrApi<'a> {
17    pub(crate) fn new(client: &'a EdcConnectorClientInternal) -> EdrApi<'a> {
18        EdrApi(client)
19    }
20
21    pub async fn get_entry(&self, id: &str) -> EdcResult<EndpointDataReferenceEntry> {
22        let query = Query::builder()
23            .filter("transferProcessId", "=", id)
24            .build();
25
26        self.query(query).await.and_then(|edrs| {
27            edrs.into_iter().next().ok_or_else(|| {
28                crate::Error::ManagementApi(crate::ManagementApiError {
29                    status_code: StatusCode::NOT_FOUND,
30                    error_detail: crate::ManagementApiErrorDetailKind::Raw(format!(
31                        "EDR entry with id {} not found",
32                        id
33                    )),
34                })
35            })
36        })
37    }
38
39    pub async fn get_data_address(&self, id: &str) -> EdcResult<DataAddress> {
40        let url = self.get_endpoint(&[id, "dataaddress"]);
41        self.0
42            .get::<WithContext<DataAddress>>(url)
43            .await
44            .map(|ctx| ctx.inner)
45    }
46
47    pub async fn query(&self, query: Query) -> EdcResult<Vec<EndpointDataReferenceEntry>> {
48        let url = self.get_endpoint(&["request"]);
49        self.0
50            .post::<_, Vec<WithContext<EndpointDataReferenceEntry>>>(
51                url,
52                &WithContextRef::default_context(&query),
53            )
54            .await
55            .map(|results| results.into_iter().map(|ctx| ctx.inner).collect())
56    }
57
58    pub async fn delete(&self, id: &str) -> EdcResult<()> {
59        let url = self.get_endpoint(&[id]);
60        self.0.del(url).await
61    }
62
63    fn get_endpoint(&self, paths: &[&str]) -> String {
64        [self.0.management_url.as_str(), "v3", "edrs"]
65            .into_iter()
66            .chain(paths.iter().copied())
67            .collect::<Vec<_>>()
68            .join("/")
69    }
70}