diff options
| author | batsumaru <> | 2026-10-16 16:18:02 +0900 |
|---|---|---|
| committer | batsumaru <> | 2026-10-16 16:18:02 +0900 |
| commit | e45e9fa8b50daa028233fd739fe96a3bdc8ec54b (patch) | |
| tree | 680bc21040e0d1f2d121cd0da1087b6078840bb0 /src/handlers.rs | |
| parent | 13219eb405db7c825d2875b3e88a7a53a73e8b7e (diff) | |
Diffstat (limited to 'src/handlers.rs')
| -rw-r--r-- | src/handlers.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/handlers.rs b/src/handlers.rs index 7067f3a..9ae87c3 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -29,6 +29,7 @@ pub async fn export_measurements( AppQuery(query): AppQuery<ListQuery>, ) -> Result<([(HeaderName, &'static str); 2], Vec<u8>), AppError> { let rows = fetch_measurements(&pool, &query).await?; + tracing::info!(count = rows.len(), "exporting measurements"); let mut writer = csv::WriterBuilder::new() .has_headers(false) .from_writer(Vec::new()); @@ -65,6 +66,14 @@ async fn fetch_measurements( { return Err(AppError::BadRequest("from must not be after to")); } + tracing::debug!( + from = ?query.from, + to = ?query.to, + metric_type = ?query.metric_type, + limit = ?limit, + order = ?query.order, + "fetching measurements" + ); // SQL can't bind ASC/DESC as a parameter. The CASE yields measured_at only when // `order` is desc (sorted DESC) and NULL otherwise, so that key ties for every // row and the ASC key decides the order. If this gets slow, use an if/else with a @@ -88,6 +97,7 @@ async fn fetch_measurements( ) .fetch_all(pool) .await?; + tracing::debug!(count = rows.len(), "fetched measurements"); Ok(rows) } @@ -110,6 +120,11 @@ pub async fn create_measurement( ) .fetch_one(&pool) .await?; + tracing::info!( + id = %measurement.id, + metric_type = ?measurement.metric_type, + "created measurement" + ); let location = format!("/measurements/{}", measurement.id); Ok(( StatusCode::CREATED, @@ -122,6 +137,7 @@ pub async fn get_measurement( State(pool): State<PgPool>, AppPath(id): AppPath<Uuid>, ) -> Result<Json<MeasurementView>, AppError> { + tracing::debug!(%id, "fetching measurement"); let measurement = sqlx::query_as!( MeasurementView, " @@ -160,6 +176,7 @@ pub async fn update_measurement( if result.rows_affected() == 0 { return Err(AppError::NotFound); } + tracing::info!(%id, "updated measurement"); Ok(StatusCode::NO_CONTENT) } @@ -167,9 +184,14 @@ pub async fn delete_measurement( State(pool): State<PgPool>, AppPath(id): AppPath<Uuid>, ) -> Result<StatusCode, AppError> { - sqlx::query!("DELETE FROM measurement WHERE id = $1", id) + let result = sqlx::query!("DELETE FROM measurement WHERE id = $1", id) .execute(&pool) .await?; + if result.rows_affected() == 0 { + tracing::debug!(%id, "measurement to delete did not exist"); + } else { + tracing::info!(%id, "deleted measurement"); + } Ok(StatusCode::NO_CONTENT) } |
