1
0
Fork 0
mirror of https://gitlab.com/msrd0/gotham-restful.git synced 2025-04-20 06:54:46 +00:00

add search method

This commit is contained in:
Dominic 2019-10-13 17:43:42 +02:00
parent 8429c425aa
commit 0153b2e22f
Signed by: msrd0
GPG key ID: DCC8C247452E98F9
8 changed files with 84 additions and 13 deletions

View file

@ -30,6 +30,7 @@ pub use resource::{
Resource,
ResourceReadAll,
ResourceRead,
ResourceSearch,
ResourceCreate,
ResourceUpdateAll,
ResourceUpdate,

View file

@ -8,12 +8,14 @@ use crate::{
};
use futures::future::ok;
use gotham::{
extractor::QueryStringExtractor,
handler::{Handler, HandlerFuture, NewHandler},
helpers::http::response::create_response,
pipeline::chain::PipelineHandleChain,
router::builder::*,
state::State
};
use hyper::Body;
use indexmap::IndexMap;
use log::error;
use mime::{APPLICATION_JSON, TEXT_PLAIN};
@ -292,6 +294,22 @@ macro_rules! implOpenapiRouter {
(&mut *(self.0).0, self.1.to_string()).read::<Handler, ID, Res>()
}
fn search<Handler, Query, Res>(&mut self)
where
Query : ResourceType + QueryStringExtractor<Body> + Send + Sync + 'static,
Res : ResourceResult,
Handler : ResourceSearch<Query, Res>
{
let schema = (self.0).1.add_schema::<Res>();
let path = format!("/{}/search", &self.1);
let mut item = (self.0).1.remove_path(&self.1);
item.get = Some(new_operation(Res::default_status(), schema, vec![], None)); // TODO
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1.to_string()).search::<Handler, Query, Res>()
}
fn create<Handler, Body, Res>(&mut self)
where
Body : ResourceType,

View file

@ -1,5 +1,8 @@
use crate::{DrawResourceRoutes, ResourceResult, ResourceType};
use gotham::state::State;
use gotham::{
router::response::extender::StaticResponseExtender,
state::{State, StateData}
};
use serde::de::DeserializeOwned;
use std::panic::RefUnwindSafe;
@ -29,6 +32,14 @@ where
fn read(state : &mut State, id : ID) -> R;
}
/// Handle a GET request on the Resource with additional search parameters.
pub trait ResourceSearch<Query : ResourceType, R : ResourceResult>
where
Query : ResourceType + StateData + StaticResponseExtender
{
fn search(state : &mut State, query : Query) -> R;
}
/// Handle a POST request on the Resource root.
pub trait ResourceCreate<Body : ResourceType, R : ResourceResult>
{
@ -36,7 +47,7 @@ pub trait ResourceCreate<Body : ResourceType, R : ResourceResult>
}
/// Handle a PUT request on the Resource root.
pub trait ResourceUpdateAll<Body : DeserializeOwned, R : ResourceResult>
pub trait ResourceUpdateAll<Body : ResourceType, R : ResourceResult>
{
fn update_all(state : &mut State, body : Body) -> R;
}

View file

@ -12,12 +12,14 @@ use futures::{
stream::Stream
};
use gotham::{
extractor::QueryStringExtractor,
handler::{HandlerFuture, IntoHandlerError},
helpers::http::response::create_response,
pipeline::chain::PipelineHandleChain,
router::builder::*,
state::{FromState, State}
};
use hyper::Body;
use mime::APPLICATION_JSON;
use serde::de::DeserializeOwned;
use std::panic::RefUnwindSafe;
@ -65,6 +67,12 @@ pub trait DrawResourceRoutes
Res : ResourceResult,
Handler : ResourceRead<ID, Res>;
fn search<Handler, Query, Res>(&mut self)
where
Query : ResourceType + QueryStringExtractor<Body> + Send + Sync + 'static,
Res : ResourceResult,
Handler : ResourceSearch<Query, Res>;
fn create<Handler, Body, Res>(&mut self)
where
Body : ResourceType,
@ -175,6 +183,16 @@ where
to_handler_future(state, |state| Handler::read(state, id))
}
fn search_handler<Handler, Query, Res>(mut state : State) -> Box<HandlerFuture>
where
Query : ResourceType + QueryStringExtractor<Body> + Send + Sync + 'static,
Res : ResourceResult,
Handler : ResourceSearch<Query, Res>
{
let query = Query::take_from(&mut state);
to_handler_future(state, |state| Handler::search(state, query))
}
fn create_handler<Handler, Body, Res>(state : State) -> Box<HandlerFuture>
where
Body : ResourceType,
@ -284,7 +302,18 @@ macro_rules! implDrawResourceRoutes {
.with_path_extractor::<PathExtractor<ID>>()
.to(|state| read_handler::<Handler, ID, Res>(state));
}
fn search<Handler, Query, Res>(&mut self)
where
Query : ResourceType + QueryStringExtractor<Body> + Send + Sync + 'static,
Res : ResourceResult,
Handler : ResourceSearch<Query, Res>
{
self.0.get(&format!("{}/search", self.1))
.with_query_string_extractor::<Query>()
.to(|state| search_handler::<Handler, Query, Res>(state));
}
fn create<Handler, Body, Res>(&mut self)
where
Body : ResourceType,