edc_connector_client/api/
edrs.rs1use 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}