diff --git a/src/attending.rs b/src/attending.rs index 3705caf..c8c3db6 100644 --- a/src/attending.rs +++ b/src/attending.rs @@ -1,11 +1,16 @@ -use axum::{extract::State, http::StatusCode, response::IntoResponse, Json}; +use axum::{ + extract::{Query, State}, + http::StatusCode, + response::IntoResponse, + Json, +}; use axum_auth::AuthBearer; use serde_json::json; -use sqlx::query; +use sqlx::{query, query_as}; use crate::{ jwt::handle_token, - models::{ConfirmAttending, MarkAttending, Role}, + models::{AttendingEntry, ConfirmAttending, GetAttendingQuery, MarkAttending, Role}, AppState, }; @@ -57,6 +62,44 @@ pub async fn confirm_attending( .into_response() } +pub async fn get_attending( + AuthBearer(token): AuthBearer, + State(app_state): State, + Query(attending_query): Query, +) -> impl IntoResponse { + match handle_token(token, &app_state, Role::Teacher) { + Ok(token_data) => token_data, + Err(err) => return err, + }; + + let result = query_as!( + AttendingEntry, + r#" + SELECT + user_id, + u.username + FROM event_attendees ea + INNER JOIN users u + ON u.id = ea.user_id + WHERE event_id = $1 + "#, + attending_query.event_id, + ) + .fetch_all(&app_state.db_pool) + .await; + + match result { + Ok(attending) => (StatusCode::OK, Json(json!(attending))), + Err(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({ + "error": format!("Unknown error confirming attendence: {:?}", err) + })), + ), + } + .into_response() +} + pub async fn mark_attending( AuthBearer(token): AuthBearer, State(app_state): State, diff --git a/src/main.rs b/src/main.rs index d168586..071b03d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,6 +59,7 @@ async fn main() { .route("/event/my", get(events::my_events)) .route("/report", get(report::get_report)) .route("/attending/confirm", put(attending::confirm_attending)) + .route("/attending", get(attending::get_attending)) .route("/attending/mark", post(attending::mark_attending)) .route("/attending/unmark", delete(attending::unmark_attending)) .route("/leaderboard/my_points", get(leaderboard::get_points)) diff --git a/src/models.rs b/src/models.rs index eb694d5..1c47c1f 100644 --- a/src/models.rs +++ b/src/models.rs @@ -22,6 +22,17 @@ pub struct PrizeQuery { pub grade: i32, } +#[derive(Clone, Hash, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +pub struct AttendingEntry { + pub user_id: i32, + pub username: String, +} + +#[derive(Copy, Clone, Hash, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +pub struct GetAttendingQuery { + pub event_id: i32, +} + #[derive(Copy, Clone, Hash, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] pub struct WinnerQuery { pub winner_id: i32,