freechat/json-api/src/badges.rs
shockrah 0e607eac1d -* Removing ugle tuple indexing with some cleaner binds
- Removing warning of unused var
+ Adding 404 response to /badge/update/name when the badge_id isn't real
2021-06-07 23:57:41 -07:00

144 lines
5.1 KiB
Rust

use crate::{db, qs_param, http::set_json_body};
use std::collections::HashMap;
use mysql_async::Pool;
use hyper::{Response, StatusCode, Body};
use serde_json::json;
pub async fn new(p: &Pool, response: &mut Response<Body>, params: HashMap<String, String>) {
// Only name is really required the other two can default to white/
let name = qs_param!(params, "badge_name", String);
let perms = match qs_param!(params, "badge_perms", u64) {
Some(perms) => perms,
None => 0
};
let color = match qs_param!(params, "badge_color", u32) {
Some(color) => color,
None => 0xffffffff,
};
if let Some(name) = name {
match db::badges::add(p, &name, color, perms).await {
Ok(badge) => {
set_json_body(response, json!({"badge": json!(badge)}));
// TODO: add some rtc notification here
},
Err(e) => {
eprintln!("[HTTP][ERROR] /badge/new {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
};
} else {
*response.status_mut() = StatusCode::BAD_REQUEST;
}
}
pub async fn update_perms(p: &Pool, response: &mut Response<Body>, params: HashMap<String, String>) {
let id = qs_param!(params, "badge_id", u64);
let perms = qs_param!(params, "badge_perms", u64);
if let (Some(id), Some(perms)) = (id, perms) {
match db::badges::update_perms(p, id, perms).await {
// TODO: add rtc update here
Ok(true) => {
#[cfg(feature = "rtc")]
{
let payload = json!({ "id": id, "perms": perms});
set_json_body(response, json!({"badge-update": payload}));
}
},
Ok(false) => {
*response.status_mut() = StatusCode::NOT_FOUND;
},
Err(e) => {
eprintln!("[HTTP][ERROR] /badge/update/perms {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
}
} else {
*response.status_mut() = StatusCode::BAD_REQUEST;
}
}
pub async fn update_color(p: &Pool, response: &mut Response<Body>, params: HashMap<String, String>) {
let id = qs_param!(params, "badge_id", u64);
let color = qs_param!(params, "badge_color", u32);
if let (Some(id), Some(color)) = (id, color) {
match db::badges::update_color(p, id, color).await {
Ok(true) => {
// NOTE: this response iss more meant for rtc as the non-rtc mode
// isn't supposed respond with anything in particular
// TODO: rtc update here
#[cfg(feature = "rtc")]
{
let payload = json!({"id": id, "color": color});
set_json_body(response, json!({"badge-update": payload}));
}
},
Ok(false) => {
*response.status_mut() = StatusCode::NOT_FOUND;
},
Err(e) => {
eprintln!("[HTTP][ERROR] /badge/update/color {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
}
} else {
*response.status_mut() = StatusCode::BAD_REQUEST;
}
}
pub async fn update_name(p: &Pool, response: &mut Response<Body>, params: HashMap<String, String>) {
let id = qs_param!(params, "badge_id", u64);
let name = qs_param!(params, "badge_name", String);
if let (Some(id), Some(name)) = (id, name) {
match db::badges::update_name(p, id, &name).await {
Ok(true) => {
#[cfg(feature = "rtc")]
{
let payload = json!({"id": id, "name": name});
set_json_body(response, json!({"badge-update": payload}));
}
},
Ok(false) => {
*response.status_mut() = StatusCode::NOT_FOUND;
},
Err(e) => {
eprintln!("[HTTP][ERROR] /badges/update/name {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
}
} else {
*response.status_mut() = StatusCode::BAD_REQUEST;
}
}
pub async fn delete(p: &Pool, response: &mut Response<Body>, params: HashMap<String, String>) {
if let Some(id) = qs_param!(params, "badge_id", u64) {
match db::badges::delete(p, id).await {
Ok(_id) => {
// TODO: add rtc notification here
},
Err(e) => {
eprintln!("[HTTP][ERROR] /badge/delete {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
}
} else {
*response.status_mut() = StatusCode::BAD_REQUEST;
}
}
pub async fn list(p: &Pool, response: &mut Response<Body>) {
match db::badges::list(p).await {
Ok(badges) => {
set_json_body(response, json!({"badges": json!(badges)}));
},
Err(e) => {
eprintln!("[HTTP][ERRO] /badge/list {}", e);
*response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
}
}
}