Skip to content

Commit ca5ab85

Browse files
null result fixes
1 parent 63b9689 commit ca5ab85

File tree

3 files changed

+113
-18
lines changed

3 files changed

+113
-18
lines changed

ogcapi-drivers/src/postgres/job.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use crate::{JobHandler, ProcessResult};
1010

1111
use super::Db;
1212

13+
type Results = HashMap<String, ExecuteResult>;
14+
1315
#[async_trait::async_trait]
1416
impl JobHandler for Db {
1517
async fn register(&self, job: &StatusInfo, response_mode: Response) -> anyhow::Result<String> {
@@ -72,7 +74,7 @@ impl JobHandler for Db {
7274
status: &StatusCode,
7375
message: Option<String>,
7476
links: Vec<Link>,
75-
results: Option<HashMap<String, ExecuteResult>>,
77+
results: Option<Results>,
7678
) -> anyhow::Result<()> {
7779
sqlx::query(
7880
r#"
@@ -88,10 +90,10 @@ impl JobHandler for Db {
8890
"#,
8991
)
9092
.bind(job_id)
91-
.bind(sqlx::types::Json(status))
93+
.bind(Json(status))
9294
.bind(message)
93-
.bind(sqlx::types::Json(links))
94-
.bind(sqlx::types::Json(results))
95+
.bind(Json(links))
96+
.bind(results.map(Json))
9597
.execute(&self.pool)
9698
.await?;
9799
Ok(())
@@ -169,23 +171,21 @@ impl JobHandler for Db {
169171
}
170172

171173
async fn results(&self, id: &str) -> anyhow::Result<ProcessResult> {
172-
let results: Option<(Json<Option<HashMap<String, ExecuteResult>>>, Json<Response>)> = dbg!(
173-
sqlx::query_as(
174-
r#"
174+
let results: Option<(Option<Json<Results>>, Json<Response>)> = sqlx::query_as(
175+
r#"
175176
SELECT results, to_jsonb(response)
176177
FROM meta.jobs
177178
WHERE job_id = $1
178179
"#,
179-
)
180-
.bind(id)
181-
.fetch_optional(&self.pool)
182-
.await
183-
)?;
180+
)
181+
.bind(id)
182+
.fetch_optional(&self.pool)
183+
.await?;
184184

185185
Ok(match results {
186186
None => ProcessResult::NoSuchJob,
187-
Some((Json(None), _)) => ProcessResult::NotReady,
188-
Some((Json(Some(results)), Json(response_mode))) => ProcessResult::Results {
187+
Some((None, _)) => ProcessResult::NotReady,
188+
Some((Some(Json(results)), Json(response_mode))) => ProcessResult::Results {
189189
results,
190190
response_mode,
191191
},

ogcapi-drivers/tests/job.rs

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
#[cfg(feature = "processes")]
22
mod postgres {
3-
use ogcapi_drivers::{JobHandler, postgres::Db};
4-
use ogcapi_types::processes::{Response, StatusCode, StatusInfo};
3+
use std::collections::HashMap;
4+
5+
use ogcapi_drivers::{JobHandler, ProcessResult, postgres::Db};
6+
use ogcapi_types::processes::{
7+
ExecuteResult, InlineOrRefData, InputValueNoObject, Output, Response, StatusCode,
8+
StatusInfo,
9+
};
510

611
#[sqlx::test]
712
async fn job_handling(pool: sqlx::PgPool) -> () {
@@ -25,4 +30,82 @@ mod postgres {
2530

2631
assert_eq!(info.unwrap().status, StatusCode::Dismissed)
2732
}
33+
34+
#[sqlx::test]
35+
async fn job_result(pool: sqlx::PgPool) -> () {
36+
let db = Db { pool };
37+
38+
let job = StatusInfo {
39+
job_id: "test-job".to_string(),
40+
..Default::default()
41+
};
42+
43+
matches!(
44+
db.results(&job.job_id).await.unwrap(),
45+
ProcessResult::NoSuchJob
46+
);
47+
48+
assert_eq!(
49+
db.register(&job, Response::Document).await.unwrap(),
50+
job.job_id
51+
);
52+
53+
matches!(
54+
db.results(&job.job_id).await.unwrap(),
55+
ProcessResult::NotReady
56+
);
57+
58+
db.finish(
59+
&job.job_id,
60+
&StatusCode::Successful,
61+
Some("it is ready".to_string()),
62+
vec![],
63+
Some(HashMap::from([(
64+
"key1".to_string(),
65+
ExecuteResult {
66+
output: Output {
67+
format: None,
68+
transmission_mode: Default::default(),
69+
},
70+
data: InlineOrRefData::InputValueNoObject(InputValueNoObject::String(
71+
"foobar".into(),
72+
)),
73+
},
74+
)])),
75+
)
76+
.await
77+
.unwrap();
78+
79+
matches!(
80+
db.results(&job.job_id).await.unwrap(),
81+
ProcessResult::Results {
82+
results: _,
83+
response_mode: Response::Document,
84+
}
85+
);
86+
}
87+
88+
#[sqlx::test]
89+
async fn job_result_failed(pool: sqlx::PgPool) -> () {
90+
let db = Db { pool };
91+
92+
let job = StatusInfo {
93+
job_id: "test-job".to_string(),
94+
..Default::default()
95+
};
96+
97+
let _ = db.register(&job, Response::Document).await.unwrap();
98+
99+
db.finish(&job.job_id, &StatusCode::Failed, None, vec![], None)
100+
.await
101+
.unwrap();
102+
103+
matches!(
104+
db.results(&job.job_id).await.unwrap(),
105+
ProcessResult::Results {
106+
results: _,
107+
response_mode: Response::Document,
108+
}
109+
);
110+
}
28111
}

ogcapi-services/src/routes/common.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,23 @@ pub async fn root(
9090
)
9191
)
9292
)]
93-
pub(crate) async fn api() -> (HeaderMap, Json<openapiv3::OpenAPI>) {
93+
pub(crate) async fn api(RemoteUrl(url): RemoteUrl) -> (HeaderMap, Json<openapiv3::OpenAPI>) {
9494
let mut headers = HeaderMap::new();
9595
headers.insert(CONTENT_TYPE, OPEN_API_JSON.parse().unwrap());
9696

97-
(headers, Json(OpenAPI::from_slice(OPENAPI).0))
97+
let mut open_api = OpenAPI::from_slice(OPENAPI).0;
98+
99+
let base_url = url[..url::Position::BeforePath].to_string();
100+
101+
// replace servers with relative server
102+
open_api.servers = vec![openapiv3::Server {
103+
url: base_url,
104+
description: None,
105+
variables: None,
106+
extensions: Default::default(),
107+
}];
108+
109+
(headers, Json(open_api))
98110
}
99111

100112
/// API conformance definition

0 commit comments

Comments
 (0)