edc_web_components/models/
asset_item.rs1use 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}