edc_dataplane_core/core/model/
transfer.rs

1use bon::Builder;
2use sqlx::{prelude::FromRow, types::Json};
3
4use crate::signaling::DataAddress;
5
6#[derive(Builder, Clone, Debug, FromRow, PartialEq)]
7pub struct Transfer {
8    pub id: String,
9    pub participant_id: String,
10    pub status: TransferStatus,
11    #[builder(into)]
12    pub source: Json<DataAddress>,
13    #[builder(default)]
14    pub created_at: chrono::DateTime<chrono::Utc>,
15    #[builder(default)]
16    pub updated_at: chrono::DateTime<chrono::Utc>,
17}
18
19#[derive(Clone, Debug, sqlx::Type, PartialEq)]
20pub enum TransferStatus {
21    Started,
22    Suspended,
23}
24
25pub mod types {
26    use axum::http::Uri;
27
28    use crate::{core::model::namespace::EDC_NAMESPACE, signaling::DataAddress};
29
30    pub enum TransferKind {
31        HttpData(HttpData),
32    }
33
34    impl TryFrom<&DataAddress> for TransferKind {
35        type Error = anyhow::Error;
36
37        fn try_from(value: &DataAddress) -> Result<Self, Self::Error> {
38            match value.endpoint_type.as_str() {
39                "HttpData" => Ok(TransferKind::HttpData(HttpData::try_from(value)?)),
40                kind if kind == EDC_NAMESPACE.to_iri("HttpData") => {
41                    Ok(TransferKind::HttpData(HttpData::try_from(value)?))
42                }
43                _ => Err(anyhow::anyhow!("Unsupported endpoint type")),
44            }
45        }
46    }
47
48    pub struct HttpData {
49        pub base_url: Uri,
50        pub proxy_path: bool,
51        pub proxy_method: bool,
52        pub proxy_query_params: bool,
53    }
54
55    impl TryFrom<&DataAddress> for HttpData {
56        type Error = anyhow::Error;
57
58        fn try_from(value: &DataAddress) -> Result<Self, Self::Error> {
59            Ok(Self {
60                base_url: value
61                    .get_property(&EDC_NAMESPACE.to_iri("baseUrl"))
62                    .map(|url| url.parse::<Uri>())
63                    .ok_or_else(|| anyhow::anyhow!("Missing base url"))??,
64                proxy_path: get_bool_property(value, "proxyPath"),
65                proxy_method: get_bool_property(value, "proxyMethod"),
66                proxy_query_params: get_bool_property(value, "proxyQueryParams"),
67            })
68        }
69    }
70
71    fn get_bool_property(value: &DataAddress, property: &str) -> bool {
72        value
73            .get_property(&EDC_NAMESPACE.to_iri(property))
74            .map(|v| v.parse::<bool>())
75            .unwrap_or_else(|| Ok(false))
76            .unwrap_or(false)
77    }
78}