use axum::extract::{Path, State}; use axum::Json; use crate::AppState; use crate::errors::Error; use crate::resources::zone::{CreateZoneRequest, Zone}; use crate::resources::record::{AddRecordsRequest, Record, RecordList}; pub async fn create_zone( State(app): State, Json(create_zone): Json, ) -> Result, Error> { Zone::create(create_zone, app.zone, app.db).await.map(Json) } pub async fn get_zone_records( Path(zone_name): Path, State(app): State, ) -> Result, Error> { Zone::get_records(&zone_name, app.db, app.records).await.map(Json) } pub async fn create_zone_records( Path(zone_name): Path, State(app): State, Json(add_records): Json, ) -> Result>, Error> { let zone = app.db.get_zone_by_name(&zone_name).await?; let add_records = add_records.validate(&zone.name)?; app.records.add_records(&zone.name, &add_records.new_records).await?; let records = add_records.new_records.into_iter() .map(|r| r.into()) .collect(); Ok(Json(records)) } /* use rocket::http::Status; use rocket::serde::json::Json; use crate::DbConn; use crate::dns::{RecordConnector, ZoneConnector}; use crate::models; use crate::models::{ParseRecordList}; use crate::controllers; #[get("/zones//records")] pub async fn get_zone_records( mut dns_api: Box, conn: DbConn, user_info: Result, zone: models::AbsoluteName ) -> Result, models::ErrorResponse> { let user_info = user_info?; let zone_name = zone.to_string(); conn.run(move |c| { if user_info.is_admin() { models::Zone::get_by_name(c, &zone_name) } else { user_info.get_zone(c, &zone_name) } }).await?; let dns_records = dns_api.get_records(zone.clone(), models::DNSClass::IN.into()).await?; let records: Vec<_> = dns_records.into_iter().map(models::Record::from).collect(); Ok(Json(records)) } #[post("/zones//records", data = "")] pub async fn create_zone_records( mut dns_api: Box, conn: DbConn, user_info: Result, zone: models::AbsoluteName, new_records: Json ) -> Result, models::ErrorResponse> { let user_info = user_info?; let zone_name = zone.to_utf8(); conn.run(move |c| { if user_info.is_admin() { models::Zone::get_by_name(c, &zone_name) } else { user_info.get_zone(c, &zone_name) } }).await?; dns_api.add_records( zone.clone(), models::DNSClass::IN.into(), new_records.into_inner().try_into_dns_type(zone.into_inner(), models::DNSClass::IN.into())? ).await?; return Ok(Json(())); } #[put("/zones//records", data = "")] pub async fn update_zone_records( mut dns_api: Box, conn: DbConn, user_info: Result, zone: models::AbsoluteName, update_records_request: Json ) -> Result, models::ErrorResponse> { let user_info = user_info?; let zone = zone.into_inner(); let zone_name = zone.to_utf8(); let update_records_request = update_records_request.into_inner(); conn.run(move |c| { if user_info.is_admin() { models::Zone::get_by_name(c, &zone_name) } else { user_info.get_zone(c, &zone_name) } }).await?; dns_api.update_records( zone.clone(), models::DNSClass::IN.into(), update_records_request.old_records.try_into_dns_type(zone.clone(), models::DNSClass::IN.into())?, update_records_request.new_records.try_into_dns_type(zone, models::DNSClass::IN.into())?, ).await?; return Ok(Json(())); } #[delete("/zones//records", data = "")] pub async fn delete_zone_records( mut dns_api: Box, conn: DbConn, user_info: Result, zone: models::AbsoluteName, records: Json ) -> Result, models::ErrorResponse> { let user_info = user_info?; let zone_name = zone.to_utf8(); conn.run(move |c| { if user_info.is_admin() { models::Zone::get_by_name(c, &zone_name) } else { user_info.get_zone(c, &zone_name) } }).await?; dns_api.delete_records( zone.clone(), models::DNSClass::IN.into(), records.into_inner().try_into_dns_type(zone.into_inner(), models::DNSClass::IN.into())? ).await?; return Ok(Json(())); } #[get("/zones")] pub async fn get_zones( conn: DbConn, user_info: Result, ) -> Result>, models::ErrorResponse> { let user_info = user_info?; controllers::get_zones( &conn, user_info ).await.map(|zones| Json(zones)) } #[post("/zones", data = "")] pub async fn create_zone( conn: DbConn, dns_api: Box, user_info: Result, zone_request: Json, ) -> Result, models::ErrorResponse> { let user_info = user_info?; controllers::create_zone( &conn, dns_api, user_info, zone_request.into_inner() ).await.map(|zone| Json(zone)) } #[post("/zones//members", data = "")] pub async fn add_member_to_zone<'r>( conn: DbConn, zone: models::AbsoluteName, user_info: Result, zone_member_request: Json ) -> Result { let user_info = user_info?; let zone_name = zone.to_utf8(); conn.run(move |c| { let zone = if user_info.is_admin() { models::Zone::get_by_name(c, &zone_name) } else { user_info.get_zone(c, &zone_name) }?; let new_member = models::LocalUser::get_user_by_uuid(c, &zone_member_request.id)?; zone.add_member(&c, &new_member) }).await?; Ok(Status::Created) // TODO: change this? } */