added gpu_score column

This commit is contained in:
2026-05-07 23:44:03 +02:00
parent bd8ee0afae
commit 92b2217723

View File

@@ -49,6 +49,8 @@ pub struct FullReport {
pub benchmark: Option<BenchmarkReport>, pub benchmark: Option<BenchmarkReport>,
pub client_version: String, pub client_version: String,
pub signature: String, pub signature: String,
#[serde(default)]
pub gpu_score: i32,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@@ -92,9 +94,10 @@ async fn submit(
Ok((StatusCode::CREATED, Json(row.0))) Ok((StatusCode::CREATED, Json(row.0)))
} }
fn parse_report_row(id: i32, data: serde_json::Value) -> Option<FullReport> { fn parse_report_row(id: i32, gpu_score: i32, data: serde_json::Value) -> Option<FullReport> {
let mut report: FullReport = serde_json::from_value(data).ok()?; let mut report: FullReport = serde_json::from_value(data).ok()?;
report.id = Some(id); report.id = Some(id);
report.gpu_score = gpu_score;
Some(report) Some(report)
} }
@@ -105,9 +108,9 @@ async fn get_leaderboard(
let limit = pagination.limit.unwrap_or(10); let limit = pagination.limit.unwrap_or(10);
let offset = pagination.offset.unwrap_or(0); let offset = pagination.offset.unwrap_or(0);
let rows: Vec<(i32, serde_json::Value)> = sqlx::query_as( let rows: Vec<(i32, i32, serde_json::Value)> = sqlx::query_as(
r#" r#"
SELECT id, data FROM ( SELECT id, gpu_score, data FROM (
SELECT DISTINCT ON (mac_address) id, data, score SELECT DISTINCT ON (mac_address) id, data, score
FROM reports FROM reports
ORDER BY mac_address, score DESC ORDER BY mac_address, score DESC
@@ -124,7 +127,7 @@ async fn get_leaderboard(
let results = rows let results = rows
.into_iter() .into_iter()
.filter_map(|(id, data)| parse_report_row(id, data)) .filter_map(|(id, gpu_score, data)| parse_report_row(id, gpu_score, data))
.collect(); .collect();
Ok(Json(results)) Ok(Json(results))
@@ -134,15 +137,15 @@ async fn get_report_by_id(
State(state): State<Arc<AppState>>, State(state): State<Arc<AppState>>,
Path(id): Path<i32>, Path(id): Path<i32>,
) -> Result<Json<FullReport>, (StatusCode, String)> { ) -> Result<Json<FullReport>, (StatusCode, String)> {
let row: (i32, serde_json::Value) = let row: (i32, i32, serde_json::Value) =
sqlx::query_as("SELECT id, data FROM reports WHERE id = $1") sqlx::query_as("SELECT id, gpu_score, data FROM reports WHERE id = $1")
.bind(id) .bind(id)
.fetch_optional(&state.db) .fetch_optional(&state.db)
.await .await
.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))? .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?
.ok_or((StatusCode::NOT_FOUND, "Report not found".to_string()))?; .ok_or((StatusCode::NOT_FOUND, "Report not found".to_string()))?;
let report = parse_report_row(row.0, row.1).ok_or(( let report = parse_report_row(row.0, row.1, row.2).ok_or((
StatusCode::INTERNAL_SERVER_ERROR, StatusCode::INTERNAL_SERVER_ERROR,
"Failed to parse stored data".to_string(), "Failed to parse stored data".to_string(),
))?; ))?;
@@ -174,6 +177,7 @@ async fn main() -> anyhow::Result<()> {
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
mac_address TEXT NOT NULL, mac_address TEXT NOT NULL,
score BIGINT NOT NULL, score BIGINT NOT NULL,
gpu_score INTEGER NOT NULL DEFAULT 0,
timestamp TEXT NOT NULL, timestamp TEXT NOT NULL,
client_version TEXT NOT NULL, client_version TEXT NOT NULL,
signature TEXT, signature TEXT,