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