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}