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}
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
42async 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}