|
@@ -1,33 +1,11 @@
|
|
|
use crate::prelude::*;
|
|
|
+use crate::hello::middleware::Pg;
|
|
|
use serde::Serialize;
|
|
|
-use anansi::{check, prep};
|
|
|
+use anansi::check;
|
|
|
use super::util::get_query;
|
|
|
-use std::borrow::Cow;
|
|
|
-use anansi::db::DbRow;
|
|
|
use rand::Rng;
|
|
|
-use std::fmt::Write;
|
|
|
use tokio_postgres::types::ToSql;
|
|
|
|
|
|
-fn update_statement(num: u16) -> String {
|
|
|
- let mut pl = 1;
|
|
|
- let mut q = "UPDATE world SET randomnumber = CASE id ".to_string();
|
|
|
- for _ in 1..=num {
|
|
|
- let _ = write!(q, "WHEN ${} THEN ${} ", pl, pl + 1);
|
|
|
- pl += 2;
|
|
|
- }
|
|
|
-
|
|
|
- q.push_str("ELSE randomnumber END WHERE id IN (");
|
|
|
-
|
|
|
- for _ in 1..=num {
|
|
|
- let _ = write!(q, "${},", pl);
|
|
|
- pl += 1;
|
|
|
- }
|
|
|
-
|
|
|
- q.pop();
|
|
|
- q.push(')');
|
|
|
- q
|
|
|
-}
|
|
|
-
|
|
|
fn random_num() -> i32 {
|
|
|
rand::thread_rng().gen_range(1..=10_000)
|
|
|
}
|
|
@@ -39,36 +17,36 @@ pub struct World {
|
|
|
}
|
|
|
|
|
|
#[derive(Serialize, Debug)]
|
|
|
-pub struct Fortune {
|
|
|
+pub struct Fortune<'a> {
|
|
|
id: i32,
|
|
|
- message: Cow<'static, str>,
|
|
|
+ message: &'a str,
|
|
|
}
|
|
|
|
|
|
#[base_view]
|
|
|
fn base<R: Request>(_req: &mut R) -> Result<Response> {}
|
|
|
|
|
|
#[viewer]
|
|
|
-impl<R: Request> WorldView<R> {
|
|
|
+impl<R: Request + Pg> WorldView<R> {
|
|
|
+ async fn one_world(req: &R) -> Result<World> {
|
|
|
+ let row = req.get_world().await?;
|
|
|
+ let world = World {
|
|
|
+ id: row.get_i32(0),
|
|
|
+ randomnumber: row.get_i32(1),
|
|
|
+ };
|
|
|
+ Ok(world)
|
|
|
+ }
|
|
|
async fn get_worlds(req: &R) -> Result<Vec<World>> {
|
|
|
let q = get_query(req.params());
|
|
|
let mut worlds = Vec::with_capacity(q as usize);
|
|
|
for _ in 0..q {
|
|
|
- let row = req.get_world().await?;
|
|
|
- let world = World {
|
|
|
- id: row.try_i32("id")?,
|
|
|
- randomnumber: row.try_i32("randomnumber")?,
|
|
|
- };
|
|
|
+ let world = Self::one_world(req).await?;
|
|
|
worlds.push(world);
|
|
|
}
|
|
|
Ok(worlds)
|
|
|
}
|
|
|
#[check(Site::is_visitor)]
|
|
|
pub async fn db(req: &mut R) -> Result<Response> {
|
|
|
- let row = req.get_world().await?;
|
|
|
- let world = World {
|
|
|
- id: row.get_i32(0),
|
|
|
- randomnumber: row.get_i32(1),
|
|
|
- };
|
|
|
+ let world = Self::one_world(req).await?;
|
|
|
Response::json(&world)
|
|
|
}
|
|
|
#[check(Site::is_visitor)]
|
|
@@ -83,11 +61,11 @@ impl<R: Request> WorldView<R> {
|
|
|
let mut fortunes = Vec::with_capacity(rows.len() + 1);
|
|
|
fortunes.push(Fortune {
|
|
|
id: 0,
|
|
|
- message: Cow::Borrowed("Additional fortune added at request time.")
|
|
|
+ message: "Additional fortune added at request time.",
|
|
|
});
|
|
|
fortunes.extend(rows.iter().map(|row| Fortune {
|
|
|
id: row.get(0),
|
|
|
- message: Cow::Owned(row.get(1)),
|
|
|
+ message: row.get(1),
|
|
|
}));
|
|
|
fortunes.sort_by(|it, next| it.message.cmp(&next.message));
|
|
|
}
|
|
@@ -99,7 +77,7 @@ impl<R: Request> WorldView<R> {
|
|
|
for _ in 0..q {
|
|
|
let row = req.get_world().await?;
|
|
|
let world = World {
|
|
|
- id: row.try_i32("id")?,
|
|
|
+ id: row.get_i32(0),
|
|
|
randomnumber: random_num(),
|
|
|
};
|
|
|
worlds.push(world);
|
|
@@ -111,7 +89,7 @@ impl<R: Request> WorldView<R> {
|
|
|
for world in &worlds {
|
|
|
params.push(&world.id);
|
|
|
}
|
|
|
- prep!(req, format!("update{}", q), update_statement(q as u16), params.as_slice(), execute)?;
|
|
|
+ req.update_worlds(q - 1, params.as_slice()).await?;
|
|
|
Response::json(&worlds)
|
|
|
}
|
|
|
#[check(Site::is_visitor)]
|