2022-04-29 16:04:12 +00:00
|
|
|
use serde_json::{Value, json};
|
2022-04-29 02:29:10 +00:00
|
|
|
use serde::Serialize;
|
|
|
|
use rocket::http::{Status};
|
2022-04-29 16:04:12 +00:00
|
|
|
use rocket::http::uri::Origin;
|
2023-02-22 15:28:12 +00:00
|
|
|
use rocket::form::Form;
|
2022-04-29 02:29:10 +00:00
|
|
|
|
|
|
|
use crate::template::Template;
|
|
|
|
use crate::models;
|
2023-02-22 15:28:12 +00:00
|
|
|
use crate::controllers;
|
2022-04-29 02:29:10 +00:00
|
|
|
use crate::DbConn;
|
2023-02-22 15:28:12 +00:00
|
|
|
use crate::dns::ZoneConnector;
|
2022-04-29 02:29:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
#[derive(Serialize)]
|
|
|
|
pub struct RecordsPage {
|
|
|
|
zone: String
|
|
|
|
}
|
|
|
|
|
2022-04-29 16:04:12 +00:00
|
|
|
|
|
|
|
// TODO: Check if origin changes if application mounted on different path
|
2022-04-29 02:29:10 +00:00
|
|
|
#[get("/zone/<zone>/records")]
|
2022-04-29 16:04:12 +00:00
|
|
|
pub async fn get_zone_records_page(user_info: models::UserInfo, zone: models::AbsoluteName, conn: DbConn, origin: &Origin<'_>) -> Result<Template<'static, Value>, Status> {
|
2022-04-29 02:29:10 +00:00
|
|
|
let zone_name = zone.to_utf8();
|
|
|
|
|
2022-04-29 16:04:12 +00:00
|
|
|
let zones = conn.run(move |c| {
|
|
|
|
if user_info.is_admin() {
|
|
|
|
models::Zone::get_by_name(c, &zone_name)?;
|
|
|
|
models::Zone::get_all(c)
|
|
|
|
} else {
|
|
|
|
user_info.get_zone(c, &zone_name)?;
|
|
|
|
user_info.get_zones(c)
|
|
|
|
|
|
|
|
}
|
|
|
|
}).await.map_err(|e| models::ErrorResponse::from(e).status)?;
|
|
|
|
|
|
|
|
|
|
|
|
Ok(Template::new(
|
|
|
|
"pages/zone/records.html",
|
|
|
|
json!({
|
|
|
|
"current_zone": zone.to_utf8(),
|
|
|
|
"zones": zones,
|
|
|
|
"nav_page": origin.clone().into_normalized().path().as_str(),
|
|
|
|
"nav_sections": vec!["zones", zone.to_utf8().as_str()],
|
|
|
|
})
|
|
|
|
))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/zones")]
|
|
|
|
pub async fn get_zones_page(user_info: models::UserInfo, conn: DbConn, origin: &Origin<'_>) -> Result<Template<'static, Value>, Status> {
|
2023-02-22 15:28:12 +00:00
|
|
|
let zones = controllers::get_zones(
|
|
|
|
&conn,
|
|
|
|
user_info
|
|
|
|
).await.map_err(|e| e.status)?;
|
2022-04-29 02:29:10 +00:00
|
|
|
|
2022-04-29 16:04:12 +00:00
|
|
|
Ok(Template::new(
|
|
|
|
"pages/zones.html",
|
|
|
|
json!({
|
|
|
|
"zones": zones,
|
|
|
|
"nav_page": origin.clone().into_normalized().path().as_str(),
|
|
|
|
"nav_sections": vec!["zones"],
|
|
|
|
})
|
|
|
|
))
|
2022-04-29 02:29:10 +00:00
|
|
|
}
|
2023-02-22 15:28:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
#[get("/zones/new")]
|
|
|
|
pub async fn get_create_zone_page(
|
|
|
|
conn: DbConn,
|
|
|
|
user_info: models::UserInfo,
|
|
|
|
origin: &Origin<'_>
|
|
|
|
) -> Result<Template<'static, Value>, Status> {
|
|
|
|
|
|
|
|
user_info
|
|
|
|
.check_admin()
|
|
|
|
.map_err(|e| models::ErrorResponse::from(e).status)?;
|
|
|
|
|
|
|
|
let zones = controllers::get_zones(
|
|
|
|
&conn,
|
|
|
|
user_info
|
|
|
|
).await.map_err(|e| e.status)?;
|
|
|
|
|
|
|
|
Ok(Template::new(
|
|
|
|
"pages/zones/new.html",
|
|
|
|
json!({
|
|
|
|
"zone": None::<models::Zone>,
|
|
|
|
"zones": zones,
|
|
|
|
"error": None::<String>,
|
|
|
|
"nav_page": origin.clone().into_normalized().path().as_str(),
|
|
|
|
"nav_sections": vec!["zones", "_new-zone"],
|
|
|
|
})
|
|
|
|
))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/zones/new", data = "<zone_request>")]
|
|
|
|
pub async fn post_create_zone_page(
|
|
|
|
conn: DbConn,
|
|
|
|
dns_api: Box<dyn ZoneConnector>,
|
|
|
|
user_info: models::UserInfo,
|
|
|
|
zone_request: Form<models::CreateZoneRequest>,
|
|
|
|
origin: &Origin<'_>
|
|
|
|
) -> Result<Template<'static, Value>, Status> {
|
|
|
|
user_info
|
|
|
|
.check_admin()
|
|
|
|
.map_err(|e| models::ErrorResponse::from(e).status)?;
|
|
|
|
|
|
|
|
let zone = controllers::create_zone(
|
|
|
|
&conn,
|
|
|
|
dns_api,
|
|
|
|
user_info.clone(),
|
|
|
|
zone_request.into_inner()
|
|
|
|
).await.map_err(|e| e.status)?;
|
|
|
|
|
|
|
|
let zones = controllers::get_zones(
|
|
|
|
&conn,
|
|
|
|
user_info
|
|
|
|
).await.map_err(|e| e.status)?;
|
|
|
|
|
|
|
|
Ok(Template::new(
|
|
|
|
"pages/zones/new.html",
|
|
|
|
json!({
|
|
|
|
"zone": Some(zone),
|
|
|
|
"zones": zones,
|
|
|
|
"error": None::<String>,
|
|
|
|
"nav_page": origin.clone().into_normalized().path().as_str(),
|
|
|
|
"nav_sections": vec!["zones", "_new-zone"],
|
|
|
|
})
|
|
|
|
))
|
|
|
|
}
|