Skip to main content

edc_web_components/models/
asset_item.rs

1use crate::models::dataset_extra_fields::DatasetExtraFields;
2use crate::models::{Creator, DataspaceDataset, 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 AssetItem {
26  pub fn is_filtered(&self, search: &Option<String>, dcterm_types: &[String]) -> bool {
27    let text_content = format!(
28      "{} {} {} {}",
29      self.name.to_lowercase(),
30      self.description.clone().unwrap_or_default().to_lowercase(),
31      self.keywords.join(" ").to_lowercase(),
32      self
33        .creator
34        .clone()
35        .map(|creator| creator.name.unwrap_or_default().to_lowercase())
36        .unwrap_or_default()
37    );
38
39    if !dcterm_types.is_empty() {
40      if self
41        .dcterm_types
42        .iter()
43        .any(|dcterm_type| dcterm_types.contains(dcterm_type))
44      {
45        if let Some(search) = &search {
46          text_content.contains(&search.to_lowercase())
47        } else {
48          true
49        }
50      } else {
51        false
52      }
53    } else {
54      if let Some(search) = &search {
55        text_content.contains(&search.to_lowercase())
56      } else {
57        true
58      }
59    }
60  }
61}
62
63impl From<Asset> for AssetItem {
64  fn from(asset: Asset) -> Self {
65    let id = asset.id().to_string();
66    let name = get_property(asset.properties(), "name");
67    let description = asset
68      .properties()
69      .get::<String>("http://www.w3.org/2000/01/rdf-schema#comment")
70      .unwrap_or_default();
71
72    let version = asset
73      .properties()
74      .get::<String>("http://www.w3.org/ns/dcat#version")
75      .unwrap_or_default()
76      .and_then(|version| semver::Version::parse(version.as_str()).ok());
77
78    let creator = asset
79      .properties()
80      .get_raw("http://purl.org/dc/terms/creator")
81      .and_then(|property_value| serde_json::from_value::<Creator>(property_value.0.clone()).ok());
82
83    let thumbnail = asset
84      .properties()
85      .get_raw("http://xmlns.com/foaf/0.1/thumbnail")
86      .and_then(|property_value| {
87        serde_json::from_value::<Thumbnail>(property_value.0.clone()).ok()
88      });
89
90    let keywords = asset
91      .properties()
92      .get_raw("http://www.w3.org/ns/dcat#keyword")
93      .and_then(|property_value| {
94        serde_json::from_value::<Vec<String>>(property_value.0.clone()).ok()
95      })
96      .unwrap_or_default();
97
98    let dcterm_types = asset
99      .properties()
100      .get_raw("http://purl.org/dc/terms/type")
101      .and_then(|property_value| {
102        if let Ok(value) = PropertyValue::try_from(property_value) {
103          Some(vec![value])
104        } else {
105          serde_json::from_value::<Vec<String>>(property_value.0.clone()).ok()
106        }
107      })
108      .unwrap_or_default();
109
110    let base_url = asset
111      .data_address()
112      .property("baseUrl")
113      .unwrap_or_default()
114      .unwrap_or_default();
115
116    let proxy_path = get_boolean_property(asset.data_address(), "proxyPath");
117    let proxy_query_params = get_boolean_property(asset.data_address(), "proxyQueryParams");
118    let proxy_method = get_boolean_property(asset.data_address(), "proxyMethod");
119    let proxy_body = get_boolean_property(asset.data_address(), "proxyBody");
120
121    AssetItem {
122      id,
123      name,
124      version,
125      description,
126      creator,
127      thumbnail,
128      keywords,
129      dcterm_types,
130      base_url,
131      proxy_path,
132      proxy_query_params,
133      proxy_method,
134      proxy_body,
135    }
136  }
137}
138
139impl From<edc_federated_catalog_client::models::Dataset> for AssetItem {
140  fn from(dataset: edc_federated_catalog_client::models::Dataset) -> Self {
141    Self {
142      id: dataset.id.clone(),
143      name: dataset.name,
144      version: dataset
145        .version
146        .and_then(|version| semver::Version::parse(&version).ok()),
147      description: dataset.description,
148      creator: dataset.creator.map(|creator| Creator {
149        name: Some(creator.name),
150        thumbnail: Some(Thumbnail {
151          resource: Some(creator.thumbnail.resource),
152        }),
153      }),
154      thumbnail: dataset.thumbnail.map(|thumbnail| Thumbnail {
155        resource: Some(thumbnail.resource),
156      }),
157      keywords: dataset.keywords,
158      dcterm_types: dataset.dcterm_types,
159      base_url: "".to_string(),
160      proxy_path: false,
161      proxy_query_params: false,
162      proxy_method: false,
163      proxy_body: false,
164    }
165  }
166}
167
168impl From<&Dataset<DatasetExtraFields>> for AssetItem {
169  fn from(dataset: &Dataset<DatasetExtraFields>) -> Self {
170    let id = dataset.id().to_string();
171    let extra = &dataset.extra;
172
173    Self {
174      id,
175      name: extra.name.clone(),
176      version: extra
177        .version
178        .as_ref()
179        .and_then(|version| semver::Version::parse(version).ok()),
180      description: extra.description.to_owned(),
181      creator: extra.creator.as_ref().map(|creator| Creator {
182        name: Some(creator.name.to_owned()),
183        thumbnail: Some(Thumbnail {
184          resource: Some(creator.thumbnail.resource.to_owned()),
185        }),
186      }),
187      thumbnail: extra.thumbnail.as_ref().map(|thumbnail| Thumbnail {
188        resource: Some(thumbnail.resource.to_owned()),
189      }),
190      keywords: extra.keywords.clone(),
191      dcterm_types: extra.dcterm_types.clone(),
192      base_url: "".to_string(),
193      proxy_path: false,
194      proxy_query_params: false,
195      proxy_method: false,
196      proxy_body: false,
197    }
198  }
199}
200
201impl From<AssetItem> for DataspaceDataset {
202  fn from(asset_item: AssetItem) -> Self {
203    Self {
204      id: asset_item.id,
205      title: asset_item.name,
206      version: asset_item.version,
207      comment: asset_item.description,
208      thumbnail: asset_item.thumbnail,
209      creator: asset_item.creator,
210      keywords: asset_item.keywords,
211      dcterm_types: asset_item.dcterm_types,
212      policies: vec![],
213    }
214  }
215}
216
217fn get_property(properties: &Properties, name: &str) -> String {
218  properties
219    .get::<String>(name)
220    .unwrap_or_default()
221    .unwrap_or_default()
222}
223
224fn get_boolean_property(data_address: &DataAddress, name: &str) -> bool {
225  data_address
226    .property::<String>(name)
227    .unwrap_or_default()
228    .unwrap_or_default()
229    == "true"
230}