recipes/backend/src/services.rs
2025-01-05 22:38:46 +01:00

82 lines
2.1 KiB
Rust

use axum::{
body, debug_handler,
extract::{Extension, Request, State},
http::{header, StatusCode},
middleware::Next,
response::{IntoResponse, Response, Result},
};
// use tracing::{event, Level};
use crate::{
data::{db, model},
html_templates::*,
ron_utils, translation,
};
pub mod fragments;
pub mod recipe;
pub mod ron;
pub mod user;
// Will embed RON error in HTML page.
pub async fn ron_error_to_html(
Extension(tr): Extension<translation::Tr>,
req: Request,
next: Next,
) -> Result<Response> {
let response = next.run(req).await;
if let Some(content_type) = response.headers().get(header::CONTENT_TYPE) {
if content_type == ron_utils::RON_CONTENT_TYPE {
let message = match body::to_bytes(response.into_body(), usize::MAX).await {
Ok(bytes) => String::from_utf8(bytes.to_vec()).unwrap_or_default(),
Err(error) => error.to_string(),
};
return Ok(MessageTemplate {
user: None,
message,
as_code: true,
tr,
}
.into_response());
}
}
Ok(response)
}
///// HOME /////
#[debug_handler]
pub async fn home_page(
State(connection): State<db::Connection>,
Extension(user): Extension<Option<model::User>>,
Extension(tr): Extension<translation::Tr>,
) -> Result<impl IntoResponse> {
let recipes = Recipes {
published: connection.get_all_published_recipe_titles().await?,
unpublished: if let Some(user) = user.as_ref() {
connection
.get_all_unpublished_recipe_titles(user.id)
.await?
} else {
vec![]
},
current_id: None,
};
Ok(HomeTemplate { user, recipes, tr })
}
///// 404 /////
#[debug_handler]
pub async fn not_found(
Extension(user): Extension<Option<model::User>>,
Extension(tr): Extension<translation::Tr>,
) -> impl IntoResponse {
(
StatusCode::NOT_FOUND,
MessageTemplate::new_with_user("404: Not found", tr, user),
)
}