nomilo/src/routes/ui/zones.rs

90 lines
2.5 KiB
Rust
Raw Normal View History

2025-04-01 18:03:15 +00:00
use axum::extract::{Query, Path, State, OriginalUri};
use axum::Extension;
2025-05-11 11:40:35 +00:00
use serde::{Deserialize, Serialize};
2022-04-29 16:04:12 +00:00
use serde_json::{Value, json};
2025-04-01 18:03:15 +00:00
use unic_langid::LanguageIdentifier;
2022-04-29 02:29:10 +00:00
2025-03-31 13:06:33 +00:00
use crate::validation;
2024-12-22 21:36:26 +00:00
use crate::AppState;
use crate::errors::Error;
2022-04-29 02:29:10 +00:00
use crate::template::Template;
2025-03-31 13:06:33 +00:00
use crate::resources::dns::friendly;
2022-04-29 02:29:10 +00:00
2025-03-31 13:06:33 +00:00
pub async fn get_records_page(
2024-12-22 21:36:26 +00:00
Path(zone_name): Path<String>,
State(app): State<AppState>,
2025-04-01 18:03:15 +00:00
OriginalUri(url): OriginalUri,
Extension(lang): Extension<LanguageIdentifier>,
2024-12-22 21:36:26 +00:00
) -> Result<Template<'static, Value>, Error> {
2025-03-31 13:06:33 +00:00
let zone = app.db.get_zone_by_name(&zone_name).await?;
let records = zone.get_records(app.records).await?;
let records = friendly::FriendlyRecords::from(records.clone());
Ok(Template::new(
2024-12-22 21:36:26 +00:00
"pages/records.html",
app.template_engine,
json!({
2025-03-31 13:06:33 +00:00
"current_zone": zone.name,
"records": records,
2025-04-01 18:03:15 +00:00
"url": url.to_string(),
"lang": lang.to_string(),
2025-03-31 13:06:33 +00:00
})
))
}
#[derive(Deserialize)]
pub struct NewRecordQuery {
subdomain: Option<String>,
2025-05-11 11:40:35 +00:00
config: Option<ConfigurationType>,
2025-03-31 13:06:33 +00:00
rtype: Option<friendly::FriendlyRType>,
}
2025-05-11 11:40:35 +00:00
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ConfigurationType {
Mail,
Web,
}
2025-03-31 13:06:33 +00:00
pub async fn get_new_record_page(
Path(zone_name): Path<String>,
State(app): State<AppState>,
Query(params): Query<NewRecordQuery>,
2025-04-01 18:03:15 +00:00
OriginalUri(url): OriginalUri,
Extension(lang): Extension<LanguageIdentifier>,
2025-03-31 13:06:33 +00:00
) -> Result<Template<'static, Value>, Error> {
let zone = app.db.get_zone_by_name(&zone_name).await?;
// Syntax validation of the subdomain
let (name, domain_error) = if let Some(input_name) = params.subdomain {
if input_name.is_empty() {
(Some(zone.name.clone()), None)
} else {
let new_name = format!("{input_name}.{zone_name}");
let res = validation::normalize_domain(&new_name);
match res {
Err(error) => (Some(input_name), Some(error)),
Ok(new_name) => (Some(new_name), None),
}
}
} else {
(None, None)
};
2025-04-01 18:03:15 +00:00
println!("{}", lang);
2025-03-31 13:06:33 +00:00
Ok(Template::new(
"pages/new_record.html",
app.template_engine,
json!({
"current_zone": zone.name,
"new_record_name": name,
"domain_error": domain_error,
"config": params.config,
"rtype": params.rtype,
2025-04-01 18:03:15 +00:00
"url": url.to_string(),
"lang": lang.to_string(),
})
))
}