headless_lms_server/controllers/main_frontend/
teacher_grading_decisions.rs1use crate::prelude::*;
2use headless_lms_models::{
3 exercises::get_exercise_by_id,
4 library::user_exercise_state_updater,
5 teacher_grading_decisions::{NewTeacherGradingDecision, TeacherDecisionType},
6 user_exercise_states::UserExerciseState,
7};
8
9#[instrument(skip(pool))]
13async fn create_teacher_grading_decision(
14 payload: web::Json<NewTeacherGradingDecision>,
15 pool: web::Data<PgPool>,
16 user: AuthUser,
17) -> ControllerResult<web::Json<UserExerciseState>> {
18 let action = &payload.action;
19 let exercise_id = payload.exercise_id;
20 let user_exercise_state_id = payload.user_exercise_state_id;
21 let manual_points = payload.manual_points;
22 let justification = &payload.justification;
23 let hidden = payload.hidden;
24 let mut conn = pool.acquire().await?;
25 let token = authorize(
26 &mut conn,
27 Act::Edit,
28 Some(user.id),
29 Res::Exercise(exercise_id),
30 )
31 .await?;
32 let points_given;
33 if *action == TeacherDecisionType::FullPoints {
34 let exercise = get_exercise_by_id(&mut conn, exercise_id).await?;
35 points_given = exercise.score_maximum as f32;
36 } else if *action == TeacherDecisionType::ZeroPoints {
37 points_given = 0.0;
38 } else if *action == TeacherDecisionType::CustomPoints {
39 points_given = manual_points.unwrap_or(0.0);
40 } else if *action == TeacherDecisionType::SuspectedPlagiarism {
41 points_given = 0.0;
42 } else {
43 return Err(ControllerError::new(
44 ControllerErrorType::BadRequest,
45 "Invalid query".to_string(),
46 None,
47 ));
48 }
49
50 info!(
51 "Teacher took the following action: {:?}. Points given: {:?}.",
52 &action, points_given
53 );
54
55 let mut tx = conn.begin().await?;
56
57 let _res = models::teacher_grading_decisions::add_teacher_grading_decision(
58 &mut tx,
59 user_exercise_state_id,
60 *action,
61 points_given,
62 Some(user.id),
63 justification.clone(),
64 hidden,
65 )
66 .await?;
67
68 let new_user_exercise_state =
69 user_exercise_state_updater::update_user_exercise_state(&mut tx, user_exercise_state_id)
70 .await?;
71
72 if let Some(course_instance_id) = new_user_exercise_state.course_instance_id {
73 models::peer_review_queue_entries::remove_queue_entries_for_unusual_reason(
75 &mut tx,
76 new_user_exercise_state.user_id,
77 new_user_exercise_state.exercise_id,
78 course_instance_id,
79 )
80 .await?;
81 }
82
83 tx.commit().await?;
84
85 token.authorized_ok(web::Json(new_user_exercise_state))
86}
87
88pub fn _add_routes(cfg: &mut ServiceConfig) {
89 cfg.route("", web::post().to(create_teacher_grading_decision));
90}