1
0
Fork 0
mirror of https://gitlab.com/msrd0/gotham-restful.git synced 2025-02-22 20:52:27 +00:00

auth is now per-method and not per-return-type

This commit is contained in:
msrd0 2020-04-11 18:13:36 +00:00
parent f6f16949a1
commit d10895076e
4 changed files with 42 additions and 21 deletions

View file

@ -384,7 +384,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), None, None, Handler::Res::requires_auth()));
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), None, None, Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).read_all::<Handler>()
@ -396,7 +396,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None, Handler::Res::requires_auth()));
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None, Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).read::<Handler>()
@ -408,7 +408,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}/search", &self.1);
let mut item = (self.0).1.remove_path(&self.1);
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_query_params(Handler::Query::schema()), None, None, Handler::Res::requires_auth()));
item.get = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_query_params(Handler::Query::schema()), None, None, Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).search::<Handler>()
@ -421,7 +421,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.post = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Handler::Body::supported_types(), Handler::Res::requires_auth()));
item.post = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Handler::Body::supported_types(), Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).create::<Handler>()
@ -434,7 +434,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.put = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Handler::Body::supported_types(), Handler::Res::requires_auth()));
item.put = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Handler::Body::supported_types(), Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).update_all::<Handler>()
@ -447,7 +447,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.put = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), Some(body_schema), Handler::Body::supported_types(), Handler::Res::requires_auth()));
item.put = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), Some(body_schema), Handler::Body::supported_types(), Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).update::<Handler>()
@ -459,7 +459,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.delete = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), None, None, Handler::Res::requires_auth()));
item.delete = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::default(), None, None, Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).delete_all::<Handler>()
@ -471,7 +471,7 @@ macro_rules! implOpenapiRouter {
let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path);
item.delete = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None, Handler::Res::requires_auth()));
item.delete = Some(new_operation(Handler::operation_id(), Handler::Res::default_status(), Handler::Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None, Handler::wants_auth()));
(self.0).1.add_path(path, item);
(&mut *(self.0).0, self.1).delete::<Handler>()

View file

@ -28,6 +28,11 @@ pub trait ResourceMethod
{
None
}
fn wants_auth() -> bool
{
false
}
}
/// Handle a GET request on the Resource root.

View file

@ -95,12 +95,6 @@ pub trait ResourceResult
{
StatusCode::OK
}
#[cfg(feature = "openapi")]
fn requires_auth() -> bool
{
false
}
}
#[cfg(feature = "openapi")]
@ -348,12 +342,6 @@ impl<T : ResourceResult> ResourceResult for AuthResult<T>
{
T::default_status()
}
#[cfg(feature = "openapi")]
fn requires_auth() -> bool
{
true
}
}
/**

View file

@ -10,6 +10,7 @@ use syn::{
FnArg,
ItemFn,
Lit,
LitBool,
Meta,
NestedMeta,
PatType,
@ -259,6 +260,31 @@ fn expand_operation_id(_ : &AttributeArgs) -> TokenStream2
quote!()
}
fn expand_wants_auth(attrs : &AttributeArgs, default : bool) -> TokenStream2
{
let default_lit = Lit::Bool(LitBool { value: default, span: Span::call_site() });
let mut wants_auth = &default_lit;
for meta in attrs
{
match meta {
NestedMeta::Meta(Meta::NameValue(kv)) => {
if kv.path.segments.last().map(|p| p.ident.to_string()) == Some("wants_auth".to_owned())
{
wants_auth = &kv.lit
}
},
_ => {}
}
}
quote! {
fn wants_auth() -> bool
{
#wants_auth
}
}
}
fn expand(method : Method, attrs : TokenStream, item : TokenStream) -> Result<TokenStream2, Error>
{
let krate = super::krate();
@ -390,8 +416,9 @@ fn expand(method : Method, attrs : TokenStream, item : TokenStream) -> Result<To
where_clause = quote!(#where_clause #auth_ty : Clone,);
}
// operation id code
// attribute generated code
let operation_id = expand_operation_id(&method_attrs);
let wants_auth = expand_wants_auth(&method_attrs, args.iter().any(|arg| (*arg).ty.is_auth_status()));
// put everything together
Ok(quote! {
@ -408,6 +435,7 @@ fn expand(method : Method, attrs : TokenStream, item : TokenStream) -> Result<To
type Res = #ret;
#operation_id
#wants_auth
}
impl #krate::#trait_ident for #handler_ident