From 8d081473291360c854fbfc4473f90f4946ac6c48 Mon Sep 17 00:00:00 2001 From: Mitchell Marino Date: Sun, 16 Apr 2023 19:59:24 -0500 Subject: [PATCH] events api --- src/events.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/leaderboard.rs | 3 ++- src/main.rs | 1 + src/models.rs | 1 + src/report.rs | 1 + src/winner.rs | 3 +++ 6 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/events.rs b/src/events.rs index 37aaa81..ee30062 100644 --- a/src/events.rs +++ b/src/events.rs @@ -108,6 +108,55 @@ pub async fn get_all_events( .into_response() } +pub async fn my_events( + AuthBearer(token): AuthBearer, + State(app_state): State, +) -> impl IntoResponse { + let token_data = match handle_token(token, &app_state, Role::Teacher) { + Err(err) => return err, + Ok(token_data) => token_data, + }; + + let result = query_as!( + Event, + r#" + SELECT + id, + title, + description, + time_start, + time_end, + event_type AS "event_type!: EventType", + points, + place, + price, + created_by + FROM + events + WHERE + created_by = $1 + ORDER BY + time_start + LIMIT + 20; + "#, + token_data.id, + ) + .fetch_all(&app_state.db_pool) + .await; + + match result { + Ok(events) => (StatusCode::OK, Json(json!(events))), + Err(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({ + "error": format!("Unknown error getting events: {:?}", err) + })), + ), + } + .into_response() +} + pub async fn get_recent_events( AuthBearer(token): AuthBearer, State(app_state): State, diff --git a/src/leaderboard.rs b/src/leaderboard.rs index ad448d3..f52dbc8 100644 --- a/src/leaderboard.rs +++ b/src/leaderboard.rs @@ -69,7 +69,8 @@ pub async fn list_points( LEFT JOIN events e ON ea.event_id = e.id WHERE - u.grade = $1 + u.grade = $1 AND + u.role = 'student' GROUP BY u.id ORDER BY points DESC ; diff --git a/src/main.rs b/src/main.rs index 5432fa8..d168586 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,6 +56,7 @@ async fn main() { .route("/event/preview", get(events::get_events_preview)) .route("/event/future", get(events::get_all_events)) .route("/event/recent", get(events::get_recent_events)) + .route("/event/my", get(events::my_events)) .route("/report", get(report::get_report)) .route("/attending/confirm", put(attending::confirm_attending)) .route("/attending/mark", post(attending::mark_attending)) diff --git a/src/models.rs b/src/models.rs index f1084c2..eb694d5 100644 --- a/src/models.rs +++ b/src/models.rs @@ -19,6 +19,7 @@ pub struct WinnerEntry { #[derive(Copy, Clone, Hash, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] pub struct PrizeQuery { pub prize_id: Option, + pub grade: i32, } #[derive(Copy, Clone, Hash, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] diff --git a/src/report.rs b/src/report.rs index b94c4f2..c31ead8 100644 --- a/src/report.rs +++ b/src/report.rs @@ -55,6 +55,7 @@ pub async fn get_report( ON u.id = ea.user_id AND ea.confirmed = true LEFT JOIN events e ON ea.event_id = e.id + WHERE u.role = 'student' GROUP BY u.id ORDER BY u.grade, u.username, points "#, diff --git a/src/winner.rs b/src/winner.rs index 6d2a8a9..822e526 100644 --- a/src/winner.rs +++ b/src/winner.rs @@ -31,6 +31,7 @@ pub async fn select_winners( SELECT u.id, u.username, + u.grade, COALESCE(SUM(e.points), 0) AS points, RANDOM() * COALESCE(SUM(e.points), 0) AS random_value FROM @@ -50,6 +51,7 @@ pub async fn select_winners( id, points FROM weighted_users WHERE points > p.points_min + AND grade = $3 LIMIT 1 ) u WHERE p.id = $1 OR $2 @@ -61,6 +63,7 @@ pub async fn select_winners( "#, prize_query.prize_id.unwrap_or(0), prize_query.prize_id.is_none(), + prize_query.grade, ) .execute(&app_state.db_pool) .await;