From f81b29c5e959dd1a47db65470bf72b00a341ed1a Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Thu, 19 Mar 2026 14:01:20 -0400 Subject: [PATCH] Refactor to use more idiomatic http pattern --- src/votes/handlers.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/votes/handlers.rs b/src/votes/handlers.rs index 6e2cbfe..d6dcf93 100644 --- a/src/votes/handlers.rs +++ b/src/votes/handlers.rs @@ -1,12 +1,17 @@ -use axum::{Json, Router, extract::State, http::StatusCode, response::IntoResponse, routing::post}; +use axum::{ + Router, + extract::{Path, State}, + http::StatusCode, + response::IntoResponse, + routing::post, +}; use axum_extra::extract::{CookieJar, cookie::Cookie}; -use serde::Deserialize; use uuid::Uuid; use crate::{state::AppState, votes::repository::insert_new_vote}; pub fn router() -> Router { - Router::new().route("/vote", post(upvote_handler)) + Router::new().route("/posts/{slug}/vote", post(upvote_handler)) } fn get_or_init_voter_id(jar: CookieJar) -> (CookieJar, Uuid) { @@ -30,19 +35,14 @@ fn get_or_init_voter_id(jar: CookieJar) -> (CookieJar, Uuid) { } } -#[derive(Deserialize)] -struct UpvotePayload { - slug: String, -} - async fn upvote_handler( jar: CookieJar, + Path(slug): Path, State(state): State, - Json(body): Json, ) -> impl IntoResponse { let (jar, voter_id) = get_or_init_voter_id(jar); - match insert_new_vote(&body.slug, &voter_id, &state.db).await { + match insert_new_vote(&slug, &voter_id, &state.db).await { Ok(()) => (StatusCode::OK, jar, "Successfully upvoted"), Err(err) => { println!("{err}"); @@ -98,9 +98,9 @@ mod tests { let request = Request::builder() .method("POST") - .uri("/vote") + .uri(format!("/posts/{slug}/vote")) .header(header::CONTENT_TYPE, "application/json") - .body(Body::from(format!(r#"{{"slug":"{slug}"}}"#))) + .body(Body::empty()) .unwrap(); let response = app.oneshot(request).await.unwrap(); @@ -128,10 +128,10 @@ mod tests { let app = crate::app(test_state(db.clone())); let request = Request::builder() .method("POST") - .uri("/vote") + .uri(format!("/posts/{slug}/vote")) .header(header::CONTENT_TYPE, "application/json") .header(header::COOKIE, &cookie) - .body(Body::from(format!(r#"{{"slug":"{slug}"}}"#))) + .body(Body::empty()) .unwrap(); let response = app.oneshot(request).await.unwrap(); @@ -151,10 +151,10 @@ mod tests { let app = crate::app(test_state(db.clone())); let request = Request::builder() .method("POST") - .uri("/vote") + .uri(format!("/posts/{slug}/vote")) .header(header::CONTENT_TYPE, "application/json") .header(header::COOKIE, "voter_id=not-a-uuid") - .body(Body::from(format!(r#"{{"slug":"{slug}"}}"#))) + .body(Body::empty()) .unwrap(); let response = app.oneshot(request).await.unwrap();