summaryrefslogtreecommitdiff
path: root/src/channel/routes.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-18 12:16:43 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-18 12:18:58 -0400
commit9fb4d3e561786f01352cbd14894d994ea537b5ec (patch)
tree959ddcf4592c6140b71be38149051c56a788bcfe /src/channel/routes.rs
parent2b4cf5c62ff82fa408a4f82bde0b561ff3b15497 (diff)
Return 404s when resources are not found.
This is implemented by making the return values, in most cases, idiosyncratic ad-hoc types that then convert to the approprate error response. This also should make endpoints more testable, since the return values can now be inspected to check their properties without having to process or parse an HTTP response.
Diffstat (limited to 'src/channel/routes.rs')
-rw-r--r--src/channel/routes.rs24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/channel/routes.rs b/src/channel/routes.rs
index 1379153..847e0b4 100644
--- a/src/channel/routes.rs
+++ b/src/channel/routes.rs
@@ -1,10 +1,12 @@
use axum::{
extract::{Form, Path, State},
- response::{IntoResponse, Redirect},
+ http::StatusCode,
+ response::{IntoResponse, Redirect, Response},
routing::post,
Router,
};
+use super::app::EventsError;
use crate::{
app::App,
clock::RequestedAt,
@@ -44,10 +46,26 @@ async fn on_send(
State(app): State<App>,
login: Login,
Form(form): Form<SendRequest>,
-) -> Result<impl IntoResponse, InternalError> {
+) -> Result<impl IntoResponse, ErrorResponse> {
app.channels()
.send(&login, &channel, &form.message, &sent_at)
- .await?;
+ .await
+ // Could impl `From` here, but it's more code and this is used once.
+ .map_err(ErrorResponse)?;
Ok(Redirect::to(&format!("/{}", channel)))
}
+
+struct ErrorResponse(EventsError);
+
+impl IntoResponse for ErrorResponse {
+ fn into_response(self) -> Response {
+ let Self(error) = self;
+ match error {
+ not_found @ EventsError::ChannelNotFound(_) => {
+ (StatusCode::NOT_FOUND, not_found.to_string()).into_response()
+ }
+ EventsError::DatabaseError(error) => InternalError::from(error).into_response(),
+ }
+ }
+}