headless_lms_models/library/user_exercise_state_updater/
validation.rs

1use crate::prelude::*;
2
3use super::UserExerciseStateUpdateRequiredData;
4
5/// Makes sure we don't do state updates with deleted data accidentally.
6pub(super) fn validate_input(input_data: &UserExerciseStateUpdateRequiredData) -> ModelResult<()> {
7    if input_data.current_user_exercise_state.deleted_at.is_some() {
8        return Err(ModelError::new(
9            ModelErrorType::Generic,
10            "Attempted to update user_exercise_state with a deleted current user exercise state"
11                .to_string(),
12            None,
13        ));
14    }
15    if let Some(peer_or_self_review_information) = &input_data.peer_or_self_review_information {
16        if peer_or_self_review_information
17            .given_peer_or_self_review_submissions
18            .iter()
19            .any(|prs| prs.deleted_at.is_some())
20        {
21            return Err(ModelError::new(
22          ModelErrorType::Generic,
23          "Attempted to update user_exercise_state with a deleted given peer review submission"
24              .to_string(),
25          None,
26            ));
27        }
28
29        if peer_or_self_review_information
30            .latest_exercise_slide_submission_received_peer_or_self_review_question_submissions
31            .iter()
32            .any(|prqs| prqs.deleted_at.is_some())
33        {
34            return Err(ModelError::new(
35      ModelErrorType::Generic,
36      "Attempted to update user_exercise_state with a deleted latest exercise slide submission received peer review question submission"
37          .to_string(),
38      None,
39            ));
40        }
41
42        if let Some(peer_review_queue_entry) =
43            &peer_or_self_review_information.peer_review_queue_entry
44        {
45            if peer_review_queue_entry.deleted_at.is_some() {
46                return Err(ModelError::new(
47              ModelErrorType::Generic,
48              "Attempted to update user_exercise_state with a deleted peer review queue entry"
49                  .to_string(),
50              None,
51                ));
52            }
53        }
54
55        if peer_or_self_review_information
56            .peer_or_self_review_config
57            .deleted_at
58            .is_some()
59        {
60            return Err(ModelError::new(
61                ModelErrorType::Generic,
62                "Attempted to update user_exercise_state with a deleted peer review config"
63                    .to_string(),
64                None,
65            ));
66        }
67    }
68
69    if let Some(latest_teacher_grading_decision) = &input_data.latest_teacher_grading_decision {
70        if latest_teacher_grading_decision.deleted_at.is_some() {
71            return Err(ModelError::new(
72                ModelErrorType::Generic,
73                "Attempted to update user_exercise_state with a latest teacher grading decision"
74                    .to_string(),
75                None,
76            ));
77        }
78    }
79    Ok(())
80}