2024-12-15 20:21:03 +00:00
|
|
|
use axum::extract::{Path, State};
|
|
|
|
use axum::Json;
|
|
|
|
|
|
|
|
use crate::dns::record::{AddRecordsRequest, Record};
|
|
|
|
use crate::AppState;
|
|
|
|
use crate::errors::Error;
|
|
|
|
use crate::ressouces::zone::{CreateZoneRequest, Zone};
|
|
|
|
|
|
|
|
|
|
|
|
pub async fn create_zone(
|
|
|
|
State(app): State<AppState>,
|
|
|
|
Json(create_zone): Json<CreateZoneRequest>,
|
|
|
|
) -> Result<Json<Zone>, Error>
|
|
|
|
{
|
|
|
|
Zone::create(create_zone, app.zone, app.db).await.map(Json)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn get_zone_records(
|
|
|
|
Path(zone_name): Path<String>,
|
|
|
|
State(app): State<AppState>,
|
|
|
|
) -> Result<Json<Vec<Record>>, Error>
|
|
|
|
{
|
|
|
|
|
|
|
|
let zone = app.db.get_zone_by_name(&zone_name).await?;
|
|
|
|
let records = app.records.get_records(&zone.name).await?;
|
|
|
|
|
|
|
|
Ok(Json(records))
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn create_zone_records(
|
|
|
|
Path(zone_name): Path<String>,
|
|
|
|
State(app): State<AppState>,
|
|
|
|
Json(add_records): Json<AddRecordsRequest>,
|
|
|
|
) -> Result<Json<Vec<Record>>, 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))
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2021-04-02 20:09:51 +00:00
|
|
|
use rocket::http::Status;
|
|
|
|
|
2022-04-22 17:16:57 +00:00
|
|
|
use rocket::serde::json::Json;
|
2021-04-02 20:09:51 +00:00
|
|
|
|
2022-03-04 16:17:15 +00:00
|
|
|
use crate::DbConn;
|
2022-04-22 19:01:26 +00:00
|
|
|
use crate::dns::{RecordConnector, ZoneConnector};
|
2022-03-04 18:43:19 +00:00
|
|
|
use crate::models;
|
|
|
|
use crate::models::{ParseRecordList};
|
2023-02-22 15:28:12 +00:00
|
|
|
use crate::controllers;
|
2021-04-02 20:09:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
#[get("/zones/<zone>/records")]
|
2021-04-03 06:16:54 +00:00
|
|
|
pub async fn get_zone_records(
|
2022-04-22 19:01:26 +00:00
|
|
|
mut dns_api: Box<dyn RecordConnector>,
|
2021-04-05 22:56:15 +00:00
|
|
|
conn: DbConn,
|
2022-03-04 16:17:15 +00:00
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone: models::AbsoluteName
|
2022-03-04 20:55:27 +00:00
|
|
|
) -> Result<Json<models::RecordList>, models::ErrorResponse> {
|
2021-04-02 20:09:51 +00:00
|
|
|
|
2021-04-05 22:56:15 +00:00
|
|
|
let user_info = user_info?;
|
2021-05-02 15:19:32 +00:00
|
|
|
let zone_name = zone.to_string();
|
2021-04-05 22:56:15 +00:00
|
|
|
|
2021-05-02 15:19:32 +00:00
|
|
|
conn.run(move |c| {
|
|
|
|
if user_info.is_admin() {
|
2022-03-04 16:17:15 +00:00
|
|
|
models::Zone::get_by_name(c, &zone_name)
|
2021-05-02 15:19:32 +00:00
|
|
|
} else {
|
2021-05-02 13:56:42 +00:00
|
|
|
user_info.get_zone(c, &zone_name)
|
2021-05-02 15:19:32 +00:00
|
|
|
}
|
|
|
|
}).await?;
|
2021-04-05 22:56:15 +00:00
|
|
|
|
2022-03-04 20:55:27 +00:00
|
|
|
let dns_records = dns_api.get_records(zone.clone(), models::DNSClass::IN.into()).await?;
|
2022-03-04 17:20:18 +00:00
|
|
|
let records: Vec<_> = dns_records.into_iter().map(models::Record::from).collect();
|
2021-04-02 20:09:51 +00:00
|
|
|
|
|
|
|
Ok(Json(records))
|
|
|
|
}
|
2021-05-02 13:56:42 +00:00
|
|
|
|
2021-07-01 18:45:49 +00:00
|
|
|
#[post("/zones/<zone>/records", data = "<new_records>")]
|
|
|
|
pub async fn create_zone_records(
|
2022-04-22 19:01:26 +00:00
|
|
|
mut dns_api: Box<dyn RecordConnector>,
|
2021-07-01 18:45:49 +00:00
|
|
|
conn: DbConn,
|
2022-03-04 16:17:15 +00:00
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone: models::AbsoluteName,
|
2022-03-04 20:55:27 +00:00
|
|
|
new_records: Json<models::RecordList>
|
2022-03-04 16:17:15 +00:00
|
|
|
) -> Result<Json<()>, models::ErrorResponse> {
|
2021-07-01 18:45:49 +00:00
|
|
|
|
|
|
|
let user_info = user_info?;
|
|
|
|
let zone_name = zone.to_utf8();
|
|
|
|
|
|
|
|
conn.run(move |c| {
|
|
|
|
if user_info.is_admin() {
|
2022-03-04 16:17:15 +00:00
|
|
|
models::Zone::get_by_name(c, &zone_name)
|
2021-07-01 18:45:49 +00:00
|
|
|
} else {
|
|
|
|
user_info.get_zone(c, &zone_name)
|
|
|
|
}
|
|
|
|
}).await?;
|
2022-03-03 23:44:29 +00:00
|
|
|
|
2022-03-04 18:43:19 +00:00
|
|
|
dns_api.add_records(
|
|
|
|
zone.clone(),
|
|
|
|
models::DNSClass::IN.into(),
|
2022-03-04 20:55:27 +00:00
|
|
|
new_records.into_inner().try_into_dns_type(zone.into_inner(), models::DNSClass::IN.into())?
|
2022-03-04 18:43:19 +00:00
|
|
|
).await?;
|
2022-03-04 16:51:07 +00:00
|
|
|
|
2022-03-04 17:20:18 +00:00
|
|
|
return Ok(Json(()));
|
2021-07-01 18:45:49 +00:00
|
|
|
}
|
|
|
|
|
2022-03-04 20:55:27 +00:00
|
|
|
#[put("/zones/<zone>/records", data = "<update_records_request>")]
|
|
|
|
pub async fn update_zone_records(
|
2022-04-22 19:01:26 +00:00
|
|
|
mut dns_api: Box<dyn RecordConnector>,
|
2022-03-04 20:55:27 +00:00
|
|
|
conn: DbConn,
|
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone: models::AbsoluteName,
|
|
|
|
update_records_request: Json<models::UpdateRecordsRequest>
|
|
|
|
) -> Result<Json<()>, 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(()));
|
|
|
|
}
|
|
|
|
|
2022-03-05 12:07:51 +00:00
|
|
|
#[delete("/zones/<zone>/records", data = "<records>")]
|
|
|
|
pub async fn delete_zone_records(
|
2022-04-22 19:01:26 +00:00
|
|
|
mut dns_api: Box<dyn RecordConnector>,
|
2022-03-05 12:07:51 +00:00
|
|
|
conn: DbConn,
|
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone: models::AbsoluteName,
|
|
|
|
records: Json<models::RecordList>
|
|
|
|
) -> Result<Json<()>, 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(()));
|
|
|
|
}
|
2022-03-04 20:55:27 +00:00
|
|
|
|
2021-05-02 13:56:42 +00:00
|
|
|
#[get("/zones")]
|
|
|
|
pub async fn get_zones(
|
|
|
|
conn: DbConn,
|
2022-03-04 16:17:15 +00:00
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
) -> Result<Json<Vec<models::Zone>>, models::ErrorResponse> {
|
2021-05-02 13:56:42 +00:00
|
|
|
let user_info = user_info?;
|
|
|
|
|
2023-02-22 15:28:12 +00:00
|
|
|
controllers::get_zones(
|
|
|
|
&conn,
|
|
|
|
user_info
|
|
|
|
).await.map(|zones| Json(zones))
|
2021-05-02 13:56:42 +00:00
|
|
|
}
|
|
|
|
|
2021-05-02 15:19:32 +00:00
|
|
|
#[post("/zones", data = "<zone_request>")]
|
|
|
|
pub async fn create_zone(
|
|
|
|
conn: DbConn,
|
2023-02-22 15:28:12 +00:00
|
|
|
dns_api: Box<dyn ZoneConnector>,
|
2022-03-04 16:17:15 +00:00
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone_request: Json<models::CreateZoneRequest>,
|
|
|
|
) -> Result<Json<models::Zone>, models::ErrorResponse> {
|
2023-02-22 15:28:12 +00:00
|
|
|
let user_info = user_info?;
|
2021-05-02 15:19:32 +00:00
|
|
|
|
2023-02-22 15:28:12 +00:00
|
|
|
controllers::create_zone(
|
|
|
|
&conn,
|
|
|
|
dns_api,
|
|
|
|
user_info,
|
|
|
|
zone_request.into_inner()
|
|
|
|
).await.map(|zone| Json(zone))
|
2021-05-02 15:19:32 +00:00
|
|
|
}
|
|
|
|
|
2021-05-02 13:56:42 +00:00
|
|
|
|
|
|
|
#[post("/zones/<zone>/members", data = "<zone_member_request>")]
|
|
|
|
pub async fn add_member_to_zone<'r>(
|
|
|
|
conn: DbConn,
|
2022-03-04 16:17:15 +00:00
|
|
|
zone: models::AbsoluteName,
|
|
|
|
user_info: Result<models::UserInfo, models::ErrorResponse>,
|
|
|
|
zone_member_request: Json<models::AddZoneMemberRequest>
|
2022-04-22 17:16:57 +00:00
|
|
|
) -> Result<Status, models::ErrorResponse> {
|
2021-05-02 13:56:42 +00:00
|
|
|
let user_info = user_info?;
|
|
|
|
let zone_name = zone.to_utf8();
|
|
|
|
|
|
|
|
conn.run(move |c| {
|
|
|
|
let zone = if user_info.is_admin() {
|
2022-03-04 16:17:15 +00:00
|
|
|
models::Zone::get_by_name(c, &zone_name)
|
2021-05-02 13:56:42 +00:00
|
|
|
} else {
|
|
|
|
user_info.get_zone(c, &zone_name)
|
|
|
|
}?;
|
|
|
|
|
2022-03-04 16:17:15 +00:00
|
|
|
let new_member = models::LocalUser::get_user_by_uuid(c, &zone_member_request.id)?;
|
2021-05-02 13:56:42 +00:00
|
|
|
zone.add_member(&c, &new_member)
|
|
|
|
}).await?;
|
|
|
|
|
2022-04-22 17:16:57 +00:00
|
|
|
Ok(Status::Created) // TODO: change this?
|
2021-05-02 13:56:42 +00:00
|
|
|
}
|
2024-12-15 20:21:03 +00:00
|
|
|
*/
|