summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/database/database.rs23
-rw-r--r--src/main.rs5
-rw-r--r--src/routes/submission.rs11
3 files changed, 37 insertions, 2 deletions
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<Option<DisplaySubmission>, 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<AppState>,
+ Path(submission_id): Path<i64>
+) -> Result<impl IntoResponse, RouteError> {
+ 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:?}")))
+ }
+}
+