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}
15
16pub async fn insert_rejected_exercise_slide_submission(
17    conn: &mut PgConnection,
18    rejected_submission: &StudentExerciseSlideSubmission,
19    user_id: Uuid,
20) -> ModelResult<Uuid> {
21    let mut tx = conn.begin().await?;
22    let res = sqlx::query!(
23        "
24INSERT INTO rejected_exercise_slide_submissions (user_id, exercise_slide_id)
25VALUES ($1, $2)
26RETURNING id
27        ",
28        user_id,
29        rejected_submission.exercise_slide_id,
30    )
31    .fetch_one(&mut *tx)
32    .await?;
33
34    for task in &rejected_submission.exercise_task_submissions {
35        insert_rejected_exercise_task_submission(&mut tx, task, res.id).await?;
36    }
37
38    tx.commit().await?;
39    Ok(res.id)
40}
41
42/// Used internally only by the `insert_rejected_exercise_slide_submission` function.
43async fn insert_rejected_exercise_task_submission(
44    conn: &mut PgConnection,
45    rejected_submission: &StudentExerciseTaskSubmission,
46    exercise_slide_submission_id: Uuid,
47) -> ModelResult<Uuid> {
48    let res = sqlx::query!(
49        "
50INSERT INTO rejected_exercise_task_submissions (rejected_exercise_slide_submission_id, data_json)
51VALUES ($1, $2)
52RETURNING id
53        ",
54        exercise_slide_submission_id,
55        rejected_submission.data_json,
56    )
57    .fetch_one(&mut *conn)
58    .await?;
59    Ok(res.id)
60}