rewrote for single formhandler

This commit is contained in:
Stefan Schwarz 2020-08-20 23:25:56 +02:00
parent a1abfad8d6
commit cf185c833b
4 changed files with 29 additions and 44 deletions

View file

@ -6,14 +6,31 @@ use serde::Deserialize;
use std::convert::TryFrom; use std::convert::TryFrom;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct RegisterForm { #[serde(rename_all = "lowercase")]
enum Action {
Register,
Update,
Delete,
}
#[derive(Deserialize)]
pub struct ChangeForm {
action: Action,
macaddr: String, macaddr: String,
descr: String, descr: String,
privacy: i8, privacy: i8,
} }
impl RegisterForm { impl ChangeForm {
pub async fn handle(self, request: &crate::Request) -> Message { pub async fn handle(self, request: &crate::Request) -> Message {
match self.action {
Action::Register => self.register(request).await,
Action::Update => self.update(request).await,
Action::Delete => self.delete(request).await,
}
}
pub async fn register(self, request: &crate::Request) -> Message {
let privacy = match db::PrivacyLevel::try_from(self.privacy) { let privacy = match db::PrivacyLevel::try_from(self.privacy) {
Ok(privacy) => privacy, Ok(privacy) => privacy,
Err(_) => return (Level::Error, "unable to parse privacy level".to_string()), Err(_) => return (Level::Error, "unable to parse privacy level".to_string()),
@ -39,17 +56,8 @@ impl RegisterForm {
Err(_) => (Level::Error, "unable to create device".to_string()), Err(_) => (Level::Error, "unable to create device".to_string()),
}; };
} }
}
#[derive(Deserialize)] pub async fn update(self, request: &crate::Request) -> Message {
pub struct UpdateForm {
macaddr: String,
descr: String,
privacy: i8,
}
impl UpdateForm {
pub async fn handle(self, request: &crate::Request) -> Message {
let mut device = match db::Device::for_mac(&self.macaddr) let mut device = match db::Device::for_mac(&self.macaddr)
.fetch_one(&request.state().pool) .fetch_one(&request.state().pool)
.await .await
@ -77,15 +85,8 @@ impl UpdateForm {
Err(_) => (Level::Error, "unable to update device".to_string()), Err(_) => (Level::Error, "unable to update device".to_string()),
} }
} }
}
#[derive(Deserialize)] pub async fn delete(self, request: &crate::Request) -> Message {
pub struct DeleteForm {
macaddr: String,
}
impl DeleteForm {
pub async fn handle(self, request: &crate::Request) -> Message {
let device = match db::Device::for_mac(&self.macaddr) let device = match db::Device::for_mac(&self.macaddr)
.fetch_one(&request.state().pool) .fetch_one(&request.state().pool)
.await .await

View file

@ -62,9 +62,7 @@ async fn main() -> Result<(), io::Error> {
let mut app = tide::with_state(State { pool }); let mut app = tide::with_state(State { pool });
app.with(session_store); app.with(session_store);
app.at("/").get(routes::index); app.at("/").get(routes::index);
app.at("/register").post(routes::register); app.at("/change").post(routes::change);
app.at("/update").post(routes::update);
app.at("/delete").post(routes::delete);
app.at("/healthz").get(routes::healthz); app.at("/healthz").get(routes::healthz);
app.at("/static").serve_dir("static/")?; app.at("/static").serve_dir("static/")?;
app.listen(config.listen).await app.listen(config.listen).await

View file

@ -22,22 +22,8 @@ pub async fn index(mut request: crate::Request) -> tide::Result {
Ok(templates::IndexTemplate::new(my, unassinged, messages).into()) Ok(templates::IndexTemplate::new(my, unassinged, messages).into())
} }
pub async fn register(mut request: crate::Request) -> tide::Result { pub async fn change(mut request: crate::Request) -> tide::Result {
let form: forms::RegisterForm = request.body_form().await?; let form: forms::ChangeForm = request.body_form().await?;
let message = form.handle(&request).await;
Session::from(&mut request).add_message(message);
Ok(Redirect::see_other("/").into())
}
pub async fn update(mut request: crate::Request) -> tide::Result {
let form: forms::UpdateForm = request.body_form().await?;
let message = form.handle(&request).await;
Session::from(&mut request).add_message(message);
Ok(Redirect::see_other("/").into())
}
pub async fn delete(mut request: crate::Request) -> tide::Result {
let form: forms::DeleteForm = request.body_form().await?;
let message = form.handle(&request).await; let message = form.handle(&request).await;
Session::from(&mut request).add_message(message); Session::from(&mut request).add_message(message);
Ok(Redirect::see_other("/").into()) Ok(Redirect::see_other("/").into())

View file

@ -15,7 +15,7 @@
<h1 class="text-xl underline text-center p-2"> <h1 class="text-xl underline text-center p-2">
macnickenson macnickenson
</h1> </h1>
<div> <div class="p-2">
{% for message in messages %} {% for message in messages %}
{{ message.1 }} {{ message.1 }}
{% endfor %} {% endfor %}
@ -24,7 +24,7 @@
<div class="p-2"> <div class="p-2">
<h2 class="underline">Your Devices:</h2> <h2 class="underline">Your Devices:</h2>
{% for device in my %} {% for device in my %}
<form action="/update" method="POST"> <form action="/change" method="POST">
<div class="grid grid-cols-3 grid-gap-1"> <div class="grid grid-cols-3 grid-gap-1">
<div class="font-mono"> <div class="font-mono">
{{ device.macaddr }} {{ device.present }} {{ device.macaddr }} {{ device.present }}
@ -58,7 +58,7 @@
class="rounded bg-gray-300 font-bold px-2 bg-green-500"> class="rounded bg-gray-300 font-bold px-2 bg-green-500">
Update Update
</button> </button>
<button type="submit"name="action" value="update" <button type="submit"name="action" value="delete"
class="rounded bg-gray-300 font-bold px-2 bg-red-500"> class="rounded bg-gray-300 font-bold px-2 bg-red-500">
Delete Delete
</button> </button>
@ -70,7 +70,7 @@
<div class="p-2"> <div class="p-2">
<h2 class="underline">Unregistred Devices:</h2> <h2 class="underline">Unregistred Devices:</h2>
{% for device in unassinged %} {% for device in unassinged %}
<form action="/register" method="POST"> <form action="/change" method="POST">
<div class="grid grid-cols-4 grid-gap-1 p-2"> <div class="grid grid-cols-4 grid-gap-1 p-2">
<div class="font-mono"> <div class="font-mono">
{{ device.macaddr }} {{ device.macaddr }}
@ -92,7 +92,7 @@
</div> </div>
<div> <div>
<button class="rounded bg-gray-300 font-bold px-2 bg-blue-300" <button class="rounded bg-gray-300 font-bold px-2 bg-blue-300"
type="submit"> name="action" value="register" type="submit">
Register Register
</button> </button>
</div> </div>