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, headers: HeaderMap, ) -> Response { render_loaded(&headers, load_page(state, &headers, CreateLogicForm::default(), None).await) } pub(crate) async fn create_logic( State(state): State, headers: HeaderMap, Form(form): Form, ) -> 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) -> 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(), } }