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, 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}