add get_attending endpoint

This commit is contained in:
Mitchell Marino 2023-04-16 22:01:57 -05:00
parent c5bbad6460
commit f8fc5d3dce
3 changed files with 58 additions and 3 deletions

View File

@ -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<AppState>,
Query(attending_query): Query<GetAttendingQuery>,
) -> 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<AppState>,

View File

@ -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))

View File

@ -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,