Skip to main content

edc_web_components/models/
asset_item.rs

1use crate::models::dataset_extra_fields::DatasetExtraFields;
2use crate::models::{Creator, Thumbnail};
3use edc_connector_client::types::asset::Asset;
4use edc_connector_client::types::catalog::Dataset;
5use edc_connector_client::types::data_address::DataAddress;
6use edc_connector_client::types::properties::{Properties, PropertyValue};
7
8#[derive(Clone, Debug, PartialEq)]
9pub struct AssetItem {
10  pub id: String,
11  pub name: String,
12  pub version: Option<semver::Version>,
13  pub description: Option<String>,
14  pub creator: Option<Creator>,
15  pub thumbnail: Option<Thumbnail>,
16  pub keywords: Vec<String>,
17  pub dcterm_types: Vec<String>,
18  pub base_url: String,
19  pub proxy_path: bool,
20  pub proxy_query_params: bool,
21  pub proxy_method: bool,
22  pub proxy_body: bool,
23}
24
25impl From<Asset> for AssetItem {
26  fn from(asset: Asset) -> Self {
27    let id = asset.id().to_string();
28    let name = get_property(asset.properties(), "name");
29    let description = asset
30      .properties()
31      .get::<String>("http://www.w3.org/2000/01/rdf-schema#comment")
32      .unwrap_or_default();
33
34    let version = asset
35      .properties()
36      .get::<String>("http://www.w3.org/ns/dcat#version")
37      .unwrap_or_default()
38      .and_then(|version| semver::Version::parse(version.as_str()).ok());
39
40    let creator = asset
41      .properties()
42      .get_raw("http://purl.org/dc/terms/creator")
43      .and_then(|property_value| serde_json::from_value::<Creator>(property_value.0.clone()).ok());
44
45    let thumbnail = asset
46      .properties()
47      .get_raw("http://xmlns.com/foaf/0.1/thumbnail")
48      .and_then(|property_value| {
49        serde_json::from_value::<Thumbnail>(property_value.0.clone()).ok()
50      });
51
52    let keywords = asset
53      .properties()
54      .get_raw("http://www.w3.org/ns/dcat#keyword")
55      .and_then(|property_value| {
56        serde_json::from_value::<Vec<String>>(property_value.0.clone()).ok()
57      })
58      .unwrap_or_default();
59
60    let dcterm_types = asset
61      .properties()
62      .get_raw("http://purl.org/dc/terms/type")
63      .and_then(|property_value| {
64        if let Ok(value) = PropertyValue::try_from(property_value) {
65          Some(vec![value])
66        } else {
67          serde_json::from_value::<Vec<String>>(property_value.0.clone()).ok()
68        }
69      })
70      .unwrap_or_default();
71
72    let base_url = asset
73      .data_address()
74      .property("baseUrl")
75      .unwrap_or_default()
76      .unwrap_or_default();
77
78    let proxy_path = get_boolean_property(asset.data_address(), "proxyPath");
79    let proxy_query_params = get_boolean_property(asset.data_address(), "proxyQueryParams");
80    let proxy_method = get_boolean_property(asset.data_address(), "proxyMethod");
81    let proxy_body = get_boolean_property(asset.data_address(), "proxyBody");
82
83    AssetItem {
84      id,
85      name,
86      version,
87      description,
88      creator,
89      thumbnail,
90      keywords,
91      dcterm_types,
92      base_url,
93      proxy_path,
94      proxy_query_params,
95      proxy_method,
96      proxy_body,
97    }
98  }
99}
100
101impl From<edc_federated_catalog_client::models::Dataset> for AssetItem {
102  fn from(dataset: edc_federated_catalog_client::models::Dataset) -> Self {
103    Self {
104      id: dataset.id.clone(),
105      name: dataset.name,
106      version: dataset
107        .version
108        .and_then(|version| semver::Version::parse(&version).ok()),
109      description: dataset.description,
110      creator: dataset.creator.map(|creator| Creator {
111        name: Some(creator.name),
112        thumbnail: Some(Thumbnail {
113          resource: Some(creator.thumbnail.resource),
114        }),
115      }),
116      thumbnail: dataset.thumbnail.map(|thumbnail| Thumbnail {
117        resource: Some(thumbnail.resource),
118      }),
119      keywords: dataset.keywords,
120      dcterm_types: vec!["ABC".to_string()],
121      base_url: "".to_string(),
122      proxy_path: false,
123      proxy_query_params: false,
124      proxy_method: false,
125      proxy_body: false,
126    }
127  }
128}
129
130impl From<&Dataset<DatasetExtraFields>> for AssetItem {
131  fn from(dataset: &Dataset<DatasetExtraFields>) -> Self {
132    let id = dataset.id().to_string();
133    let extra = &dataset.extra;
134
135    Self {
136      id,
137      name: extra.name.clone(),
138      version: extra
139        .version
140        .as_ref()
141        .and_then(|version| semver::Version::parse(version).ok()),
142      description: extra.description.to_owned(),
143      creator: extra.creator.as_ref().map(|creator| Creator {
144        name: Some(creator.name.to_owned()),
145        thumbnail: Some(Thumbnail {
146          resource: Some(creator.thumbnail.resource.to_owned()),
147        }),
148      }),
149      thumbnail: extra.thumbnail.as_ref().map(|thumbnail| Thumbnail {
150        resource: Some(thumbnail.resource.to_owned()),
151      }),
152      keywords: extra.keywords.clone(),
153      dcterm_types: extra.dcterm_types.clone(),
154      base_url: "".to_string(),
155      proxy_path: false,
156      proxy_query_params: false,
157      proxy_method: false,
158      proxy_body: false,
159    }
160  }
161}
162
163fn get_property(properties: &Properties, name: &str) -> String {
164  properties
165    .get::<String>(name)
166    .unwrap_or_default()
167    .unwrap_or_default()
168}
169
170fn get_boolean_property(data_address: &DataAddress, name: &str) -> bool {
171  data_address
172    .property::<String>(name)
173    .unwrap_or_default()
174    .unwrap_or_default()
175    == "true"
176}