mirror of
https://github.com/Blah-IM/blahrs.git
synced 2025-04-30 16:21:10 +00:00
feat(blahd): improve error response on unknown URI or method
This commit is contained in:
parent
78feb1a6ab
commit
ba9673065a
2 changed files with 27 additions and 14 deletions
|
@ -8,6 +8,7 @@ use axum::body::Bytes;
|
|||
use axum::extract::{Path, Query, State};
|
||||
use axum::http::{header, HeaderName, HeaderValue, StatusCode};
|
||||
use axum::response::{IntoResponse, Response};
|
||||
use axum::routing::MethodRouter;
|
||||
use axum::{Json, Router};
|
||||
use axum_extra::extract::WithRejection as R;
|
||||
use blah_types::msg::{
|
||||
|
@ -149,7 +150,7 @@ impl AppState {
|
|||
type ArcState = State<Arc<AppState>>;
|
||||
|
||||
pub fn router(st: Arc<AppState>) -> Router {
|
||||
use axum::routing::{get, post};
|
||||
let r = || MethodRouter::new().fallback(fallback_method_route);
|
||||
|
||||
// NB. Use consistent handler naming: `<method>_<path>[_<details>]`.
|
||||
// Use prefix `list` for GET with pagination.
|
||||
|
@ -157,21 +158,22 @@ pub fn router(st: Arc<AppState>) -> Router {
|
|||
// One route per line.
|
||||
#[rustfmt::skip]
|
||||
let router = Router::new()
|
||||
.route("/server", get(get_server_metadata))
|
||||
.route("/ws", get(event::get_ws))
|
||||
.route("/user/me", get(get_user).post(register::post_user))
|
||||
.route("/room", get(list_room).post(post_room))
|
||||
.route("/server", r().get(get_server_metadata))
|
||||
.route("/ws", r().get(event::get_ws))
|
||||
.route("/user/me", r().get(get_user).post(register::post_user))
|
||||
.route("/room", r().get(list_room).post(post_room))
|
||||
// TODO!: remove this.
|
||||
.route("/room/create", post(post_room))
|
||||
.route("/room/:rid", get(get_room).delete(delete_room))
|
||||
.route("/room/:rid/feed.json", get(feed::get_room_feed::<feed::JsonFeed>))
|
||||
.route("/room/:rid/feed.atom", get(feed::get_room_feed::<feed::AtomFeed>))
|
||||
.route("/room/:rid/msg", get(list_room_msg).post(post_room_msg))
|
||||
.route("/room/:rid/msg/:cid/seen", post(post_room_msg_seen))
|
||||
.route("/room/create", r().post(post_room))
|
||||
.route("/room/:rid", r().get(get_room).delete(delete_room))
|
||||
.route("/room/:rid/feed.json", r().get(feed::get_room_feed::<feed::JsonFeed>))
|
||||
.route("/room/:rid/feed.atom", r().get(feed::get_room_feed::<feed::AtomFeed>))
|
||||
.route("/room/:rid/msg", r().get(list_room_msg).post(post_room_msg))
|
||||
.route("/room/:rid/msg/:cid/seen", r().post(post_room_msg_seen))
|
||||
// TODO!: remove this.
|
||||
.route("/room/:rid/admin", post(post_room_admin))
|
||||
.route("/room/:rid/member", get(list_room_member).post(post_room_member))
|
||||
.route("/room/:rid/member/:uid", get(get_room_member).delete(delete_room_member).patch(patch_room_member))
|
||||
.route("/room/:rid/admin", r().post(post_room_admin))
|
||||
.route("/room/:rid/member", r().get(list_room_member).post(post_room_member))
|
||||
.route("/room/:rid/member/:uid", r().get(get_room_member).delete(delete_room_member).patch(patch_room_member))
|
||||
.fallback(fallback_route)
|
||||
;
|
||||
|
||||
let router = router
|
||||
|
@ -196,6 +198,14 @@ pub fn router(st: Arc<AppState>) -> Router {
|
|||
|
||||
type RE<T> = R<T, ApiError>;
|
||||
|
||||
async fn fallback_route() -> ApiError {
|
||||
ApiError::UnknownRoute
|
||||
}
|
||||
|
||||
async fn fallback_method_route() -> ApiError {
|
||||
ApiError::UnknownMethod
|
||||
}
|
||||
|
||||
async fn get_server_metadata(State(st): ArcState) -> Response {
|
||||
let (json, etag) = st.server_metadata.clone();
|
||||
let headers = [
|
||||
|
|
|
@ -74,6 +74,9 @@ pub enum ApiError {
|
|||
|
||||
ServerError = (StatusCode::INTERNAL_SERVER_ERROR, "internal server error"),
|
||||
NotImplemented(&'static str) = (StatusCode::NOT_IMPLEMENTED),
|
||||
|
||||
UnknownRoute = (StatusCode::NOT_FOUND, "unknown route"),
|
||||
UnknownMethod = (StatusCode::METHOD_NOT_ALLOWED, "unknown method for the route"),
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue