aboutsummaryrefslogtreecommitdiff
path: root/src/handlers/nets.rs
blob: 60107874a53c99f9c516472d6527cd08b3bbc722 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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("/"))
}