From 427110836ef10821b9069dff8fb6fd052b672394 Mon Sep 17 00:00:00 2001 From: tuxmain Date: Mon, 28 Feb 2022 23:14:17 +0100 Subject: [PATCH] Fix new ad --- src/queries.rs | 6 +- src/server.rs | 177 +++++++++++++++++++++++++------------------ src/utils.rs | 2 +- templates/group.html | 1 + templates/index.html | 1 + 5 files changed, 109 insertions(+), 78 deletions(-) diff --git a/src/queries.rs b/src/queries.rs index 5c942c8..8cc0698 100644 --- a/src/queries.rs +++ b/src/queries.rs @@ -18,6 +18,7 @@ pub struct NewAdQuery { pub pubkey: String, pub quantity: String, pub title: String, + pub group: String, } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -61,8 +62,3 @@ pub enum AdminQuery { #[serde(rename = "rm_ad")] RmAd(AdminRmAdQuery), } - -#[derive(Debug, Deserialize)] -struct SelectAdQuery { - pub ad: String, -} diff --git a/src/server.rs b/src/server.rs index 72f05ca..39b6fb1 100644 --- a/src/server.rs +++ b/src/server.rs @@ -60,6 +60,14 @@ pub async fn start_server( ) } }); + app.at(&format!("{}g/:group", config.root_url)).post({ + let config = config.clone(); + let templates = templates.clone(); + let dbs = dbs.clone(); + move |req: tide::Request<()>| { + handle_post_index(req, config.clone(), templates.clone(), dbs.clone()) + } + }); app.at(&format!("{}g/:group/:ad", config.root_url)).get({ let config = config.clone(); let templates = templates.clone(); @@ -181,13 +189,16 @@ async fn serve_index<'a>( dbs.ad_by_group .scan_prefix(ROOT_GROUP_ID) .filter_map(|x| { - let (k, ad) = x.ok()?; - let ad_id = - hex::encode(AdId::try_from(&k.as_ref()[16..32]).ok()?); + let (k, _) = x.ok()?; + let ad_id = AdId::try_from(&k.as_ref()[16..32]).ok()?; + let ad_id_hex = hex::encode(&ad_id); Some(AdWithId { - ad: bincode::deserialize::(&ad).ok()?, - selected: selected_ad.map_or(false, |i| i == ad_id), - id: ad_id, + ad: bincode::deserialize::( + &dbs.ad.get(&ad_id).unwrap()?, + ) + .ok()?, + selected: selected_ad.map_or(false, |i| i == ad_id_hex), + id: ad_id_hex, }) }) .collect::>(), @@ -237,15 +248,18 @@ async fn serve_group<'a>( dbs.ad_by_group .scan_prefix(group_id.clone()) .filter_map(|x| { - let (k, ad) = x.ok()?; - let ad_id = hex::encode( - AdId::try_from(&k.as_ref()[16..32]).ok()?, - ); + let (k, _) = x.ok()?; + let ad_id = + AdId::try_from(&k.as_ref()[16..32]).ok()?; + let ad_id_hex = hex::encode(&ad_id); Some(AdWithId { - ad: bincode::deserialize::(&ad).ok()?, + ad: bincode::deserialize::( + &dbs.ad.get(&ad_id).unwrap()?, + ) + .ok()?, selected: selected_ad - .map_or(false, |i| i == ad_id), - id: ad_id, + .map_or(false, |i| i == ad_id_hex), + id: ad_id_hex, }) }) .collect::>(), @@ -330,15 +344,18 @@ async fn serve_admin_group<'a>( dbs.ad_by_group .scan_prefix(group_id.clone()) .filter_map(|x| { - let (k, ad) = x.ok()?; - let ad_id = hex::encode( - AdId::try_from(&k.as_ref()[16..32]).ok()?, - ); + let (k, _) = x.ok()?; + let ad_id = + AdId::try_from(&k.as_ref()[16..32]).ok()?; + let ad_id_hex = hex::encode(&ad_id); Some(AdWithId { - ad: bincode::deserialize::(&ad).ok()?, + ad: bincode::deserialize::( + &dbs.ad.get(&ad_id).unwrap()?, + ) + .ok()?, selected: selected_ad - .map_or(false, |i| i == ad_id), - id: ad_id, + .map_or(false, |i| i == ad_id_hex), + id: ad_id_hex, }) }) .collect::>(), @@ -416,13 +433,16 @@ async fn serve_admin<'a>( dbs.ad_by_group .scan_prefix(ROOT_GROUP_ID) .filter_map(|x| { - let (k, ad) = x.ok()?; - let ad_id = - hex::encode(AdId::try_from(&k.as_ref()[16..32]).ok()?); + let (k, _) = x.ok()?; + let ad_id = AdId::try_from(&k.as_ref()[16..32]).ok()?; + let ad_id_hex = hex::encode(&ad_id); Some(AdWithId { - ad: bincode::deserialize::(&ad).ok()?, - selected: selected_ad.map_or(false, |i| i == ad_id), - id: ad_id, + ad: bincode::deserialize::( + &dbs.ad.get(&ad_id).unwrap()?, + ) + .ok()?, + selected: selected_ad.map_or(false, |i| i == ad_id_hex), + id: ad_id_hex, }) }) .collect::>(), @@ -489,52 +509,65 @@ async fn handle_new_ad( dbs: Dbs, query: NewAdQuery, ) -> tide::Result { - dbs.ad - .insert( - AdId::random(), - bincode::serialize(&Ad { - pubkey: if query.pubkey.is_empty() { - None - } else { - Some(match format_pubkey(&query.pubkey) { - Ok(pubkey) => pubkey, - Err(e) => { - return serve_index( - req, - config, - templates, - dbs, - &[ErrorTemplate { - text: match e { - PubkeyDecodeError::BadChecksum => { - "La somme de contrôle de la clé publique est \ - incorrecte." - } - PubkeyDecodeError::BadFormat => { - "Le format de la clé publique est incorrect." - } - }, - }], - Some(query), - ) - .await - } - }) - }, - author: query.author, - password: Argon2::default() - .hash_password(query.psw.as_bytes(), &SaltString::generate(&mut OsRng)) - .unwrap() - .to_string(), - price: query.price, - quantity: query.quantity, - time: 0, - title: query.title, - }) - .unwrap(), - ) - .unwrap(); - dbs.ad.flush_async().await.unwrap(); + if let Some(Ok(group_id)) = if query.group.is_empty() { + Some(Ok(ROOT_GROUP_ID)) + } else { + dbs.group_by_name + .get(&query.group) + .unwrap() + .map(|o| GroupId::try_from(o.as_ref())) + } { + let ad_id = AdId::random(); + dbs.ad + .insert( + ad_id.clone(), + bincode::serialize(&Ad { + pubkey: if query.pubkey.is_empty() { + None + } else { + Some(match format_pubkey(&query.pubkey) { + Ok(pubkey) => pubkey, + Err(e) => { + return serve_index( + req, + config, + templates, + dbs, + &[ErrorTemplate { + text: match e { + PubkeyDecodeError::BadChecksum => { + "La somme de contrôle de la clé publique est \ + incorrecte." + } + PubkeyDecodeError::BadFormat => { + "Le format de la clé publique est incorrect." + } + }, + }], + Some(query), + ) + .await + } + }) + }, + author: query.author, + password: Argon2::default() + .hash_password(query.psw.as_bytes(), &SaltString::generate(&mut OsRng)) + .unwrap() + .to_string(), + price: query.price, + quantity: query.quantity, + time: 0, + title: query.title, + }) + .unwrap(), + ) + .unwrap(); + dbs.ad_by_group + .insert([group_id, ad_id.0].concat(), &[]) + .unwrap(); + dbs.ad.flush_async().await.unwrap(); + } Ok(tide::Redirect::new(&config.root_url).into()) } diff --git a/src/utils.rs b/src/utils.rs index 5a21427..b6c6ae8 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -14,7 +14,7 @@ pub struct Group { } #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize)] -pub struct AdId([u8; 16]); +pub struct AdId(pub [u8; 16]); impl AdId { pub fn random() -> Self { diff --git a/templates/group.html b/templates/group.html index c2450c2..b8d8441 100644 --- a/templates/group.html +++ b/templates/group.html @@ -76,6 +76,7 @@
+
Nouvelle annonce diff --git a/templates/index.html b/templates/index.html index 91c4535..ad7ceca 100644 --- a/templates/index.html +++ b/templates/index.html @@ -76,6 +76,7 @@ +
Nouvelle annonce