From 5aa7a6e7e1f7ff6511d1bf4dc567c4766d1c3eeb Mon Sep 17 00:00:00 2001 From: LucasDLTG Date: Mon, 11 May 2026 11:33:12 +0200 Subject: [PATCH] feat: db errors --- src/databases/postgres/api_key.rs | 3 ++- src/databases/postgres/errors.rs | 21 +++++++++++++++++++++ src/databases/postgres/mod.rs | 1 + src/databases/postgres/pool.rs | 9 +++++++-- src/databases/postgres/user.rs | 6 ++++-- 5 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/databases/postgres/errors.rs diff --git a/src/databases/postgres/api_key.rs b/src/databases/postgres/api_key.rs index 649705b..a087c50 100644 --- a/src/databases/postgres/api_key.rs +++ b/src/databases/postgres/api_key.rs @@ -1,7 +1,8 @@ +use super::errors::DbError; use sqlx::PgPool; use uuid::Uuid; -pub async fn update_last_access(pool: &PgPool, api_key_id: Uuid) -> Result<(), sqlx::Error> { +pub async fn update_last_access(pool: &PgPool, api_key_id: Uuid) -> Result<(), DbError> { sqlx::query!( r#" UPDATE auth.api_key diff --git a/src/databases/postgres/errors.rs b/src/databases/postgres/errors.rs new file mode 100644 index 0000000..b974181 --- /dev/null +++ b/src/databases/postgres/errors.rs @@ -0,0 +1,21 @@ +use axum::http::StatusCode; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum DbError { + #[error("database connection error")] + Connection(#[from] sqlx::Error), + + #[error("database timeout")] + Timeout, +} + +pub fn _into_http_response(e: DbError) -> (StatusCode, String) { + match e { + DbError::Connection(_) => ( + StatusCode::INTERNAL_SERVER_ERROR, + "database connection error".to_string(), + ), + DbError::Timeout => (StatusCode::REQUEST_TIMEOUT, "database timeout".to_string()), + } +} diff --git a/src/databases/postgres/mod.rs b/src/databases/postgres/mod.rs index 1aa7891..ef62612 100644 --- a/src/databases/postgres/mod.rs +++ b/src/databases/postgres/mod.rs @@ -1,3 +1,4 @@ pub mod api_key; +pub mod errors; pub mod pool; pub mod user; diff --git a/src/databases/postgres/pool.rs b/src/databases/postgres/pool.rs index 1776d23..9608cba 100644 --- a/src/databases/postgres/pool.rs +++ b/src/databases/postgres/pool.rs @@ -1,7 +1,8 @@ +use super::errors::DbError; use sqlx::{PgPool, postgres::PgPoolOptions}; use std::time::Duration; -pub async fn create_pool(database_url: &str) -> Result { +pub async fn create_pool(database_url: &str) -> Result { PgPoolOptions::new() .max_connections(10) .acquire_timeout(Duration::from_secs(5)) @@ -9,6 +10,10 @@ pub async fn create_pool(database_url: &str) -> Result { .await .map_err(|err| { tracing::error!("Postgres connection error: {:?}", err); - err + + match err { + sqlx::Error::PoolTimedOut => DbError::Timeout, + _ => DbError::Connection(err), + } }) } diff --git a/src/databases/postgres/user.rs b/src/databases/postgres/user.rs index 387c5fb..8e0a535 100644 --- a/src/databases/postgres/user.rs +++ b/src/databases/postgres/user.rs @@ -1,7 +1,8 @@ +use super::errors::DbError; use sqlx::PgPool; use uuid::Uuid; -pub async fn ensure_user_exists(pool: &PgPool, user_id: Uuid) -> Result<(), sqlx::Error> { +pub async fn ensure_user_exists(pool: &PgPool, user_id: Uuid) -> Result<(), DbError> { sqlx::query!( r#" INSERT INTO auth.app_user (id) @@ -11,7 +12,8 @@ pub async fn ensure_user_exists(pool: &PgPool, user_id: Uuid) -> Result<(), sqlx user_id ) .execute(pool) - .await?; + .await + .map_err(DbError::Connection)?; Ok(()) }