99 lines
2.9 KiB
Rust
99 lines
2.9 KiB
Rust
use axum::{
|
|
Form,
|
|
extract::State,
|
|
http::{HeaderMap, StatusCode},
|
|
response::{Html, IntoResponse, Redirect, Response},
|
|
};
|
|
|
|
use crate::{
|
|
AppState,
|
|
{i18n::Locale, tr},
|
|
services::authenticated_request,
|
|
};
|
|
|
|
use super::{
|
|
loader::{LoadError, load_page},
|
|
state::CreateLogicForm,
|
|
ui,
|
|
};
|
|
|
|
pub(crate) async fn new_logic_page(
|
|
State(state): State<AppState>,
|
|
headers: HeaderMap,
|
|
) -> Response {
|
|
render_loaded(&headers, load_page(state, &headers, CreateLogicForm::default(), None).await)
|
|
}
|
|
|
|
pub(crate) async fn create_logic(
|
|
State(state): State<AppState>,
|
|
headers: HeaderMap,
|
|
Form(form): Form<CreateLogicForm>,
|
|
) -> Response {
|
|
let submitted = form.clone();
|
|
if let Err(error) = load_page(state.clone(), &headers, submitted.clone(), None).await {
|
|
return render_loaded(&headers, Err(error));
|
|
}
|
|
if headers
|
|
.get("sec-fetch-site")
|
|
.is_some_and(|value| value == "cross-site")
|
|
{
|
|
return (StatusCode::FORBIDDEN, "Cross-site form submission rejected").into_response();
|
|
}
|
|
let request = match form.into_request(Locale::from_headers(&headers)) {
|
|
Ok(request) => request,
|
|
Err(message) => {
|
|
return render_loaded(
|
|
&headers,
|
|
load_page(state, &headers, submitted, Some(message)).await,
|
|
);
|
|
}
|
|
};
|
|
let mut scripts = state.scripts;
|
|
let request = match authenticated_request(&headers, request) {
|
|
Ok(request) => request,
|
|
Err(_) => return Redirect::to("/login").into_response(),
|
|
};
|
|
match scripts.post_table_script(request).await {
|
|
Ok(response) => Html(ui::render_success(
|
|
Locale::from_headers(&headers),
|
|
response.get_ref().id,
|
|
&response.get_ref().warnings,
|
|
))
|
|
.into_response(),
|
|
Err(error) => (
|
|
StatusCode::UNPROCESSABLE_ENTITY,
|
|
Html(ui::render_submission_error(
|
|
Locale::from_headers(&headers),
|
|
error.message(),
|
|
)),
|
|
)
|
|
.into_response(),
|
|
}
|
|
}
|
|
|
|
fn render_loaded(headers: &HeaderMap, result: Result<super::state::AddLogicPageState, LoadError>) -> Response {
|
|
match result {
|
|
Ok(page) => Html(ui::render_page(&page)).into_response(),
|
|
Err(LoadError::Unauthenticated) => Redirect::to("/login").into_response(),
|
|
Err(LoadError::Forbidden) => (
|
|
StatusCode::FORBIDDEN,
|
|
Html(ui::render_submission_error(
|
|
Locale::from_headers(&headers),
|
|
&tr!(
|
|
Locale::from_headers(&headers),
|
|
"add-logic-err-permission"
|
|
),
|
|
)),
|
|
)
|
|
.into_response(),
|
|
Err(LoadError::Backend(message)) => (
|
|
StatusCode::BAD_GATEWAY,
|
|
Html(ui::render_submission_error(
|
|
Locale::from_headers(&headers),
|
|
&message,
|
|
)),
|
|
)
|
|
.into_response(),
|
|
}
|
|
}
|