headless_lms_server/controllers/cms/
exams.rs1use models::exams::{ExamInstructions, ExamInstructionsUpdate};
4
5use crate::prelude::*;
6
7#[instrument(skip(payload, request, file_store, app_conf))]
23async fn add_media(
24 pool: web::Data<PgPool>,
25 exam_id: web::Path<Uuid>,
26 payload: Multipart,
27 request: HttpRequest,
28 user: AuthUser,
29 file_store: web::Data<dyn FileStore>,
30 app_conf: web::Data<ApplicationConfiguration>,
31) -> ControllerResult<web::Json<UploadResult>> {
32 let mut conn = pool.acquire().await?;
33 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*exam_id)).await?;
34 let media_path = upload_file_from_cms(
35 request.headers(),
36 payload,
37 StoreKind::Exam(*exam_id),
38 file_store.as_ref(),
39 &mut conn,
40 user,
41 )
42 .await?;
43 let download_url = file_store.get_download_url(media_path.as_path(), app_conf.as_ref());
44
45 token.authorized_ok(web::Json(UploadResult { url: download_url }))
46}
47
48#[instrument(skip(pool))]
52async fn get_exam_instructions(
53 pool: web::Data<PgPool>,
54 exam_id: web::Path<Uuid>,
55 user: AuthUser,
56) -> ControllerResult<web::Json<ExamInstructions>> {
57 let mut conn = pool.acquire().await?;
58 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*exam_id)).await?;
59 let exam_instructions_data =
60 models::exams::get_exam_instructions_data(&mut conn, *exam_id).await?;
61
62 token.authorized_ok(web::Json(exam_instructions_data))
63}
64
65#[instrument(skip(pool, payload))]
77async fn update_exam_instructions(
78 payload: web::Json<ExamInstructionsUpdate>,
79 pool: web::Data<PgPool>,
80 exam_id: web::Path<Uuid>,
81 user: AuthUser,
82) -> ControllerResult<web::Json<ExamInstructions>> {
83 let mut conn = pool.acquire().await?;
84
85 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Exam(*exam_id)).await?;
86 let instructions_update = payload.0;
87 let saved_instructions =
88 models::exams::update_exam_instructions(&mut conn, *exam_id, instructions_update).await?;
89
90 token.authorized_ok(web::Json(saved_instructions))
91}
92
93pub fn _add_routes(cfg: &mut ServiceConfig) {
101 cfg.route("/{exam_id}/upload", web::post().to(add_media))
102 .route("/{exam_id}/edit", web::get().to(get_exam_instructions))
103 .route("/{exam_id}/edit", web::put().to(update_exam_instructions));
104}