Fix new ad

This commit is contained in:
Pascal Engélibert 2022-02-28 23:14:17 +01:00
parent a9abb885f4
commit 427110836e
Signed by: tuxmain
GPG Key ID: 3504BC6D362F7DCA
5 changed files with 109 additions and 78 deletions

View File

@ -18,6 +18,7 @@ pub struct NewAdQuery {
pub pubkey: String, pub pubkey: String,
pub quantity: String, pub quantity: String,
pub title: String, pub title: String,
pub group: String,
} }
#[derive(Clone, Debug, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Serialize)]
@ -61,8 +62,3 @@ pub enum AdminQuery {
#[serde(rename = "rm_ad")] #[serde(rename = "rm_ad")]
RmAd(AdminRmAdQuery), RmAd(AdminRmAdQuery),
} }
#[derive(Debug, Deserialize)]
struct SelectAdQuery {
pub ad: String,
}

View File

@ -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({ app.at(&format!("{}g/:group/:ad", config.root_url)).get({
let config = config.clone(); let config = config.clone();
let templates = templates.clone(); let templates = templates.clone();
@ -181,13 +189,16 @@ async fn serve_index<'a>(
dbs.ad_by_group dbs.ad_by_group
.scan_prefix(ROOT_GROUP_ID) .scan_prefix(ROOT_GROUP_ID)
.filter_map(|x| { .filter_map(|x| {
let (k, ad) = x.ok()?; let (k, _) = x.ok()?;
let ad_id = let ad_id = AdId::try_from(&k.as_ref()[16..32]).ok()?;
hex::encode(AdId::try_from(&k.as_ref()[16..32]).ok()?); let ad_id_hex = hex::encode(&ad_id);
Some(AdWithId { Some(AdWithId {
ad: bincode::deserialize::<Ad>(&ad).ok()?, ad: bincode::deserialize::<Ad>(
selected: selected_ad.map_or(false, |i| i == ad_id), &dbs.ad.get(&ad_id).unwrap()?,
id: ad_id, )
.ok()?,
selected: selected_ad.map_or(false, |i| i == ad_id_hex),
id: ad_id_hex,
}) })
}) })
.collect::<Vec<AdWithId>>(), .collect::<Vec<AdWithId>>(),
@ -237,15 +248,18 @@ async fn serve_group<'a>(
dbs.ad_by_group dbs.ad_by_group
.scan_prefix(group_id.clone()) .scan_prefix(group_id.clone())
.filter_map(|x| { .filter_map(|x| {
let (k, ad) = x.ok()?; let (k, _) = x.ok()?;
let ad_id = hex::encode( let ad_id =
AdId::try_from(&k.as_ref()[16..32]).ok()?, AdId::try_from(&k.as_ref()[16..32]).ok()?;
); let ad_id_hex = hex::encode(&ad_id);
Some(AdWithId { Some(AdWithId {
ad: bincode::deserialize::<Ad>(&ad).ok()?, ad: bincode::deserialize::<Ad>(
&dbs.ad.get(&ad_id).unwrap()?,
)
.ok()?,
selected: selected_ad selected: selected_ad
.map_or(false, |i| i == ad_id), .map_or(false, |i| i == ad_id_hex),
id: ad_id, id: ad_id_hex,
}) })
}) })
.collect::<Vec<AdWithId>>(), .collect::<Vec<AdWithId>>(),
@ -330,15 +344,18 @@ async fn serve_admin_group<'a>(
dbs.ad_by_group dbs.ad_by_group
.scan_prefix(group_id.clone()) .scan_prefix(group_id.clone())
.filter_map(|x| { .filter_map(|x| {
let (k, ad) = x.ok()?; let (k, _) = x.ok()?;
let ad_id = hex::encode( let ad_id =
AdId::try_from(&k.as_ref()[16..32]).ok()?, AdId::try_from(&k.as_ref()[16..32]).ok()?;
); let ad_id_hex = hex::encode(&ad_id);
Some(AdWithId { Some(AdWithId {
ad: bincode::deserialize::<Ad>(&ad).ok()?, ad: bincode::deserialize::<Ad>(
&dbs.ad.get(&ad_id).unwrap()?,
)
.ok()?,
selected: selected_ad selected: selected_ad
.map_or(false, |i| i == ad_id), .map_or(false, |i| i == ad_id_hex),
id: ad_id, id: ad_id_hex,
}) })
}) })
.collect::<Vec<AdWithId>>(), .collect::<Vec<AdWithId>>(),
@ -416,13 +433,16 @@ async fn serve_admin<'a>(
dbs.ad_by_group dbs.ad_by_group
.scan_prefix(ROOT_GROUP_ID) .scan_prefix(ROOT_GROUP_ID)
.filter_map(|x| { .filter_map(|x| {
let (k, ad) = x.ok()?; let (k, _) = x.ok()?;
let ad_id = let ad_id = AdId::try_from(&k.as_ref()[16..32]).ok()?;
hex::encode(AdId::try_from(&k.as_ref()[16..32]).ok()?); let ad_id_hex = hex::encode(&ad_id);
Some(AdWithId { Some(AdWithId {
ad: bincode::deserialize::<Ad>(&ad).ok()?, ad: bincode::deserialize::<Ad>(
selected: selected_ad.map_or(false, |i| i == ad_id), &dbs.ad.get(&ad_id).unwrap()?,
id: ad_id, )
.ok()?,
selected: selected_ad.map_or(false, |i| i == ad_id_hex),
id: ad_id_hex,
}) })
}) })
.collect::<Vec<AdWithId>>(), .collect::<Vec<AdWithId>>(),
@ -489,9 +509,18 @@ async fn handle_new_ad(
dbs: Dbs, dbs: Dbs,
query: NewAdQuery, query: NewAdQuery,
) -> tide::Result<tide::Response> { ) -> tide::Result<tide::Response> {
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 dbs.ad
.insert( .insert(
AdId::random(), ad_id.clone(),
bincode::serialize(&Ad { bincode::serialize(&Ad {
pubkey: if query.pubkey.is_empty() { pubkey: if query.pubkey.is_empty() {
None None
@ -534,7 +563,11 @@ async fn handle_new_ad(
.unwrap(), .unwrap(),
) )
.unwrap(); .unwrap();
dbs.ad_by_group
.insert([group_id, ad_id.0].concat(), &[])
.unwrap();
dbs.ad.flush_async().await.unwrap(); dbs.ad.flush_async().await.unwrap();
}
Ok(tide::Redirect::new(&config.root_url).into()) Ok(tide::Redirect::new(&config.root_url).into())
} }

View File

@ -14,7 +14,7 @@ pub struct Group {
} }
#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize)] #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize)]
pub struct AdId([u8; 16]); pub struct AdId(pub [u8; 16]);
impl AdId { impl AdId {
pub fn random() -> Self { pub fn random() -> Self {

View File

@ -76,6 +76,7 @@
<form method="post"> <form method="post">
<input type="hidden" name="a" value="new_ad" autocomplete="off"/> <input type="hidden" name="a" value="new_ad" autocomplete="off"/>
<input type="hidden" name="group" value="{{group.name}}" autocomplete="off"/>
<fieldset> <fieldset>
<legend>Nouvelle annonce</legend> <legend>Nouvelle annonce</legend>
<label for="f_new_title">Titre&nbsp;:</label> <label for="f_new_title">Titre&nbsp;:</label>

View File

@ -76,6 +76,7 @@
<form method="post"> <form method="post">
<input type="hidden" name="a" value="new_ad" autocomplete="off"/> <input type="hidden" name="a" value="new_ad" autocomplete="off"/>
<input type="hidden" name="group" value="" autocomplete="off"/>
<fieldset> <fieldset>
<legend>Nouvelle annonce</legend> <legend>Nouvelle annonce</legend>
<label for="f_new_title">Titre&nbsp;:</label> <label for="f_new_title">Titre&nbsp;:</label>