headless_lms_models/
ended_processed_exams.rs1use crate::prelude::*;
2
3pub 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
21pub 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}