1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use crate::prelude::*;

pub struct ExerciseTaskRegradingSubmission {
    pub id: Uuid,
    pub exercise_task_submission_id: Uuid,
    pub grading_before_regrading: Uuid,
    pub grading_after_regrading: Option<Uuid>,
    pub regrading_id: Uuid,
}

pub async fn insert(
    conn: &mut PgConnection,
    pkey_policy: PKeyPolicy<Uuid>,
    regrading_id: Uuid,
    exercise_task_submission_id: Uuid,
    grading_before_regrading_id: Uuid,
) -> ModelResult<Uuid> {
    let res = sqlx::query!(
        "
INSERT INTO exercise_task_regrading_submissions (
    id,
    regrading_id,
    exercise_task_submission_id,
    grading_before_regrading
  )
VALUES ($1, $2, $3, $4)
RETURNING id
        ",
        pkey_policy.into_uuid(),
        regrading_id,
        exercise_task_submission_id,
        grading_before_regrading_id
    )
    .fetch_one(conn)
    .await?;
    Ok(res.id)
}

pub async fn get_regrading_submission(
    conn: &mut PgConnection,
    exercise_task_regrading_submission_id: Uuid,
) -> ModelResult<ExerciseTaskRegradingSubmission> {
    let res = sqlx::query_as!(
        ExerciseTaskRegradingSubmission,
        "
SELECT id,
  exercise_task_submission_id,
  grading_before_regrading,
  grading_after_regrading,
  regrading_id
FROM exercise_task_regrading_submissions
WHERE id = $1
",
        exercise_task_regrading_submission_id
    )
    .fetch_one(conn)
    .await?;
    Ok(res)
}

pub async fn get_regrading_submissions(
    conn: &mut PgConnection,
    regrading_id: Uuid,
) -> ModelResult<Vec<ExerciseTaskRegradingSubmission>> {
    let res = sqlx::query_as!(
        ExerciseTaskRegradingSubmission,
        "
SELECT id,
  exercise_task_submission_id,
  grading_before_regrading,
  grading_after_regrading,
  regrading_id
FROM exercise_task_regrading_submissions
WHERE regrading_id = $1
AND deleted_at IS NULL
",
        regrading_id
    )
    .fetch_all(conn)
    .await?;
    Ok(res)
}

pub async fn set_grading_after_regrading(
    conn: &mut PgConnection,
    exercise_task_regrading_submission_id: Uuid,
    new_grading_id: Uuid,
) -> ModelResult<()> {
    sqlx::query!(
        "
UPDATE exercise_task_regrading_submissions
SET grading_after_regrading = $1
WHERE id = $2
",
        new_grading_id,
        exercise_task_regrading_submission_id
    )
    .execute(conn)
    .await?;
    Ok(())
}