implement leaderboard endpoint
This commit is contained in:
parent
a7d56ba0f5
commit
30de8107b4
3 changed files with 36 additions and 1 deletions
|
@ -1,7 +1,8 @@
|
|||
use diesel::{prelude::*, PgConnection, QueryResult};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::schema::{bots, ratings};
|
||||
use crate::db::bots::Bot;
|
||||
use crate::schema::{bots, ratings, users};
|
||||
|
||||
#[derive(Queryable, Debug, Insertable, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Rating {
|
||||
|
@ -25,3 +26,29 @@ pub fn set_rating(bot_id: i32, rating: f64, db_conn: &PgConnection) -> QueryResu
|
|||
.set(ratings::rating.eq(rating))
|
||||
.execute(db_conn)
|
||||
}
|
||||
|
||||
#[derive(Queryable, Serialize, Deserialize)]
|
||||
pub struct Author {
|
||||
id: i32,
|
||||
username: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Serialize, Deserialize)]
|
||||
pub struct RankedBot {
|
||||
pub bot: Bot,
|
||||
pub author: Option<Author>,
|
||||
pub rating: f64,
|
||||
}
|
||||
|
||||
pub fn get_bot_ranking(db_conn: &PgConnection) -> QueryResult<Vec<RankedBot>> {
|
||||
bots::table
|
||||
.left_join(users::table)
|
||||
.inner_join(ratings::table)
|
||||
.select((
|
||||
bots::all_columns,
|
||||
(users::id, users::username).nullable(),
|
||||
ratings::rating,
|
||||
))
|
||||
.order_by(ratings::rating.desc())
|
||||
.get_results(db_conn)
|
||||
}
|
||||
|
|
|
@ -91,6 +91,7 @@ pub fn api() -> Router {
|
|||
"/matches/:match_id/log",
|
||||
get(routes::matches::get_match_log),
|
||||
)
|
||||
.route("/leaderboard", get(routes::bots::get_ranking))
|
||||
.route("/submit_bot", post(routes::demo::submit_bot))
|
||||
.route("/save_bot", post(routes::bots::save_bot))
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ use std::path::PathBuf;
|
|||
use thiserror;
|
||||
|
||||
use crate::db::bots::{self, CodeBundle};
|
||||
use crate::db::ratings::{RankedBot, self};
|
||||
use crate::db::users::User;
|
||||
use crate::modules::bots::save_code_bundle;
|
||||
use crate::{DatabaseConnection, BOTS_DIR};
|
||||
|
@ -170,6 +171,12 @@ pub async fn list_bots(conn: DatabaseConnection) -> Result<Json<Vec<Bot>>, Statu
|
|||
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
|
||||
}
|
||||
|
||||
pub async fn get_ranking(conn: DatabaseConnection) -> Result<Json<Vec<RankedBot>>, StatusCode> {
|
||||
ratings::get_bot_ranking(&conn)
|
||||
.map(Json)
|
||||
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
|
||||
}
|
||||
|
||||
// TODO: currently this only implements the happy flow
|
||||
pub async fn upload_code_multipart(
|
||||
conn: DatabaseConnection,
|
||||
|
|
Loading…
Reference in a new issue