headless_lms_models/
rejected_exercise_slide_submissions.rs

1use 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
57/// Used internally only by the `insert_rejected_exercise_slide_submission` function.
58async 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}