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