use actix_web::{dev, http::StatusCode, web, FromRequest, HttpRequest, HttpResponse, Result};
use futures::future;
use crate::rest_api::resources::error::ErrorResponse;
use super::Endpoint;
#[derive(Debug, Serialize, Deserialize)]
pub struct QueryServiceId {
pub service_id: Option<String>,
pub wait: Option<u64>,
}
pub struct AcceptServiceIdParam;
impl FromRequest for AcceptServiceIdParam {
type Error = HttpResponse;
type Future = future::Ready<Result<Self, Self::Error>>;
type Config = ();
fn from_request(req: &HttpRequest, _: &mut dev::Payload) -> Self::Future {
let endpoint: Endpoint = if let Some(endpoint) = req.app_data::<Endpoint>() {
endpoint.clone()
} else {
return future::err(
HttpResponse::build(
StatusCode::from_u16(500).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR),
)
.json(ErrorResponse::new(500, "App state not found")),
);
};
let service_id =
if let Ok(query) = web::Query::<QueryServiceId>::from_query(req.query_string()) {
query.service_id.clone()
} else {
return future::err(
HttpResponse::build(
StatusCode::from_u16(400).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR),
)
.json(ErrorResponse::new(400, "Malformed query param")),
);
};
if service_id.is_some() && endpoint.is_sawtooth() {
return future::err(
HttpResponse::build(
StatusCode::from_u16(400).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR),
)
.json(ErrorResponse::new(
400,
"Service ID present, but grid is running in sawtooth mode",
)),
);
} else if service_id.is_none() && !endpoint.is_sawtooth() {
return future::err(
HttpResponse::build(
StatusCode::from_u16(400).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR),
)
.json(ErrorResponse::new(
400,
"Service ID is not present, but grid is running in splinter mode",
)),
);
}
future::ok(AcceptServiceIdParam)
}
}