headless_lms_server/controllers/exercise_services/
grading.rs1use models::exercise_task_gradings::ExerciseTaskGradingResult;
2
3use crate::{domain::models_requests::GradingUpdateClaim, prelude::*};
4
5#[instrument(skip(pool))]
11async fn grading_update(
12    submission_id: web::Path<Uuid>,
13    grading_result: web::Json<ExerciseTaskGradingResult>,
14    grading_update_claim: GradingUpdateClaim,
15    pool: web::Data<PgPool>,
16) -> ControllerResult<web::Json<()>> {
17    let token = skip_authorize();
20    let grading_result = grading_result.into_inner();
21
22    if *submission_id != grading_update_claim.submission_id() {
24        return Err(ControllerError::new(
25            ControllerErrorType::BadRequest,
26            "Grading upload claim didn't match the submission id".to_string(),
27            None,
28        ));
29    }
30
31    let mut conn = pool.acquire().await?;
32
33    let submission =
35        models::exercise_task_submissions::get_submission(&mut conn, *submission_id).await?;
36    let slide =
37        models::exercise_slides::get_exercise_slide(&mut conn, submission.exercise_slide_id)
38            .await?;
39    let grading = models::exercise_task_gradings::get_by_exercise_task_submission_id(
40        &mut conn,
41        *submission_id,
42    )
43    .await?
44    .ok_or_else(|| {
45        ControllerError::new(
46            ControllerErrorType::BadRequest,
47            "No existing grading for the submission found".to_string(),
48            None,
49        )
50    })?;
51    let exercise = models::exercises::get_by_id(&mut conn, slide.exercise_id).await?;
52    models::exercise_task_gradings::update_grading(&mut conn, &grading, &grading_result, &exercise)
53        .await?;
54
55    token.authorized_ok(web::Json(()))
56}
57
58#[doc(hidden)]
66pub fn _add_routes(cfg: &mut ServiceConfig) {
67    cfg.route(
68        "grading-update/{submission_id}",
69        web::post().to(grading_update),
70    );
71}