treeadvisor/server/src/area.rs

37 lines
1.1 KiB
Rust
Raw Normal View History

2021-08-26 01:13:49 +02:00
use std::collections::HashSet;
use gotham::{
helpers::http::response::create_response,
hyper::{Body, Response},
state::{FromState, State},
};
2021-08-28 01:00:13 +02:00
use mime::APPLICATION_JSON;
2021-08-26 01:13:49 +02:00
use http::StatusCode;
2021-08-28 01:00:13 +02:00
use crate::{AppState, PointExtractor};
2021-08-26 01:13:49 +02:00
pub fn get_details(state: State) -> (State, Response<Body>) {
let pe = PointExtractor::borrow_from(&state);
let app_state = AppState::borrow_from(&state);
let mut seen_srcs = HashSet::new();
2021-08-27 20:19:17 +02:00
let result = app_state.with_db(|db| {
2021-08-26 01:13:49 +02:00
db.query("SELECT src, attrs FROM areas WHERE coords @> $1::point ORDER BY coords <-> $1::point ASC", &[
&pe.to_point()
]).unwrap()
2021-08-27 20:19:17 +02:00
}).into_iter().filter(|row| {
2021-08-26 01:13:49 +02:00
let src: &str = row.get(0);
if seen_srcs.contains(src) {
false
} else {
seen_srcs.insert(src.to_owned());
true
}
}).map(|row| {
let attrs: serde_json::Value = row.get(1);
attrs
}).collect();
let body = serde_json::to_string(&serde_json::Value::Array(result)).unwrap();
let res = create_response(&state, StatusCode::OK, APPLICATION_JSON, body);
(state, res)
}