From 148178a344dd42ccf00356cad06f4e635e78bda7 Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Sun, 6 Mar 2022 16:53:02 +0100 Subject: [PATCH] return descriptive errors when saving bots --- planetwars-server/src/routes/bots.rs | 30 +++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/planetwars-server/src/routes/bots.rs b/planetwars-server/src/routes/bots.rs index 6a5612a..c9bf8ce 100644 --- a/planetwars-server/src/routes/bots.rs +++ b/planetwars-server/src/routes/bots.rs @@ -1,11 +1,13 @@ +use axum::body; use axum::extract::{Multipart, Path}; use axum::http::StatusCode; +use axum::response::{IntoResponse, Response}; use axum::Json; use diesel::OptionalExtension; use rand::distributions::Alphanumeric; use rand::Rng; use serde::{Deserialize, Serialize}; -use serde_json::{json, value::Value as JsonValue}; +use serde_json::{self, json, value::Value as JsonValue}; use std::io::Cursor; use std::path::PathBuf; @@ -20,16 +22,38 @@ pub struct SaveBotParams { pub bot_name: String, pub code: String, } + +pub enum SaveBotError { + BotNameTaken, +} + +impl IntoResponse for SaveBotError { + fn into_response(self) -> Response { + let (status, value) = match self { + SaveBotError::BotNameTaken => { + (StatusCode::FORBIDDEN, json!({ "error": "BotNameTaken" })) + } + }; + + let encoded = serde_json::to_vec(&value).expect("could not encode response value"); + + Response::builder() + .status(status) + .body(body::boxed(body::Full::from(encoded))) + .expect("could not build response") + } +} + pub async fn save_bot( Json(params): Json, conn: DatabaseConnection, -) -> Result, StatusCode> { +) -> Result, SaveBotError> { // TODO: authorization let res = bots::find_bot_by_name(¶ms.bot_name, &conn) .optional() .expect("could not run query"); let bot = match res { - Some(_bot) => return Err(StatusCode::FORBIDDEN), + Some(_bot) => return Err(SaveBotError::BotNameTaken), None => { let new_bot = bots::NewBot { owner_id: None,