aboutsummaryrefslogtreecommitdiff
path: root/src/handlers
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-07-20 10:31:01 -0400
committerCara Salter <cara@devcara.com>2022-07-20 10:31:01 -0400
commit4b616447715b8129ae322341959e1c2bfabbd10e (patch)
tree01c23c8a5e29d2821cdd1047d0ec27a69f8b1138 /src/handlers
parentb98646d8501689072f5624483d258adcbf6fc5c5 (diff)
downloadnccd-4b616447715b8129ae322341959e1c2bfabbd10e.tar.gz
nccd-4b616447715b8129ae322341959e1c2bfabbd10e.zip
emails
also subnet storage
Diffstat (limited to 'src/handlers')
-rw-r--r--src/handlers/auth.rs12
-rw-r--r--src/handlers/mod.rs10
-rw-r--r--src/handlers/nets.rs50
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("/"))
+}