this repo has no description
1use crate::state::AppState; 2use axum::{ 3 Json, 4 extract::State, 5 http::{HeaderMap, StatusCode}, 6 response::{IntoResponse, Response}, 7}; 8use serde::Serialize; 9use serde_json::json; 10 11#[derive(Serialize)] 12#[serde(rename_all = "camelCase")] 13pub struct ServerStatsResponse { 14 pub user_count: i64, 15 pub repo_count: i64, 16 pub record_count: i64, 17 pub blob_storage_bytes: i64, 18} 19 20pub async fn get_server_stats( 21 State(state): State<AppState>, 22 headers: HeaderMap, 23) -> Response { 24 let auth_header = headers.get("Authorization"); 25 if auth_header.is_none() { 26 return ( 27 StatusCode::UNAUTHORIZED, 28 Json(json!({"error": "AuthenticationRequired"})), 29 ) 30 .into_response(); 31 } 32 33 let user_count: i64 = match sqlx::query_scalar!("SELECT COUNT(*) FROM users") 34 .fetch_one(&state.db) 35 .await 36 { 37 Ok(Some(count)) => count, 38 Ok(None) => 0, 39 Err(_) => 0, 40 }; 41 42 let repo_count: i64 = match sqlx::query_scalar!("SELECT COUNT(*) FROM repos") 43 .fetch_one(&state.db) 44 .await 45 { 46 Ok(Some(count)) => count, 47 Ok(None) => 0, 48 Err(_) => 0, 49 }; 50 51 let record_count: i64 = match sqlx::query_scalar!("SELECT COUNT(*) FROM records") 52 .fetch_one(&state.db) 53 .await 54 { 55 Ok(Some(count)) => count, 56 Ok(None) => 0, 57 Err(_) => 0, 58 }; 59 60 let blob_storage_bytes: i64 = match sqlx::query_scalar!("SELECT COALESCE(SUM(size_bytes), 0)::BIGINT FROM blobs") 61 .fetch_one(&state.db) 62 .await 63 { 64 Ok(Some(bytes)) => bytes, 65 Ok(None) => 0, 66 Err(_) => 0, 67 }; 68 69 Json(ServerStatsResponse { 70 user_count, 71 repo_count, 72 record_count, 73 blob_storage_bytes, 74 }) 75 .into_response() 76}