+ First pass of db backend and API handlers for badges module
It should be noted that /badge/update needs some more planning so 1 more commit is justified for it as some consideration must be taken for how individual badge permissions are going to be handled
This commit is contained in:
80
json-api/db/src/badges.rs
Normal file
80
json-api/db/src/badges.rs
Normal file
@@ -0,0 +1,80 @@
|
||||
use crate::Badge;
|
||||
use mysql_async::prelude::Queryable;
|
||||
use mysql_async::{params, Pool, Result as SqlResult};
|
||||
use rand::RngCore;
|
||||
|
||||
pub async fn add(pool: &Pool, name: &str, color: u32, perms: u64) -> SqlResult<Badge>{
|
||||
// First gather the parameters required for the query
|
||||
let id = rand::rngs::OsRng.next_u64();
|
||||
|
||||
let mut conn = pool.get_conn().await?;
|
||||
let q = "INSERT INTO badges (id, name, color, permissions)
|
||||
VALUES(:id, :name, :color, :perms)";
|
||||
let sqlparams = params!{
|
||||
"id" => id,
|
||||
"name" => name,
|
||||
"color" => color,
|
||||
"perms" => perms
|
||||
};
|
||||
conn.exec_drop(q, sqlparams).await?;
|
||||
Ok(Badge{
|
||||
id,
|
||||
name: String::from(name),
|
||||
color,
|
||||
perms
|
||||
})
|
||||
}
|
||||
|
||||
pub async fn delete(pool: &Pool, id: u64) -> SqlResult<u64> {
|
||||
let mut conn = pool.get_conn().await?;
|
||||
let q = "DELETE FROM badges WHERE id = :id";
|
||||
conn.exec_drop(q, params!{"id" => id}).await?;
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
async fn get(pool: &Pool, id: u64) -> SqlResult<Option<Badge>> {
|
||||
let mut conn = pool.get_conn().await?;
|
||||
let q = "SELECT name, color, permissions FROM badges WHERE id = :id";
|
||||
let row: Option<(String, u32, u64)> = conn.exec_first(q, params!{ "id" => id}).await?;
|
||||
match row {
|
||||
Some(row) => {
|
||||
let b = Badge {
|
||||
id,
|
||||
name: row.0,
|
||||
color: row.1,
|
||||
perms: row.2,
|
||||
};
|
||||
Ok(Some(b))
|
||||
},
|
||||
None => Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn update(pool: &Pool, badge: Badge) -> SqlResult<Option<Badge>> {
|
||||
// Ok(None) if that badge was not registered anywhere
|
||||
// Ok(Some(Badge)) if that badge was registered
|
||||
if let Ok(None) = get(pool, badge.id).await {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let q = "UPDATE badges SET name = :name, color = :color, permissions = :perms
|
||||
WHERE id = :id";
|
||||
let p = params! {
|
||||
"id" => badge.id,
|
||||
"name" => badge.name.clone(),
|
||||
"color" => badge.color,
|
||||
"perms" => badge.perms
|
||||
};
|
||||
let mut conn = pool.get_conn().await?;
|
||||
conn.exec_drop(q, p).await?;
|
||||
Ok(Some(badge))
|
||||
}
|
||||
|
||||
pub async fn list(pool: &Pool) -> SqlResult<Vec<Badge>> {
|
||||
let q = "SELECT id, name, color, permissions FROM badges";
|
||||
let mut conn = pool.get_conn().await?;
|
||||
let set: Vec<Badge> = conn.exec_map(q, (), |(id, name, color, perms)| {
|
||||
Badge { id, name, color, perms }
|
||||
}).await?;
|
||||
Ok(set)
|
||||
}
|
||||
Reference in New Issue
Block a user