nomilo/src/routes/ui/zones.rs

130 lines
4 KiB
Rust
Raw Normal View History

2025-04-01 18:03:15 +00:00
use axum::extract::{Query, Path, State, OriginalUri};
use axum::Extension;
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-05-13 18:23:26 +00:00
use crate::form::Node;
use crate::macros::append_errors;
2024-12-22 21:36:26 +00:00
use crate::AppState;
2025-05-13 18:23:26 +00:00
use crate::errors::{Error, error_map};
2022-04-29 02:29:10 +00:00
use crate::template::Template;
2025-05-13 18:23:26 +00:00
use crate::resources::dns::friendly::{self, NewRecordQuery, ConfigurationType, FromValue, NewSectionMail, NewSectionWeb, ToInternal};
use crate::resources::dns::internal;
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
})
))
}
2025-05-11 11:40:35 +00:00
2025-03-31 13:06:33 +00:00
pub async fn get_new_record_page(
Path(zone_name): Path<String>,
State(app): State<AppState>,
2025-05-13 18:23:26 +00:00
Query(mut 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?;
2025-05-13 18:23:26 +00:00
let mut errors = Vec::new();
append_errors!(params.validate(&zone.name), errors);
2025-04-01 18:03:15 +00:00
2025-03-31 13:06:33 +00:00
Ok(Template::new(
"pages/new_record.html",
app.template_engine,
json!({
"current_zone": zone.name,
2025-05-13 18:23:26 +00:00
"new_record_name": params.name,
"errors": error_map(errors),
2025-03-31 13:06:33 +00:00
"config": params.config,
"rtype": params.rtype,
2025-04-01 18:03:15 +00:00
"url": url.to_string(),
"lang": lang.to_string(),
})
))
}
2025-05-13 18:23:26 +00:00
pub async fn post_new_record(
Path(zone_name): Path<String>,
State(app): State<AppState>,
Query(mut params): Query<NewRecordQuery>,
OriginalUri(url): OriginalUri,
Extension(lang): Extension<LanguageIdentifier>,
form: Node,
) -> Result<Template<'static, Value>, Error> {
let zone = app.db.get_zone_by_name(&zone_name).await?;
let mut errors = Vec::new();
append_errors!(params.validate(&zone.name), errors);
if !errors.is_empty() || params.name.is_none() || !(params.config.is_none() ^ params.config.is_some()) {
// TODO: return 404
todo!()
}
let name = params.name.clone().unwrap();
let input_data = form.to_json_value();
let new_records = if errors.is_empty() {
let name = internal::Name::new(name);
let new_records = if let Some(config_type) = params.config.clone() {
match config_type {
ConfigurationType::Mail => {
NewSectionMail::from_value(input_data.clone())
.map(|section| section.internal(3600, name))
},
ConfigurationType::Web => {
NewSectionWeb::from_value(input_data.clone())
.map(|section| section.internal(3600, name))
},
}
} else if let Some(_rtype) = params.rtype {
unimplemented!()
} else {
unreachable!()
};
append_errors!(new_records, errors)
} else {
None
};
if !errors.is_empty() {
Ok(Template::new(
"pages/new_record.html",
app.template_engine,
json!({
"current_zone": zone.name,
"new_record_name": params.name,
"input_data": input_data,
"errors": error_map(errors),
"config": params.config,
"rtype": params.rtype,
"url": url.to_string(),
"lang": lang.to_string(),
})
))
} else {
println!("{:#?}", new_records);
todo!()
}
}