From 3ac68b8b59f150e08731a62026ce3ac825655614 Mon Sep 17 00:00:00 2001 From: Daniel Hader Date: Thu, 4 Jun 2026 18:29:34 -0500 Subject: viewing submissions logic --- src/database/database.rs | 23 +++++++++++++++++++++++ src/main.rs | 5 +++-- src/routes/submission.rs | 11 +++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/database/database.rs b/src/database/database.rs index 961c39c..95c8bf6 100644 --- a/src/database/database.rs +++ b/src/database/database.rs @@ -244,6 +244,29 @@ impl Database { .map_err(|e| DatabaseError::Query(e.to_string()))? ) } + + pub fn fetch_display_submission(&self, submission_id: i64) -> Result, DatabaseError> { + static QUERY: &str = include_str!("sql/fetch_display_submissions.sql"); + let conn = self.pool + .get() + .map_err(|e| DatabaseError::Connection(e.to_string()))?; + let mut statement = conn.prepare(QUERY) + .map_err(|e| DatabaseError::Query(e.to_string()))?; + + Ok(statement + .query_one([submission_id], |row| { + Ok(DisplaySubmission { + id: row.get("id")?, + username: row.get("username")?, + language: row.get("language")?, + details: row.get("details")?, + code: row.get("code")?, + }) + }) + .optional() + .map_err(|e| DatabaseError::Query(e.to_string()))? + ) + } pub fn initialize(&self) -> Result<(), DatabaseError> { static QUERY: &str = include_str!("sql/initialize.sql"); diff --git a/src/main.rs b/src/main.rs index 9659af3..afa9821 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ use routes::user::{create_user, me}; use routes::auth::{login, logout}; use tower_http::services::ServeDir; -use crate::{database::Database, routes::submission::{create_submission, get_display_submissions, get_submissions_by_problem_id}, utils::register_admin}; +use crate::{database::Database, routes::submission::{create_submission, get_display_submission, get_display_submissions, get_submissions_by_problem_id}, utils::register_admin}; #[derive(Clone)] struct AppState { @@ -62,10 +62,11 @@ async fn main() { .route("/login", post(login)) .route("/logout", post(logout)) .route("/problem/{problem_id}", get(get_problem)) + .route("/problem/{problem_id}/submission", get(get_display_submissions)) .route("/problem", get(get_problems)) .route("/problem", post(create_problem)) .route("/submission", post(create_submission)) - .route("/submission/{problem_id}", get(get_display_submissions)) + .route("/submission/{submission_id}", get(get_display_submission)) .route("/user", post(create_user)) .route("/me", get(me)) .nest_service("/static", static_files) diff --git a/src/routes/submission.rs b/src/routes/submission.rs index 4cfad5c..b3cf2b9 100644 --- a/src/routes/submission.rs +++ b/src/routes/submission.rs @@ -48,3 +48,14 @@ pub async fn get_display_submissions( Ok(Json(submissions)) } +pub async fn get_display_submission( + State(state): State, + Path(submission_id): Path +) -> Result { + match state.database.fetch_display_submission(submission_id) { + Ok(None) => Err(RouteError::NotFound("submission".into())), + Ok(Some(submission)) => Ok(Json(submission)), + Err(e) => Err(RouteError::Internal(format!("unable to fetch submission: {e:?}"))) + } +} + -- cgit v1.2.3