From f12eac7f7c4f7ef54470d9f336cbec29b7a60056 Mon Sep 17 00:00:00 2001 From: Christian Beilschmidt Date: Thu, 19 Mar 2026 17:18:17 +0100 Subject: [PATCH] refactor: rename geoengine-openapi-client to geoengine-api-client and update dependencies --- backend/Cargo.lock | 68 ++++++++-------------------- backend/Cargo.toml | 2 +- backend/examples/query-geo-engine.rs | 12 ++--- backend/src/auth.rs | 12 ++--- backend/src/config.rs | 2 +- backend/src/handler.rs | 2 +- backend/src/processes/ndvi.rs | 14 +++--- backend/src/processes/parameters.rs | 4 +- backend/src/util.rs | 49 ++++++++------------ 9 files changed, 62 insertions(+), 103 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 08d08b4..88b8d2f 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -282,14 +282,14 @@ dependencies = [ "diesel-derive-enum", "diesel_migrations", "futures", - "geoengine-openapi-client", + "geoengine-api-client", "httptest", "indoc", "nom", "o2o", "ogcapi", "pretty_assertions", - "reqwest 0.13.2", + "reqwest", "schemars 1.2.1", "serde", "serde_json", @@ -1141,15 +1141,17 @@ dependencies = [ ] [[package]] -name = "geoengine-openapi-client" -version = "0.0.31" -source = "git+https://github.com/geo-engine/openapi-client?branch=rust#bf69675a8077d11c406fe10690a1b7aeb699233e" +name = "geoengine-api-client" +version = "0.0.33" +source = "git+https://github.com/geo-engine/openapi-client?branch=rust2#aa19aa862acd09c64f3d6e9af388c37d8942bee4" dependencies = [ - "reqwest 0.12.28", + "reqwest", "serde", "serde_json", "serde_repr", "serde_with", + "tokio", + "tokio-util", "url", "uuid", ] @@ -2706,46 +2708,6 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime_guess", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - [[package]] name = "reqwest" version = "0.13.2" @@ -2756,16 +2718,20 @@ dependencies = [ "bytes", "encoding_rs", "futures-core", + "futures-util", "h2", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", "mime", + "mime_guess", + "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -2774,15 +2740,19 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", + "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-rustls", + "tokio-util", "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", ] @@ -4404,9 +4374,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -4501,7 +4471,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d121d5f..9eefb0c 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -60,7 +60,7 @@ diesel-async = { version = "0.7", features = ["migrations", "postgres", "bb8"] } diesel-derive-enum = { version = "3.0.0-beta.1", features = ["postgres"] } diesel_migrations = "2.3" futures = "0.3" -geoengine-openapi-client = { git = "https://github.com/geo-engine/openapi-client", branch = "rust" } +geoengine-api-client = { git = "https://github.com/geo-engine/openapi-client", branch = "rust2" } indoc = "2.0" nom = "8.0" ogcapi = { git = "https://github.com/georust/ogcapi", branch = "openapi-fixes", default-features = false, features = [ diff --git a/backend/examples/query-geo-engine.rs b/backend/examples/query-geo-engine.rs index bf0797c..3cbb6e7 100644 --- a/backend/examples/query-geo-engine.rs +++ b/backend/examples/query-geo-engine.rs @@ -1,13 +1,13 @@ #![allow(clippy::unwrap_used, clippy::print_stderr)] // ok for example -use geoengine_openapi_client::{ +use geoengine_api_client::{ apis::{ configuration::Configuration, general_api::server_info_handler, ogcwfs_api::wfs_handler, session_api::anonymous_handler, workflows_api::register_workflow_handler, }, models::{ - Coordinate2D, SpatialPartition2D, TypedOperatorOperator, WfsRequest, WfsService, Workflow, - workflow::Type, + Coordinate2D, LegacyTypedOperator, LegacyTypedOperatorOperator, SpatialPartition2D, + WfsRequest, WfsService, Workflow, legacy_typed_operator::Type, }, }; @@ -22,8 +22,8 @@ async fn main() { eprintln!("{session:#?}"); configuration.bearer_access_token = Some(session.id.to_string()); - let workflow = Workflow { - operator: Box::new(TypedOperatorOperator { + let workflow = Workflow::LegacyTypedOperator(Box::new(LegacyTypedOperator { + operator: Box::new(LegacyTypedOperatorOperator { params: Some(serde_json::json!({ "data": "ne_10m_ports" })), @@ -31,7 +31,7 @@ async fn main() { r#type: "OgrSource".into(), }), r#type: Type::Vector, - }; + })); let workflow_id = register_workflow_handler(&configuration, workflow) .await diff --git a/backend/src/auth.rs b/backend/src/auth.rs index 4a457d6..82a0d2e 100644 --- a/backend/src/auth.rs +++ b/backend/src/auth.rs @@ -12,7 +12,7 @@ use axum::{ response::IntoResponse, }; use futures::future::BoxFuture; -use geoengine_openapi_client::apis::{configuration, session_api::session_handler}; +use geoengine_api_client::apis::{configuration, session_api::session_handler}; use nom::{ IResult, Parser, bytes::{complete::tag_no_case, take}, @@ -40,7 +40,7 @@ pub struct AuthCodeResponse { pub state: String, } -impl From for geoengine_openapi_client::models::AuthCodeResponse { +impl From for geoengine_api_client::models::AuthCodeResponse { fn from(value: AuthCodeResponse) -> Self { Self { code: value.code, @@ -60,8 +60,8 @@ pub struct UserSession { pub valid_until: String, } -impl From for UserSession { - fn from(value: geoengine_openapi_client::models::UserSession) -> Self { +impl From for UserSession { + fn from(value: geoengine_api_client::models::UserSession) -> Self { Self { created: value.created, id: value.id, @@ -187,7 +187,7 @@ where Ok(session) => session, Err(error) => { let (error_msg, status_code) = match &error { - geoengine_openapi_client::apis::Error::ResponseError(e) => ( + geoengine_api_client::apis::Error::ResponseError(e) => ( error_response(&error) .map(|e| e.message) .unwrap_or_default(), @@ -248,7 +248,7 @@ mod tests { use axum::body::Body; use axum::http::Request as HttpRequest; use axum::response::Response; - use geoengine_openapi_client::apis::configuration; + use geoengine_api_client::apis::configuration; use httptest::matchers::*; use httptest::responders::*; use httptest::{Expectation, Server}; diff --git a/backend/src/config.rs b/backend/src/config.rs index a6e6f81..a3dd398 100644 --- a/backend/src/config.rs +++ b/backend/src/config.rs @@ -1,5 +1,5 @@ use crate::util::Secret; -use geoengine_openapi_client::apis::configuration::Configuration; +use geoengine_api_client::apis::configuration::Configuration; use std::{path::Path, sync::LazyLock}; use tracing::Level; use tracing_subscriber::filter::Directive; diff --git a/backend/src/handler.rs b/backend/src/handler.rs index dbe8718..fab79a3 100644 --- a/backend/src/handler.rs +++ b/backend/src/handler.rs @@ -6,7 +6,7 @@ use axum::{ http::StatusCode, response::IntoResponse, }; -use geoengine_openapi_client::apis::{ +use geoengine_api_client::apis::{ configuration::Configuration, session_api::{oidc_init, oidc_login}, }; diff --git a/backend/src/processes/ndvi.rs b/backend/src/processes/ndvi.rs index 20029d0..abd4c1c 100644 --- a/backend/src/processes/ndvi.rs +++ b/backend/src/processes/ndvi.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use geoengine_openapi_client::{ +use geoengine_api_client::{ apis::{ configuration::Configuration, ogcwfs_api::wfs_handler, uploads_api::upload_handler, workflows_api::register_workflow_handler, @@ -340,18 +340,20 @@ async fn compute_ndvi( .into(), } .into(), - ))?; + )); // eprintln!("{}", serde_json::to_string_pretty(&workflow).unwrap()); - let workflow_id = match register_workflow_handler(configuration, workflow).await { + let workflow_id = match register_workflow_handler(configuration, workflow.clone()).await { Ok(id) => id, Err(e) => { + let workflow_json = serde_json::to_string_pretty(&workflow) + .unwrap_or_else(|_| "".to_string()); if let Some(error) = error_response(&e) { - anyhow::bail!("Failed to register workflow: {error:?}"); + anyhow::bail!("Failed to register workflow `{workflow_json}`: {error:?}"); } - anyhow::bail!("Failed to register workflow: {e}"); + anyhow::bail!("Failed to register workflow `{workflow_json}`: {e}"); } }; @@ -508,7 +510,7 @@ fn k_ndvi_source() -> RasterOperator { #[cfg(test)] mod tests { use super::*; - use geoengine_openapi_client::apis::configuration::Configuration as ApiConfiguration; + use geoengine_api_client::apis::configuration::Configuration as ApiConfiguration; use httptest::matchers::*; use httptest::responders::*; use httptest::{Expectation, Server}; diff --git a/backend/src/processes/parameters.rs b/backend/src/processes/parameters.rs index ff4e29e..cff0bb4 100644 --- a/backend/src/processes/parameters.rs +++ b/backend/src/processes/parameters.rs @@ -1,4 +1,4 @@ -use geoengine_openapi_client::models::SpatialPartition2D; +use geoengine_api_client::models::SpatialPartition2D; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use utoipa::ToSchema; @@ -13,7 +13,7 @@ pub trait ToBbox { impl ToBbox for Coordinate { fn to_bbox(&self, buffer: f64) -> SpatialPartition2D { - use geoengine_openapi_client::models::Coordinate2D; + use geoengine_api_client::models::Coordinate2D; let [x, y] = self.0; SpatialPartition2D::new( diff --git a/backend/src/util.rs b/backend/src/util.rs index 127a7b1..a0802ce 100644 --- a/backend/src/util.rs +++ b/backend/src/util.rs @@ -1,38 +1,25 @@ -use anyhow::{Context, Result}; -use geoengine_openapi_client::models::{ - TypedOperatorOperator, VectorOperator, Workflow, workflow::Type as WorkflowType, +use geoengine_api_client::models::{ + TypedOperator, TypedVectorOperator, VectorOperator, Workflow, + typed_vector_operator::Type as VectorType, }; use std::ops::Deref; use tracing::error; /// Converts a Geo Engine operator to an Geo Engine OpenAPI workflow. -pub fn to_api_workflow( - operator: &VectorOperator, -) -> Result { - let serde_json::Value::Object(mut json_object) = serde_json::to_value(operator)? else { - anyhow::bail!("expected operator to serialize `TypedOperator` to a JSON object"); - }; - let serde_json::Value::String(r#type) = - json_object.remove("type").context("missing `type` field")? - else { - anyhow::bail!("`type` field is not a string"); - }; - - Ok(Workflow { - operator: Box::new(TypedOperatorOperator { - params: json_object.remove("params"), - sources: json_object.remove("sources"), - r#type, - }), - r#type: WorkflowType::Vector, - }) +pub fn to_api_workflow(operator: &VectorOperator) -> geoengine_api_client::models::Workflow { + Workflow::TypedOperator(Box::new(TypedOperator::TypedVectorOperator(Box::new( + TypedVectorOperator { + operator: Box::new(operator.clone()), + r#type: VectorType::Vector, + }, + )))) } pub fn error_response( - error: &geoengine_openapi_client::apis::Error, -) -> Option { - use geoengine_openapi_client::apis::Error as ApiError; - use geoengine_openapi_client::models::ErrorResponse as ApiErrorResponse; + error: &geoengine_api_client::apis::Error, +) -> Option { + use geoengine_api_client::apis::Error as ApiError; + use geoengine_api_client::models::ErrorResponse as ApiErrorResponse; match error { ApiError::Reqwest(_) | ApiError::Serde(_) | ApiError::Io(_) => None, @@ -105,7 +92,7 @@ impl From for Secret { mod tests { use super::*; - use geoengine_openapi_client::models::{ + use geoengine_api_client::models::{ ColumnNames, Default as ColumnNamesDefault, FeatureAggregationMethod, GdalSource, GdalSourceParameters, RasterOperator, RasterVectorJoin, RasterVectorJoinParameters, SingleVectorMultipleRasterSources, TemporalAggregationMethod, VectorOperator, @@ -146,7 +133,7 @@ mod tests { .into(), ); - let api_workflow = to_api_workflow(&raster_vector_join).unwrap(); + let api_workflow = to_api_workflow(&raster_vector_join); assert_eq!( serde_json::to_string_pretty(&api_workflow).unwrap(), @@ -168,7 +155,7 @@ mod tests { "type": "GdalSource", "params": { "data": "ndvi" - } + }, }], "vector": { "type": "MockPointSource", @@ -177,7 +164,7 @@ mod tests { "spatialBounds": { "type": "derive" } - } + }, } } }