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