add get_attending endpoint
This commit is contained in:
parent
c5bbad6460
commit
f8fc5d3dce
@ -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>,
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user