headless_lms_models/
rejected_exercise_slide_submissions.rs1use crate::{
2 library::grading::{StudentExerciseSlideSubmission, StudentExerciseTaskSubmission},
3 prelude::*,
4};
5
6#[derive(Clone, PartialEq, Deserialize, Serialize)]
7pub struct RejectedExerciseSlideSubmission {
8 pub id: Uuid,
9 pub created_at: DateTime<Utc>,
10 pub updated_at: DateTime<Utc>,
11 pub deleted_at: Option<DateTime<Utc>>,
12 pub user_id: Uuid,
13 pub exercise_slide_id: Uuid,
14 pub http_status_code: Option<i32>,
15 pub error_message: Option<String>,
16 pub response_body: Option<String>,
17}
18
19pub async fn insert_rejected_exercise_slide_submission(
20 conn: &mut PgConnection,
21 rejected_submission: &StudentExerciseSlideSubmission,
22 user_id: Uuid,
23 http_status_code: Option<i32>,
24 error_message: Option<String>,
25 response_body: Option<String>,
26) -> ModelResult<Uuid> {
27 let mut tx = conn.begin().await?;
28 let res = sqlx::query!(
29 "
30INSERT INTO rejected_exercise_slide_submissions (
31 user_id,
32 exercise_slide_id,
33 http_status_code,
34 error_message,
35 response_body
36 )
37VALUES ($1, $2, $3, $4, $5)
38RETURNING id
39 ",
40 user_id,
41 rejected_submission.exercise_slide_id,
42 http_status_code,
43 error_message,
44 response_body,
45 )
46 .fetch_one(&mut *tx)
47 .await?;
48
49 for task in &rejected_submission.exercise_task_submissions {
50 insert_rejected_exercise_task_submission(&mut tx, task, res.id).await?;
51 }
52
53 tx.commit().await?;
54 Ok(res.id)
55}
56
57async fn insert_rejected_exercise_task_submission(
59 conn: &mut PgConnection,
60 rejected_submission: &StudentExerciseTaskSubmission,
61 exercise_slide_submission_id: Uuid,
62) -> ModelResult<Uuid> {
63 let res = sqlx::query!(
64 "
65INSERT INTO rejected_exercise_task_submissions (rejected_exercise_slide_submission_id, data_json)
66VALUES ($1, $2)
67RETURNING id
68 ",
69 exercise_slide_submission_id,
70 rejected_submission.data_json,
71 )
72 .fetch_one(&mut *conn)
73 .await?;
74 Ok(res.id)
75}