Use HTML swap to display success and error messages
This commit is contained in:
@@ -3,14 +3,15 @@ use crate::{
|
||||
idempotency::{IdempotencyKey, save_response, try_processing},
|
||||
routes::AdminError,
|
||||
startup::AppState,
|
||||
templates::SuccessTemplate,
|
||||
};
|
||||
use anyhow::Context;
|
||||
use askama::Template;
|
||||
use axum::{
|
||||
Extension, Form,
|
||||
extract::State,
|
||||
response::{IntoResponse, Redirect, Response},
|
||||
response::{Html, IntoResponse, Response},
|
||||
};
|
||||
use axum_messages::Messages;
|
||||
use sqlx::{Executor, Postgres, Transaction};
|
||||
use uuid::Uuid;
|
||||
|
||||
@@ -67,20 +68,15 @@ async fn enqueue_delivery_tasks(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(
|
||||
name = "Publishing a newsletter",
|
||||
skip(connection_pool, form, messages)
|
||||
)]
|
||||
#[tracing::instrument(name = "Publishing a newsletter", skip(connection_pool, form))]
|
||||
pub async fn publish_newsletter(
|
||||
State(AppState {
|
||||
connection_pool, ..
|
||||
}): State<AppState>,
|
||||
Extension(AuthenticatedUser { user_id, .. }): Extension<AuthenticatedUser>,
|
||||
messages: Messages,
|
||||
Form(form): Form<BodyData>,
|
||||
) -> Result<Response, AdminError> {
|
||||
if let Err(e) = validate_form(&form) {
|
||||
messages.error(e);
|
||||
return Err(AdminError::Publish(anyhow::anyhow!(e)));
|
||||
}
|
||||
|
||||
@@ -89,17 +85,9 @@ pub async fn publish_newsletter(
|
||||
.try_into()
|
||||
.map_err(AdminError::Idempotency)?;
|
||||
|
||||
let success_message = || {
|
||||
messages.success(format!(
|
||||
"The newsletter issue '{}' has been published!",
|
||||
form.title
|
||||
))
|
||||
};
|
||||
|
||||
let mut transaction = match try_processing(&connection_pool, &idempotency_key, user_id).await? {
|
||||
crate::idempotency::NextAction::StartProcessing(t) => t,
|
||||
crate::idempotency::NextAction::ReturnSavedResponse(response) => {
|
||||
success_message();
|
||||
return Ok(response);
|
||||
}
|
||||
};
|
||||
@@ -112,8 +100,12 @@ pub async fn publish_newsletter(
|
||||
.await
|
||||
.context("Failed to enqueue delivery tasks")?;
|
||||
|
||||
let response = Redirect::to("/admin/newsletters").into_response();
|
||||
success_message();
|
||||
let success_message = format!(
|
||||
r#"The newsletter issue "{}" has been published!"#,
|
||||
form.title
|
||||
);
|
||||
let template = SuccessTemplate { success_message };
|
||||
let response = Html(template.render().unwrap()).into_response();
|
||||
save_response(transaction, &idempotency_key, user_id, response)
|
||||
.await
|
||||
.map_err(AdminError::UnexpectedError)
|
||||
|
||||
Reference in New Issue
Block a user