headless_lms_server/controllers/course_material/
course_modules.rs1use headless_lms_models::user_course_instance_exercise_service_variables;
2use models::{course_modules, library::custom_view_exercises::CustomViewExerciseSubmissions};
3
4use crate::{domain::authorization::skip_authorize, prelude::*};
5
6#[instrument(skip(pool))]
12async fn get_course_module_id_by_chapter_id(
13 chapter_id: web::Path<Uuid>,
14 pool: web::Data<PgPool>,
15 user: AuthUser,
16) -> ControllerResult<web::Json<Uuid>> {
17 let mut conn = pool.acquire().await?;
18 let module_id = course_modules::get_course_module_id_by_chapter(&mut conn, *chapter_id).await?;
19 let token = skip_authorize();
20 token.authorized_ok(web::Json(module_id))
21}
22
23#[instrument(skip(pool))]
29async fn get_default_course_module_id_by_course_id(
30 course_id: web::Path<Uuid>,
31 pool: web::Data<PgPool>,
32 user: AuthUser,
33) -> ControllerResult<web::Json<Uuid>> {
34 let mut conn = pool.acquire().await?;
35 let module = course_modules::get_default_by_course_id(&mut conn, *course_id).await?;
36 let module_id = module.id;
37 let token = skip_authorize();
38 token.authorized_ok(web::Json(module_id))
39}
40
41#[instrument(skip(pool))]
47async fn get_user_course_module_exercises_by_exercise_type(
48 path: web::Path<(Uuid, String, Uuid)>,
49 pool: web::Data<PgPool>,
50 user: AuthUser,
51) -> ControllerResult<web::Json<CustomViewExerciseSubmissions>> {
52 let mut conn = pool.acquire().await?;
53 let (course_module_id, exercise_type, course_instance_id) = path.into_inner();
54 let exercise_tasks = models::exercise_task_submissions::get_user_custom_view_exercise_tasks_by_module_and_exercise_type(
55 &mut conn,
56 &exercise_type,
57 course_module_id,
58 user.id,
59 course_instance_id)
60 .await?;
61
62 let exercises = models::exercises::get_exercises_by_module_containing_exercise_type(
63 &mut conn,
64 &exercise_type,
65 course_module_id,
66 )
67 .await?;
68 let user_variables =
69 user_course_instance_exercise_service_variables::get_all_user_variables_for_user_and_course_instance_and_exercise_type(&mut conn, user.id, course_instance_id, &exercise_type).await?;
70 let token = skip_authorize();
71 let res = CustomViewExerciseSubmissions {
72 exercise_tasks,
73 exercises,
74 user_variables,
75 };
76
77 token.authorized_ok(web::Json(res))
78}
79
80pub fn _add_routes(cfg: &mut ServiceConfig) {
88 cfg.route(
89 "/chapter/{chapter_id}",
90 web::get().to(get_course_module_id_by_chapter_id),
91 )
92 .route(
93 "/course/{course_id}",
94 web::get().to(get_default_course_module_id_by_course_id),
95 )
96 .route(
97 "/{course_module_id}/exercise-tasks/{exercise_type}/{course_instance_id}",
98 web::get().to(get_user_course_module_exercises_by_exercise_type),
99 );
100}