More work on todo list support
This commit is contained in:
@ -45,4 +45,5 @@ lazy_static! {
|
||||
.map(|inner| inner.parse::<u32>().ok())
|
||||
.flatten()
|
||||
.unwrap_or(600);
|
||||
pub static ref SALT: String = env::var("SALT").unwrap();
|
||||
}
|
||||
|
@ -5,6 +5,46 @@ mod catchers;
|
||||
mod guards;
|
||||
mod metrics;
|
||||
mod routes;
|
||||
pub mod string {
|
||||
use std::{fmt::Display, str::FromStr};
|
||||
|
||||
use serde::{de, Deserialize, Deserializer, Serializer};
|
||||
|
||||
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
T: Display,
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.collect_str(value)
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
|
||||
where
|
||||
T: FromStr,
|
||||
T::Err: Display,
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
String::deserialize(deserializer)?.parse().map_err(de::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
pub mod string_opt {
|
||||
use std::fmt::Display;
|
||||
|
||||
use serde::{Deserializer, Serializer};
|
||||
|
||||
pub fn serialize<T, S>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
T: Display,
|
||||
S: Serializer,
|
||||
{
|
||||
if let Some(v) = value {
|
||||
serializer.collect_str(v)
|
||||
} else {
|
||||
serializer.serialize_none()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
use std::{env, path::Path};
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
use log::warn;
|
||||
use rocket::{
|
||||
delete, get,
|
||||
http::CookieJar,
|
||||
@ -5,13 +6,23 @@ use rocket::{
|
||||
serde::json::{json, Json},
|
||||
State,
|
||||
};
|
||||
use serde::Deserialize;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serenity::prelude::Context;
|
||||
|
||||
use crate::web::{check_authorization, guards::transaction::Transaction, routes::JsonResult};
|
||||
use crate::web::{
|
||||
check_authorization, guards::transaction::Transaction, routes::JsonResult, string_opt,
|
||||
};
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct CreateTodo {
|
||||
pub struct CreateTodo {
|
||||
channel_id: Option<u64>,
|
||||
value: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct GetTodo {
|
||||
id: u32,
|
||||
#[serde(with = "string_opt")]
|
||||
channel_id: Option<u64>,
|
||||
value: String,
|
||||
}
|
||||
@ -38,7 +49,30 @@ pub async fn get_todo(
|
||||
) -> JsonResult {
|
||||
check_authorization(cookies, ctx.inner(), id).await?;
|
||||
|
||||
Ok(json!([]))
|
||||
let todos = sqlx::query_as!(
|
||||
GetTodo,
|
||||
"
|
||||
SELECT
|
||||
todos.id,
|
||||
channels.channel AS channel_id,
|
||||
value
|
||||
FROM todos
|
||||
INNER JOIN guilds
|
||||
ON guilds.id = todos.guild_id
|
||||
LEFT JOIN channels
|
||||
ON channels.id = todos.channel_id
|
||||
WHERE guilds.guild = ?
|
||||
",
|
||||
id
|
||||
)
|
||||
.fetch_all(transaction.executor())
|
||||
.await
|
||||
.map_err(|e| {
|
||||
warn!("Error fetching todos: {:?}", e);
|
||||
json!({ "errors": vec!["Unknown error"] })
|
||||
})?;
|
||||
|
||||
Ok(json!(todos))
|
||||
}
|
||||
|
||||
#[patch("/api/guild/<id>/todos")]
|
||||
|
@ -29,7 +29,7 @@ use crate::web::{
|
||||
},
|
||||
guards::transaction::Transaction,
|
||||
routes::JsonResult,
|
||||
Error,
|
||||
string, Error,
|
||||
};
|
||||
|
||||
pub mod api;
|
||||
@ -348,30 +348,6 @@ where
|
||||
Ok(Some(Option::deserialize(deserializer)?))
|
||||
}
|
||||
|
||||
// https://github.com/serde-rs/json/issues/329#issuecomment-305608405
|
||||
mod string {
|
||||
use std::{fmt::Display, str::FromStr};
|
||||
|
||||
use serde::{de, Deserialize, Deserializer, Serializer};
|
||||
|
||||
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
T: Display,
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.collect_str(value)
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
|
||||
where
|
||||
T: FromStr,
|
||||
T::Err: Display,
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
String::deserialize(deserializer)?.parse().map_err(de::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct DeleteReminder {
|
||||
uid: String,
|
||||
|
Reference in New Issue
Block a user