diff options
| author | Bryan Newbold <bnewbold@robocracy.org> | 2018-05-17 00:09:46 -0700 | 
|---|---|---|
| committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-05-17 00:09:46 -0700 | 
| commit | 6aee40ac9538f9391c9e630efddf4b39fdad5a50 (patch) | |
| tree | 1f8964407f78e8379e4dbbac3ee4ef117ae5b7f4 /rust/fatcat-api/src | |
| parent | 0f6ac22fee0332627ef86f10306d67b997396b61 (diff) | |
| download | fatcat-6aee40ac9538f9391c9e630efddf4b39fdad5a50.tar.gz fatcat-6aee40ac9538f9391c9e630efddf4b39fdad5a50.zip  | |
fix api spec
Diffstat (limited to 'rust/fatcat-api/src')
| -rw-r--r-- | rust/fatcat-api/src/client.rs | 7 | ||||
| -rw-r--r-- | rust/fatcat-api/src/lib.rs | 8 | ||||
| -rw-r--r-- | rust/fatcat-api/src/mimetypes.rs | 4 | ||||
| -rw-r--r-- | rust/fatcat-api/src/server.rs | 37 | 
4 files changed, 47 insertions, 9 deletions
diff --git a/rust/fatcat-api/src/client.rs b/rust/fatcat-api/src/client.rs index 0c1345de..4fa084f9 100644 --- a/rust/fatcat-api/src/client.rs +++ b/rust/fatcat-api/src/client.rs @@ -657,13 +657,18 @@ impl Api for Client {          Box::new(futures::done(result))      } -    fn editgroup_post(&self, context: &Context) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send> { +    fn editgroup_post(&self, param_body: models::Editgroup, context: &Context) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send> {          let url = format!("{}/v0/editgroup", self.base_path); +        let body = serde_json::to_string(¶m_body).expect("impossible to fail to serialize"); +          let hyper_client = (self.hyper_client)();          let request = hyper_client.request(hyper::method::Method::Post, &url);          let mut custom_headers = hyper::header::Headers::new(); +        let request = request.body(&body); + +        custom_headers.set(ContentType(mimetypes::requests::EDITGROUP_POST.clone()));          context.x_span_id.as_ref().map(|header| custom_headers.set(XSpanId(header.clone())));          let request = request.headers(custom_headers); diff --git a/rust/fatcat-api/src/lib.rs b/rust/fatcat-api/src/lib.rs index 716781cb..abd68f04 100644 --- a/rust/fatcat-api/src/lib.rs +++ b/rust/fatcat-api/src/lib.rs @@ -272,7 +272,7 @@ pub trait Api {      fn editgroup_id_get(&self, id: i32, context: &Context) -> Box<Future<Item = EditgroupIdGetResponse, Error = ApiError> + Send>; -    fn editgroup_post(&self, context: &Context) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send>; +    fn editgroup_post(&self, body: models::Editgroup, context: &Context) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send>;      fn editor_username_changelog_get(&self, username: String, context: &Context) -> Box<Future<Item = EditorUsernameChangelogGetResponse, Error = ApiError> + Send>; @@ -313,7 +313,7 @@ pub trait ApiNoContext {      fn editgroup_id_get(&self, id: i32) -> Box<Future<Item = EditgroupIdGetResponse, Error = ApiError> + Send>; -    fn editgroup_post(&self) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send>; +    fn editgroup_post(&self, body: models::Editgroup) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send>;      fn editor_username_changelog_get(&self, username: String) -> Box<Future<Item = EditorUsernameChangelogGetResponse, Error = ApiError> + Send>; @@ -384,8 +384,8 @@ impl<'a, T: Api> ApiNoContext for ContextWrapper<'a, T> {          self.api().editgroup_id_get(id, &self.context())      } -    fn editgroup_post(&self) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send> { -        self.api().editgroup_post(&self.context()) +    fn editgroup_post(&self, body: models::Editgroup) -> Box<Future<Item = EditgroupPostResponse, Error = ApiError> + Send> { +        self.api().editgroup_post(body, &self.context())      }      fn editor_username_changelog_get(&self, username: String) -> Box<Future<Item = EditorUsernameChangelogGetResponse, Error = ApiError> + Send> { diff --git a/rust/fatcat-api/src/mimetypes.rs b/rust/fatcat-api/src/mimetypes.rs index 6b89f7bb..5814890f 100644 --- a/rust/fatcat-api/src/mimetypes.rs +++ b/rust/fatcat-api/src/mimetypes.rs @@ -309,6 +309,10 @@ pub mod requests {      lazy_static! {          pub static ref CREATOR_POST: Mime = mime!(Application / Json);      } +    /// Create Mime objects for the request content types for EditgroupPost +    lazy_static! { +        pub static ref EDITGROUP_POST: Mime = mime!(Application / Json); +    }      /// Create Mime objects for the request content types for FilePost      lazy_static! {          pub static ref FILE_POST: Mime = mime!(Application / Json); diff --git a/rust/fatcat-api/src/server.rs b/rust/fatcat-api/src/server.rs index 902ebd6d..95829602 100644 --- a/rust/fatcat-api/src/server.rs +++ b/rust/fatcat-api/src/server.rs @@ -831,7 +831,30 @@ where                  context.auth_data = req.extensions.remove::<AuthData>();                  context.authorization = req.extensions.remove::<Authorization>(); -                match api.editgroup_post(context).wait() { +                // Body parameters (note that non-required body parameters will ignore garbage +                // values, rather than causing a 400 response). Produce warning header and logs for +                // any unused fields. + +                let param_body = req.get::<bodyparser::Raw>() +                    .map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse body parameter body - not valid UTF-8: {}", e))))?; + +                let mut unused_elements = Vec::new(); + +                let param_body = if let Some(param_body_raw) = param_body { +                    let deserializer = &mut serde_json::Deserializer::from_str(¶m_body_raw); + +                    let param_body: Option<models::Editgroup> = serde_ignored::deserialize(deserializer, |path| { +                        warn!("Ignoring unknown field in body: {}", path); +                        unused_elements.push(path.to_string()); +                    }).map_err(|e| Response::with((status::BadRequest, format!("Couldn't parse body parameter body - doesn't match schema: {}", e))))?; + +                    param_body +                } else { +                    None +                }; +                let param_body = param_body.ok_or_else(|| Response::with((status::BadRequest, "Missing required body parameter body".to_string())))?; + +                match api.editgroup_post(param_body, context).wait() {                      Ok(rsp) => match rsp {                          EditgroupPostResponse::SuccessfullyCreated(body) => {                              let body_string = serde_json::to_string(&body).expect("impossible to fail to serialize"); @@ -840,7 +863,9 @@ where                              response.headers.set(ContentType(mimetypes::responses::EDITGROUP_POST_SUCCESSFULLY_CREATED.clone()));                              context.x_span_id.as_ref().map(|header| response.headers.set(XSpanId(header.clone()))); - +                            if !unused_elements.is_empty() { +                                response.headers.set(Warning(format!("Ignoring unknown fields in body: {:?}", unused_elements))); +                            }                              Ok(response)                          }                          EditgroupPostResponse::BadRequest(body) => { @@ -850,7 +875,9 @@ where                              response.headers.set(ContentType(mimetypes::responses::EDITGROUP_POST_BAD_REQUEST.clone()));                              context.x_span_id.as_ref().map(|header| response.headers.set(XSpanId(header.clone()))); - +                            if !unused_elements.is_empty() { +                                response.headers.set(Warning(format!("Ignoring unknown fields in body: {:?}", unused_elements))); +                            }                              Ok(response)                          }                          EditgroupPostResponse::GenericError(body) => { @@ -860,7 +887,9 @@ where                              response.headers.set(ContentType(mimetypes::responses::EDITGROUP_POST_GENERIC_ERROR.clone()));                              context.x_span_id.as_ref().map(|header| response.headers.set(XSpanId(header.clone()))); - +                            if !unused_elements.is_empty() { +                                response.headers.set(Warning(format!("Ignoring unknown fields in body: {:?}", unused_elements))); +                            }                              Ok(response)                          }                      },  | 
