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            && peer_review_queue_entry.deleted_at.is_some()
45        {
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        if peer_or_self_review_information
55            .peer_or_self_review_config
56            .deleted_at
57            .is_some()
58        {
59            return Err(ModelError::new(
60                ModelErrorType::Generic,
61                "Attempted to update user_exercise_state with a deleted peer review config"
62                    .to_string(),
63                None,
64            ));
65        }
66    }
67
68    if let Some(latest_teacher_grading_decision) = &input_data.latest_teacher_grading_decision
69        && latest_teacher_grading_decision.deleted_at.is_some()
70    {
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    Ok(())
79}