diff --git a/server-api/db/src/messages.rs b/server-api/db/src/messages.rs index 620bbe4..4b6a7da 100644 --- a/server-api/db/src/messages.rs +++ b/server-api/db/src/messages.rs @@ -124,15 +124,32 @@ impl Message { (time, content, author_id, channel_id) VALUES (:time, :content, :author, :channel)"; let now = Utc::now().timestamp(); - - conn.prep_exec(q, params!{ + + let res = conn.prep_exec(q, params!{ "time" => now, "content" => content, "author" => uid, "channel" => cid - }).await?; + }).await; + if let Err(e) = res { + return match e { + SqlError::Server(err) => { + if err.code == 1452 { + return Ok(Response::RestrictedInput("Channel not found".into())) + } + else { + Ok(Response::Other(sql_err!("db::messages::send"))) + } + }, + _ => Ok(Response::Other(sql_err!("db::messages::send"))) + } + + } + // all good response + else { + return Ok(Response::Empty); + } - return Ok(Response::Empty); } } diff --git a/server-api/src/messages.rs b/server-api/src/messages.rs index d66bc90..51edd70 100644 --- a/server-api/src/messages.rs +++ b/server-api/src/messages.rs @@ -1,6 +1,8 @@ use mysql_async::Pool; use hyper::{Response, Body, StatusCode}; use serde_json::Value; +use hyper::header::HeaderValue; +use serde_json::json; pub async fn send_message(pool: &Pool, response: &mut Response, params: Value) { @@ -19,11 +21,30 @@ pub async fn send_message(pool: &Pool, response: &mut Response, params: Va if let (Some(message), Some(cid)) = (content, channel) { // call returns empty on sucess so we don't need to do anything // TODO: loggin - if let Err(issue) = db::messages::Message::send(pool, message, cid, author).await { + let db_result = db::messages::Message::send(pool, message, cid, author).await; + if let Err(issue) = db_result { *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; eprintln!("\t{}", issue); } - // if there's no issue then we don't need to do anything at all + else { + match db_result.unwrap() { + db::Response::RestrictedInput(msg) => { + // user issue + *response.status_mut() = StatusCode::BAD_REQUEST; + response.headers_mut().insert("Content-Type", + HeaderValue::from_static("application/json")); + + let payload = json!({"msg": msg}); + *response.body_mut() = Body::from(payload.to_string()); + }, + db::Response::Empty => {}, // nothing to do hyper defaults to 200 + db::Response::Other(msg) => { + eprintln!("{}", msg); + *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + }, + _ => *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR + }; + } } else { *response.status_mut() = StatusCode::BAD_REQUEST;