use models::exercise_task_gradings::ExerciseTaskGradingResult;
use crate::{domain::models_requests::GradingUpdateClaim, prelude::*};
#[instrument(skip(pool))]
async fn grading_update(
submission_id: web::Path<Uuid>,
grading_result: web::Json<ExerciseTaskGradingResult>,
grading_update_claim: GradingUpdateClaim,
pool: web::Data<PgPool>,
) -> ControllerResult<web::Json<()>> {
let token = skip_authorize();
let grading_result = grading_result.into_inner();
if *submission_id != grading_update_claim.submission_id() {
return Err(ControllerError::new(
ControllerErrorType::BadRequest,
"Grading upload claim didn't match the submission id".to_string(),
None,
));
}
let mut conn = pool.acquire().await?;
let submission =
models::exercise_task_submissions::get_submission(&mut conn, *submission_id).await?;
let slide =
models::exercise_slides::get_exercise_slide(&mut conn, submission.exercise_slide_id)
.await?;
let grading = models::exercise_task_gradings::get_by_exercise_task_submission_id(
&mut conn,
*submission_id,
)
.await?
.ok_or_else(|| {
ControllerError::new(
ControllerErrorType::BadRequest,
"No existing grading for the submission found".to_string(),
None,
)
})?;
let exercise = models::exercises::get_by_id(&mut conn, slide.exercise_id).await?;
models::exercise_task_gradings::update_grading(&mut conn, &grading, &grading_result, &exercise)
.await?;
token.authorized_ok(web::Json(()))
}
#[doc(hidden)]
pub fn _add_routes(cfg: &mut ServiceConfig) {
cfg.route(
"grading-update/{submission_id}",
web::post().to(grading_update),
);
}