Add 404 and 500 page #12

Merged
loub merged 1 commits from add-error-page into main 2026-01-30 10:35:02 +01:00
5 changed files with 62 additions and 10 deletions

View File

@ -1,3 +1,5 @@
use askama::Template;
use askama_web::WebTemplate;
use axum::{
Router,
routing::{get, post},
@ -29,5 +31,14 @@ pub fn build_app(state: AppState) -> Router {
.route("/users", post(routes::user::create))
.route("/users/{id}/delete", post(routes::user::delete))
.nest("/assets", static_router())
.fallback(error_handler)
.with_state(state)
}
#[derive(Template, WebTemplate)]
#[template(path = "404.html")]
struct NotFoundTemplate {}
pub async fn error_handler() -> impl axum::response::IntoResponse {
NotFoundTemplate {}
}

View File

@ -1,17 +1,17 @@
use askama::Template;
use askama_web::WebTemplate;
use axum::response::{IntoResponse, Response};
use log::error;
use snafu::prelude::*;
use crate::{
models::{book::BookError, user::UserError},
models::{
book::{BookError, NotFoundSnafu},
user::UserError,
},
state::config::ConfigError,
};
#[derive(Template, WebTemplate)]
#[template(path = "error.html")]
struct ErrorTemplate {}
#[derive(Snafu, Debug)]
#[snafu(visibility(pub))]
pub enum AppStateError {
@ -38,8 +38,30 @@ pub enum AppStateError {
},
}
impl IntoResponse for AppStateError {
fn into_response(self) -> Response {
ErrorTemplate {}.into_response()
#[derive(Template, WebTemplate)]
#[template(path = "error.html")]
struct ErrorTemplate {
state: AppStateErrorContext,
}
struct AppStateErrorContext {
pub errors: Vec<AppStateError>,
}
impl From<AppStateError> for AppStateErrorContext {
fn from(e: AppStateError) -> Self {
error!("{:?}", e);
Self { errors: vec![e] }
}
}
impl IntoResponse for AppStateError {
fn into_response(self) -> Response {
let error_context = AppStateErrorContext::from(self);
ErrorTemplate {
state: error_context,
}
.into_response()
}
}

8
templates/404.html Normal file
View File

@ -0,0 +1,8 @@
{% extends "base.html" %}
{% block main %}
<div class="mt-4 text-center">
<h1>Oops ! This page does not exist</h1>
<h2 class="fst-italic">404 NOT FOUND</h2>
<a href="/" class="mt-3 btn btn-info">Back to home</a>
</div>
{% endblock %}

View File

@ -1 +1,12 @@
Error
{% extends "base.html" %}
{% block main %}
<div class="mt-4 text-center">
<h1>Oops ! An Error occured</h1>
<div class="alert alert-danger">
{% for error in state.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
<a href="/" class="mt-3 btn btn-info">Back to home</a>
</div>
{% endblock %}

View File

@ -14,7 +14,7 @@ o{% import "components/inputs.html" as form_helpers %}
</div>
<div class="col-md-2">
<input type="submit" value="Create user" class="btn btn-success">
<input type="submit" value="Edit user" class="btn btn-success">
</div>
</div>
</form>