From 2bf07e3e9b4c08a31f8d58e70a6b544e92484e92 Mon Sep 17 00:00:00 2001 From: Rorik Star Platinum Date: Mon, 3 Nov 2025 21:59:15 +0300 Subject: [PATCH] healthcheck endpoint --- src/main.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index e7a11a9..4202993 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,69 @@ -fn main() { - println!("Hello, world!"); +// src/main.rs + +use axum::{ + extract::State, + http::StatusCode, + response::{IntoResponse, Json}, + routing::get, + Router, +}; +use serde_json::json; +use sqlx::postgres::PgPoolOptions; +use sqlx::PgPool; +use std::net::SocketAddr; +use std::env; + +#[derive(Clone)] +struct AppState { + db_pool: PgPool, } + +#[tokio::main] +async fn main() { + dotenvy::dotenv().expect("Failed to read .env file"); + + let database_url = env::var("DATABASE_URL") + .expect("DATABASE_URL must be set"); + + let db_pool = PgPoolOptions::new() + .max_connections(5) + .connect(&database_url) + .await + .expect("Failed to create Postgres connection pool"); + + println!("✅ Database connection pool created successfully."); + + let app_state = AppState { db_pool }; + + let app = Router::new() + .route("/api/health", get(health_checker_handler)) + .with_state(app_state); + + let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); + println!("🚀 Server listening on {}", addr); + + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app).await.unwrap(); +} + +async fn health_checker_handler( + State(state): State, +) -> impl IntoResponse { + let result = sqlx::query("SELECT 1") + .execute(&state.db_pool) + .await; + + let (status_code, message) = match result { + Ok(_) => ( + StatusCode::OK, + "Database connection is successful.".to_string(), + ), + Err(e) => ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Database connection failed: {}", e), + ), + }; + + (status_code, Json(json!({ "status": message }))) +} +