Skip to main content

qualia_core_db/domains/geospatial/adapters/
dem_adapter.rs

1use crate::domains::geospatial::adapters::AdapterHttpRequest;
2use crate::net::disclosure::NetworkDisclosureRegistry;
3
4pub struct DemAdapter {
5    pub id: &'static str,
6    pub endpoint: String,
7}
8
9impl DemAdapter {
10    pub fn new(id: &'static str, endpoint: &str) -> Self {
11        Self {
12            id,
13            endpoint: endpoint.to_string(),
14        }
15    }
16
17    pub fn adapter_id(&self) -> &'static str {
18        self.id
19    }
20
21    pub fn build_fetch_request(
22        &self,
23        bbox: (f64, f64, f64, f64),
24        _time_range: (u64, u64),
25        registry: &NetworkDisclosureRegistry,
26    ) -> Result<AdapterHttpRequest, String> {
27        if !registry.check_egress_consent(self.adapter_id(), &self.endpoint) {
28            return Err(format!(
29                "Consent denied or unregistered for endpoint {} by adapter {}",
30                self.endpoint,
31                self.adapter_id()
32            ));
33        }
34
35        // 1. Convert bbox to appropriate COG tile coordinates / WCS query
36        let query = format!(
37            "{}?SERVICE=WCS&VERSION=2.0.1&REQUEST=GetCoverage&SUBSET=x({},{})&SUBSET=y({},{})",
38            self.endpoint, bbox.0, bbox.2, bbox.1, bbox.3
39        );
40
41        Ok(AdapterHttpRequest::get(query, "DEM"))
42    }
43
44    pub fn fetch_region(
45        &self,
46        bbox: (f64, f64, f64, f64),
47        time_range: (u64, u64),
48        registry: &NetworkDisclosureRegistry,
49    ) -> Result<(), String> {
50        let request = self.build_fetch_request(bbox, time_range, registry)?;
51        super::execute_http_request_status(&request)?;
52        // 2. Stream elevation data from endpoint is verified.
53        // 3. Piping elevation heightfield into the Marching Cubes / QEM LOD engine to output .10d meshes is deferred.
54        Ok(())
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn test_dem_adapter_egress() {
64        let adapter = DemAdapter::new("dem_adapter", "https://elevation.example.com");
65        let mut registry = NetworkDisclosureRegistry::new();
66
67        let res1 = adapter.fetch_region((0.0, 0.0, 1.0, 1.0), (0, 0), &registry);
68        assert!(res1.is_err());
69
70        registry.register_egress(
71            adapter.adapter_id(),
72            "https://elevation.example.com",
73            "Fetch DEM data",
74            "User viewed map",
75        );
76
77        let res2 = adapter.fetch_region((0.0, 0.0, 1.0, 1.0), (0, 0), &registry);
78        if let Err(e) = res2 {
79            assert!(
80                !e.contains("Consent denied"),
81                "Failed on consent when it should have been granted: {}",
82                e
83            );
84        }
85    }
86}