use serde_json::{Value, json}; use serde::Serialize; use rocket::http::{Status}; use rocket::http::uri::Origin; use rocket::form::Form; use crate::template::Template; use crate::models; use crate::controllers; use crate::DbConn; use crate::dns::ZoneConnector; #[derive(Serialize)] pub struct RecordsPage { zone: String } // TODO: Check if origin changes if application mounted on different path #[get("/zone//records")] pub async fn get_zone_records_page(user_info: models::UserInfo, zone: models::AbsoluteName, conn: DbConn, origin: &Origin<'_>) -> Result, Status> { let zone_name = zone.to_utf8(); 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, Status> { let zones = controllers::get_zones( &conn, user_info ).await.map_err(|e| e.status)?; Ok(Template::new( "pages/zones.html", json!({ "zones": zones, "nav_page": origin.clone().into_normalized().path().as_str(), "nav_sections": vec!["zones"], }) )) } #[get("/zones/new")] pub async fn get_create_zone_page( conn: DbConn, user_info: models::UserInfo, origin: &Origin<'_> ) -> Result, 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::, "zones": zones, "error": None::, "nav_page": origin.clone().into_normalized().path().as_str(), "nav_sections": vec!["zones", "_new-zone"], }) )) } #[post("/zones/new", data = "")] pub async fn post_create_zone_page( conn: DbConn, dns_api: Box, user_info: models::UserInfo, zone_request: Form, origin: &Origin<'_> ) -> Result, 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::, "nav_page": origin.clone().into_normalized().path().as_str(), "nav_sections": vec!["zones", "_new-zone"], }) )) }