headless_lms_server/controllers/course_material/
course_modules.rs1use headless_lms_models::{course_instances, user_course_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 course_id = course_instances::get_course_instance(&mut conn, course_instance_id)
55 .await?
56 .course_id;
57 let exercise_tasks = models::exercise_task_submissions::get_user_custom_view_exercise_tasks_by_module_and_exercise_type(
58 &mut conn,
59 &exercise_type,
60 course_module_id,
61 user.id,
62 course_id)
63 .await?;
64
65 let exercises = models::exercises::get_exercises_by_module_containing_exercise_type(
66 &mut conn,
67 &exercise_type,
68 course_module_id,
69 )
70 .await?;
71 let user_variables =
72 user_course_exercise_service_variables::get_all_user_variables_for_user_and_course_and_exercise_type(&mut conn, user.id, course_id, &exercise_type).await?;
73 let token = skip_authorize();
74 let res = CustomViewExerciseSubmissions {
75 exercise_tasks,
76 exercises,
77 user_variables,
78 };
79
80 token.authorized_ok(web::Json(res))
81}
82
83pub fn _add_routes(cfg: &mut ServiceConfig) {
91 cfg.route(
92 "/chapter/{chapter_id}",
93 web::get().to(get_course_module_id_by_chapter_id),
94 )
95 .route(
96 "/course/{course_id}",
97 web::get().to(get_default_course_module_id_by_course_id),
98 )
99 .route(
100 "/{course_module_id}/exercise-tasks/{exercise_type}/{course_instance_id}",
101 web::get().to(get_user_course_module_exercises_by_exercise_type),
102 );
103}