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 | |
parent | b98646d8501689072f5624483d258adcbf6fc5c5 (diff) | |
download | nccd-4b616447715b8129ae322341959e1c2bfabbd10e.tar.gz nccd-4b616447715b8129ae322341959e1c2bfabbd10e.zip |
emails
also subnet storage
Diffstat (limited to 'src/handlers')
-rw-r--r-- | src/handlers/auth.rs | 12 | ||||
-rw-r--r-- | src/handlers/mod.rs | 10 | ||||
-rw-r--r-- | src/handlers/nets.rs | 50 |
3 files changed, 71 insertions, 1 deletions
diff --git a/src/handlers/auth.rs b/src/handlers/auth.rs index c00fb8d..ab72bc8 100644 --- a/src/handlers/auth.rs +++ b/src/handlers/auth.rs @@ -82,6 +82,18 @@ pub async fn register_post(Form(reg): Form<RegisterForm>, state: Extension<Arc<S Ok(Redirect::to("/dash/auth/login")) } +pub async fn logout_post(jar: PrivateCookieJar) -> Result<(PrivateCookieJar, Redirect), ServiceError> { + if let Some(id) = jar.get("user-id") { + debug!("Found user {}", id); + + let updated_jar = jar.remove(id); + + Ok((updated_jar, Redirect::to("/dash/auth/login"))) + } else { + Ok((jar, Redirect::to("/"))) + } +} + #[instrument] pub async fn get_user_or_403(jar: PrivateCookieJar, conn: &mut PoolConnection<Postgres>) -> Result<DbUser, ServiceError> { debug!("Starting middleware get_user_or_403"); diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index b83d83c..24db540 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,11 +1,13 @@ -use axum::{Router, routing::get}; +use axum::{Router, routing::{get, post}}; pub mod auth; +mod nets; pub async fn gen_routers() -> Router { Router::new() .nest("/auth", auth_routes().await) + .nest("/nets", net_routes().await) } async fn auth_routes() -> Router { @@ -13,4 +15,10 @@ async fn auth_routes() -> Router { Router::new() .route("/login", get(auth::login).post(auth::login_post)) .route("/register", get(auth::register).post(auth::register_post)) + .route("/logout", post(auth::logout_post)) +} + +async fn net_routes() -> Router { + Router::new() + .route("/new", get(nets::new).post(nets::new_post)) } 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("/")) +} |