add checks on search params

This commit is contained in:
DataHearth 2023-05-24 15:58:11 +02:00
parent bf83807318
commit f397b8bdf9
No known key found for this signature in database
GPG Key ID: E88FD356ACC5F3C4
4 changed files with 30 additions and 13 deletions

12
Cargo.lock generated
View File

@ -929,7 +929,7 @@ dependencies = [
[[package]] [[package]]
name = "polodb_core" name = "polodb_core"
version = "4.3.1" version = "4.3.2"
dependencies = [ dependencies = [
"bson", "bson",
"byteorder", "byteorder",
@ -1035,9 +1035,9 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.8.1" version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" checksum = "d1a59b5d8e97dee33696bf13c5ba8ab85341c002922fba050069326b9c498974"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@ -1046,9 +1046,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.7.1" version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
@ -1357,8 +1357,10 @@ dependencies = [
"once_cell", "once_cell",
"poise", "poise",
"polodb_core", "polodb_core",
"regex",
"serde", "serde",
"tokio", "tokio",
"url",
] ]
[[package]] [[package]]

View File

@ -6,9 +6,10 @@ authors = ["Antoine Langlois <antoine.l@antoine-langlois.net>"]
description = "A Discord bot for the Tech channel" description = "A Discord bot for the Tech channel"
[dependencies] [dependencies]
once_cell = "1.17.1" once_cell = "1.17"
poise = "0.5" poise = "0.5"
polodb_core = { path = "../PoloDB/src/polodb_core" } polodb_core = { path = "../PoloDB/src/polodb_core" }
# polodb_core = "4.2.0" regex = "1.8"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.28.0", features = ["macros", "rt-multi-thread"] } tokio = { version = "1.28", features = ["macros", "rt-multi-thread"] }
url = "2.3"

View File

@ -1,4 +1,5 @@
use poise::command; use poise::command;
use url::Url;
use crate::database::*; use crate::database::*;
@ -52,6 +53,11 @@ pub async fn add(
#[description = "Technology name"] technology: String, #[description = "Technology name"] technology: String,
#[description = "Git repository link"] link: String, #[description = "Git repository link"] link: String,
) -> Result<(), Error> { ) -> Result<(), Error> {
if !Url::parse(&link).is_ok() {
ctx.say(format!("Link {link} is not a valid URL")).await?;
return Ok(());
}
add_tech(link.clone(), technology.clone())?; add_tech(link.clone(), technology.clone())?;
ctx.say(format!("Added {technology} with link {link}",)) ctx.say(format!("Added {technology} with link {link}",))
@ -86,7 +92,7 @@ pub async fn list(ctx: Context<'_>) -> Result<(), Error> {
#[command(slash_command, prefix_command)] #[command(slash_command, prefix_command)]
pub async fn search( pub async fn search(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "Technology name"] technology: String, #[description = "Technology name (can be a regex string)"] technology: String,
#[description = "Regex options"] options: Option<String>, #[description = "Regex options"] options: Option<String>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let found_techs = search_tech(technology, options.map_or(String::new(), |opts| opts))?; let found_techs = search_tech(technology, options.map_or(String::new(), |opts| opts))?;

View File

@ -53,14 +53,22 @@ pub fn list_tech() -> Result<Vec<Technology>, Error> {
} }
pub fn search_tech(name: String, options: String) -> Result<Vec<Technology>, Error> { pub fn search_tech(name: String, options: String) -> Result<Vec<Technology>, Error> {
let doc = if regex::Regex::new(&name).is_ok() {
doc! { "name": {"$regex": Regex {
pattern: name,
options: options,
}} }
} else {
doc! { "name": {
"$eq": name
} }
};
Ok(DB Ok(DB
.get() .get()
.unwrap() .unwrap()
.collection::<Technology>("technologies") .collection::<Technology>("technologies")
.find(doc! { "name": {"$regex": Regex { .find(doc)
pattern: name,
options: options,
}} })
.map_err(|err| Error::new(ErrorKind::InvalidInput, err))? .map_err(|err| Error::new(ErrorKind::InvalidInput, err))?
.map( .map(
|doc| doc.unwrap(), // todo: find a way to handle error |doc| doc.unwrap(), // todo: find a way to handle error