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;
#[derive(Deserialize)]
pub struct RegisterForm {
#[serde(rename_all = "lowercase")]
enum Action {
Register,
Update,
Delete,
}
#[derive(Deserialize)]
pub struct ChangeForm {
action: Action,
macaddr: String,
descr: String,
privacy: i8,
}
impl RegisterForm {
impl ChangeForm {
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) {
Ok(privacy) => privacy,
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()),
};
}
}
#[derive(Deserialize)]
pub struct UpdateForm {
macaddr: String,
descr: String,
privacy: i8,
}
impl UpdateForm {
pub async fn handle(self, request: &crate::Request) -> Message {
pub async fn update(self, request: &crate::Request) -> Message {
let mut device = match db::Device::for_mac(&self.macaddr)
.fetch_one(&request.state().pool)
.await
@ -77,15 +85,8 @@ impl UpdateForm {
Err(_) => (Level::Error, "unable to update device".to_string()),
}
}
}
#[derive(Deserialize)]
pub struct DeleteForm {
macaddr: String,
}
impl DeleteForm {
pub async fn handle(self, request: &crate::Request) -> Message {
pub async fn delete(self, request: &crate::Request) -> Message {
let device = match db::Device::for_mac(&self.macaddr)
.fetch_one(&request.state().pool)
.await

View file

@ -62,9 +62,7 @@ async fn main() -> Result<(), io::Error> {
let mut app = tide::with_state(State { pool });
app.with(session_store);
app.at("/").get(routes::index);
app.at("/register").post(routes::register);
app.at("/update").post(routes::update);
app.at("/delete").post(routes::delete);
app.at("/change").post(routes::change);
app.at("/healthz").get(routes::healthz);
app.at("/static").serve_dir("static/")?;
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())
}
pub async fn register(mut request: crate::Request) -> tide::Result {
let form: forms::RegisterForm = 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?;
pub async fn change(mut request: crate::Request) -> tide::Result {
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())

View file

@ -15,7 +15,7 @@
<h1 class="text-xl underline text-center p-2">
macnickenson
</h1>
<div>
<div class="p-2">
{% for message in messages %}
{{ message.1 }}
{% endfor %}
@ -24,7 +24,7 @@
<div class="p-2">
<h2 class="underline">Your Devices:</h2>
{% 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="font-mono">
{{ device.macaddr }} {{ device.present }}
@ -58,7 +58,7 @@
class="rounded bg-gray-300 font-bold px-2 bg-green-500">
Update
</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">
Delete
</button>
@ -70,7 +70,7 @@
<div class="p-2">
<h2 class="underline">Unregistred Devices:</h2>
{% 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="font-mono">
{{ device.macaddr }}
@ -92,7 +92,7 @@
</div>
<div>
<button class="rounded bg-gray-300 font-bold px-2 bg-blue-300"
type="submit">
name="action" value="register" type="submit">
Register
</button>
</div>