diff options
author | Cara Salter <cara@devcara.com> | 2022-07-20 10:31:01 -0400 |
---|---|---|
committer | Cara Salter <cara@devcara.com> | 2022-07-20 10:31:01 -0400 |
commit | 4b616447715b8129ae322341959e1c2bfabbd10e (patch) | |
tree | 01c23c8a5e29d2821cdd1047d0ec27a69f8b1138 /src/handlers/nets.rs | |
parent | b98646d8501689072f5624483d258adcbf6fc5c5 (diff) | |
download | nccd-4b616447715b8129ae322341959e1c2bfabbd10e.tar.gz nccd-4b616447715b8129ae322341959e1c2bfabbd10e.zip |
emails
also subnet storage
Diffstat (limited to 'src/handlers/nets.rs')
-rw-r--r-- | src/handlers/nets.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/handlers/nets.rs b/src/handlers/nets.rs new file mode 100644 index 0000000..6010787 --- /dev/null +++ b/src/handlers/nets.rs @@ -0,0 +1,50 @@ +use std::sync::Arc; + +use axum::{Extension, Form}; +use axum::response::{Html, IntoResponse, Redirect}; +use axum_extra::extract::PrivateCookieJar; +use sqlx::query; +use sqlx::types::ipnetwork::IpNetwork; +use serde::Deserialize; + +use crate::State; + +use crate::errors::{HtmlResult, ServiceError}; + +use super::auth::get_user_or_403; + +#[derive(Deserialize)] +pub struct NewNetForm { + pub subnet: String, + pub description: String, +} + +pub async fn new(jar: PrivateCookieJar, state: Extension<Arc<State>>) -> Result<Html<Vec<u8>>, ServiceError> { + let mut conn = state.conn.acquire().await?; + + let _ = get_user_or_403(jar, &mut conn).await?; + + let mut buf = Vec::new(); + crate::templates::new_net_html(&mut buf).unwrap(); + + Ok(Html(buf)) +} + +pub async fn new_post(Form(new): Form<NewNetForm>, jar: PrivateCookieJar, state: Extension<Arc<State>>) -> Result<Redirect, ServiceError> { + let mut conn = state.conn.acquire().await?; + + let _ = get_user_or_403(jar, &mut conn).await?; + + let id = ulid::Ulid::new(); + + let cidr: IpNetwork = match new.subnet.parse() { + Ok(c) => c, + Err(e) => { + return Err(ServiceError::Parse(e.to_string())); + } + }; + + query("INSERT INTO networks (subnet, description, id) VALUES ($1, $2, $3)").bind(cidr).bind(new.description).bind(id.to_string()).execute(&mut conn).await?; + + Ok(Redirect::to("/")) +} |