headless_lms_models/
offered_answers_to_peer_review_temporary.rsuse rand::Rng;
use crate::{exercise_slide_submissions::ExerciseSlideSubmission, prelude::*};
pub async fn try_to_restore_previously_given_exercise_slide_submission(
conn: &mut PgConnection,
exercise_id: Uuid,
user_id: Uuid,
course_instance_id: Uuid,
) -> ModelResult<Option<ExerciseSlideSubmission>> {
if rand::rng().random_range(0..10) == 0 {
delete_expired_records(&mut *conn).await?;
}
let res = sqlx::query!(
"
SELECT exercise_slide_submission_id
FROM offered_answers_to_peer_review_temporary
WHERE exercise_id = $1
AND user_id = $2
AND course_instance_id = $3
AND created_at > now() - '1 hour'::interval
",
exercise_id,
user_id,
course_instance_id,
)
.fetch_optional(&mut *conn)
.await?;
if let Some(res) = res {
if let Some(peer_review_queue_entry) = crate::peer_review_queue_entries::get_by_receiving_peer_reviews_exercise_slide_submission_id(&mut *conn, res.exercise_slide_submission_id).await.optional()? {
if peer_review_queue_entry.received_enough_peer_reviews || peer_review_queue_entry.removed_from_queue_for_unusual_reason || peer_review_queue_entry.deleted_at.is_some() {
return Ok(None);
}
} else {
return Ok(None)
}
let ess = crate::exercise_slide_submissions::get_by_id(
&mut *conn,
res.exercise_slide_submission_id,
)
.await?;
if ess.deleted_at.is_some() {
return Ok(None);
}
return Ok(Some(ess));
}
Ok(None)
}
pub async fn save_given_exercise_slide_submission(
conn: &mut PgConnection,
exercise_slide_submission_id: Uuid,
exercise_id: Uuid,
user_id: Uuid,
course_instance_id: Uuid,
) -> ModelResult<()> {
let _res = sqlx::query!(
"
INSERT INTO offered_answers_to_peer_review_temporary (
exercise_slide_submission_id,
user_id,
course_instance_id,
exercise_id
)
VALUES ($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT offered_answers_to_peer_review_temporary_pkey DO
UPDATE
SET exercise_slide_submission_id = $1,
user_id = $2,
course_instance_id = $3,
exercise_id = $4,
created_at = now()
",
exercise_slide_submission_id,
user_id,
course_instance_id,
exercise_id,
)
.execute(&mut *conn)
.await?;
Ok(())
}
pub async fn delete_saved_submissions_for_user(
conn: &mut PgConnection,
exercise_id: Uuid,
user_id: Uuid,
) -> ModelResult<()> {
info!("Deleting expired records from offered_answers_to_peer_review_temporary");
let _res = sqlx::query!(
"
DELETE FROM offered_answers_to_peer_review_temporary
WHERE exercise_id = $1
AND user_id = $2
",
exercise_id,
user_id
)
.execute(&mut *conn)
.await?;
Ok(())
}
async fn delete_expired_records(conn: &mut PgConnection) -> ModelResult<()> {
info!("Deleting expired records from offered_answers_to_peer_review_temporary");
let _res = sqlx::query!(
"
DELETE FROM offered_answers_to_peer_review_temporary
WHERE created_at < now() - '1 hour'::interval
"
)
.execute(&mut *conn)
.await?;
Ok(())
}