summaryrefslogtreecommitdiff
path: root/src/handlers.rs
diff options
context:
space:
mode:
authorbatsumaru <>2026-10-16 15:17:17 +0900
committerbatsumaru <>2026-10-16 15:17:17 +0900
commitb49bb08c7a77fe4b29cf4ed0504c2f1c32a025e3 (patch)
treeea763ca8cb858768e8ac8179f0bd6e32978541b7 /src/handlers.rs
parentad9a134daec1f73940e8deaeb6c2a481ce9d6520 (diff)
Update error responses
Diffstat (limited to 'src/handlers.rs')
-rw-r--r--src/handlers.rs27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index b048681..50ae9e2 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -1,5 +1,5 @@
use axum::{
- extract::{Path, Query, State},
+ extract::State,
http::{HeaderName, StatusCode, header},
response::Json,
};
@@ -9,6 +9,7 @@ use strum::IntoEnumIterator;
use uuid::Uuid;
use crate::error::AppError;
+use crate::extract::{AppJson, AppPath, AppQuery};
use crate::models::{
ListQuery, MeasurementData, MeasurementView, MetricType, MetricUnitPair, Order, Unit,
};
@@ -19,28 +20,32 @@ pub async fn health() -> StatusCode {
pub async fn list_measurements(
State(pool): State<PgPool>,
- Query(query): Query<ListQuery>,
+ AppQuery(query): AppQuery<ListQuery>,
) -> Result<Json<Vec<MeasurementView>>, AppError> {
let limit = match query.limit {
Some(x) if (x > 0) => Some(x),
None => None,
- _ => return Err(AppError::BadRequest),
+ _ => return Err(AppError::BadRequest("limit must be positive")),
};
let (from, to) = match (query.date, query.from, query.to) {
(Some(date), None, None) => (Some(date), Some(date)),
(None, from, to) => (from, to),
- _ => return Err(AppError::BadRequest),
+ _ => {
+ return Err(AppError::BadRequest(
+ "date can't be combined with from or to",
+ ));
+ }
};
if let (Some(from), Some(to)) = (from, to)
&& from > to
{
- return Err(AppError::BadRequest);
+ return Err(AppError::BadRequest("from must not be after to"));
}
let start = from.map(|from| from.and_time(NaiveTime::MIN).and_utc());
let end = match to {
Some(to) => {
let Some(next_day) = to.succ_opt() else {
- return Err(AppError::BadRequest);
+ return Err(AppError::BadRequest("to is out of range"));
};
Some(next_day.and_time(NaiveTime::MIN).and_utc())
}
@@ -72,7 +77,7 @@ pub async fn list_measurements(
pub async fn create_measurement(
State(pool): State<PgPool>,
- Json(data): Json<MeasurementData>,
+ AppJson(data): AppJson<MeasurementData>,
) -> Result<(StatusCode, [(HeaderName, String); 1], Json<MeasurementView>), AppError> {
let measurement = sqlx::query_as!(
MeasurementView,
@@ -99,7 +104,7 @@ pub async fn create_measurement(
pub async fn get_measurement(
State(pool): State<PgPool>,
- Path(id): Path<Uuid>,
+ AppPath(id): AppPath<Uuid>,
) -> Result<Json<MeasurementView>, AppError> {
let measurement = sqlx::query_as!(
MeasurementView,
@@ -116,8 +121,8 @@ pub async fn get_measurement(
pub async fn update_measurement(
State(pool): State<PgPool>,
- Path(id): Path<Uuid>,
- Json(data): Json<MeasurementData>,
+ AppPath(id): AppPath<Uuid>,
+ AppJson(data): AppJson<MeasurementData>,
) -> Result<StatusCode, AppError> {
let result = sqlx::query!(
"
@@ -144,7 +149,7 @@ pub async fn update_measurement(
pub async fn delete_measurement(
State(pool): State<PgPool>,
- Path(id): Path<Uuid>,
+ AppPath(id): AppPath<Uuid>,
) -> Result<StatusCode, AppError> {
sqlx::query!("DELETE FROM measurement WHERE id = $1", id)
.execute(&pool)