edc_dataplane_core/core/model/
transfer.rs1use 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}