headless_lms_models/
ended_processed_exams.rs

1use crate::prelude::*;
2
3/// Creates a record for the given `exam_id` or makes sure that it is undeleted.
4pub async fn upsert(conn: &mut PgConnection, exam_id: Uuid) -> ModelResult<Uuid> {
5    let res = sqlx::query!(
6        "
7INSERT INTO ended_processed_exams(exam_id)
8VALUES ($1) ON CONFLICT (exam_id) DO
9UPDATE
10SET deleted_at = NULL
11RETURNING exam_id
12        ",
13        exam_id
14    )
15    .map(|x| x.exam_id)
16    .fetch_one(conn)
17    .await?;
18    Ok(res)
19}
20
21/// Get ids for automatically graded exams that have ended but haven't yet been added to the table for processed ones.
22pub async fn get_unprocessed_ended_exams_by_timestamp(
23    conn: &mut PgConnection,
24    timestamp: DateTime<Utc>,
25) -> ModelResult<Vec<Uuid>> {
26    let res = sqlx::query!(
27        "
28SELECT exams.id
29FROM exams
30  LEFT JOIN ended_processed_exams ON (ended_processed_exams.exam_id = exams.id)
31WHERE exams.ends_at <= $1
32  AND exams.grade_manually IS false
33  AND ended_processed_exams.created_at IS NULL
34  AND exams.deleted_at IS NULL
35  AND ended_processed_exams.deleted_at IS NULL
36        ",
37        timestamp,
38    )
39    .map(|x| x.id)
40    .fetch_all(conn)
41    .await?;
42    Ok(res)
43}