headless_lms_server/controllers/main_frontend/
course_modules.rs1use headless_lms_models::course_module_completions::CourseModuleCompletion;
2use models::{
3 course_modules::{self, CourseModule},
4 library::progressing::{CompletionRegistrationLink, UserCompletionInformation},
5};
6
7use crate::prelude::*;
8
9#[instrument(skip(pool))]
15async fn get_course_module(
16 course_module_id: web::Path<Uuid>,
17 pool: web::Data<PgPool>,
18 user: AuthUser,
19) -> ControllerResult<web::Json<CourseModule>> {
20 let mut conn = pool.acquire().await?;
21 let course_module = course_modules::get_by_id(&mut conn, *course_module_id).await?;
22 let token = authorize(
23 &mut conn,
24 Act::View,
25 Some(user.id),
26 Res::Course(course_module.course_id),
27 )
28 .await?;
29 token.authorized_ok(web::Json(course_module))
30}
31
32#[instrument(skip(pool))]
38async fn get_course_module_completion_information_for_user(
39 course_module_id: web::Path<Uuid>,
40 pool: web::Data<PgPool>,
41 user: AuthUser,
42) -> ControllerResult<web::Json<UserCompletionInformation>> {
43 let mut conn = pool.acquire().await?;
44 let course_module = course_modules::get_by_id(&mut conn, *course_module_id).await?;
45 let token = authorize(
47 &mut conn,
48 Act::View,
49 Some(user.id),
50 Res::Course(course_module.course_id),
51 )
52 .await?;
53 let information = models::library::progressing::get_user_completion_information(
54 &mut conn,
55 user.id,
56 &course_module,
57 )
58 .await?;
59 token.authorized_ok(web::Json(information))
60}
61
62#[instrument(skip(pool))]
66async fn get_course_module_completion_registration_link(
67 course_module_id: web::Path<Uuid>,
68 pool: web::Data<PgPool>,
69 user: AuthUser,
70) -> ControllerResult<web::Json<CompletionRegistrationLink>> {
71 let mut conn = pool.acquire().await?;
72 let course_module = course_modules::get_by_id(&mut conn, *course_module_id).await?;
73 let token = authorize(
75 &mut conn,
76 Act::View,
77 Some(user.id),
78 Res::Course(course_module.course_id),
79 )
80 .await?;
81 let completion_registration_link =
82 models::library::progressing::get_completion_registration_link_and_save_attempt(
83 &mut conn,
84 user.id,
85 &course_module,
86 )
87 .await?;
88 token.authorized_ok(web::Json(completion_registration_link))
89}
90
91async fn enable_or_disable_certificate_generation(
92 params: web::Path<(Uuid, bool)>,
93 pool: web::Data<PgPool>,
94 user: AuthUser,
95) -> ControllerResult<web::Json<bool>> {
96 let mut conn = pool.acquire().await?;
97 let (course_module_id, enabled) = params.into_inner();
98
99 let course_module = course_modules::get_by_id(&mut conn, course_module_id).await?;
100 let token = authorize(
102 &mut conn,
103 Act::Edit,
104 Some(user.id),
105 Res::Course(course_module.course_id),
106 )
107 .await?;
108 models::course_modules::update_certification_enabled(&mut conn, course_module_id, enabled)
109 .await?;
110
111 token.authorized_ok(web::Json(true))
112}
113
114#[instrument(skip(pool))]
120async fn get_best_course_module_completion_for_user(
121 course_module_id: web::Path<Uuid>,
122 pool: web::Data<PgPool>,
123 user: AuthUser,
124) -> ControllerResult<web::Json<Option<CourseModuleCompletion>>> {
125 let mut conn = pool.acquire().await?;
126 let course_module = course_modules::get_by_id(&mut conn, *course_module_id).await?;
127
128 let token = authorize(
129 &mut conn,
130 Act::View,
131 Some(user.id),
132 Res::Course(course_module.course_id),
133 )
134 .await?;
135
136 let information =
137 models::course_module_completions::get_best_completion_by_user_and_course_module_id(
138 &mut conn,
139 user.id,
140 *course_module_id,
141 )
142 .await?;
143 token.authorized_ok(web::Json(information))
144}
145
146pub fn _add_routes(cfg: &mut ServiceConfig) {
154 cfg.route("/{course_module_id}", web::get().to(get_course_module))
155 .route(
156 "/{course_module_id}/user-completion",
157 web::get().to(get_course_module_completion_information_for_user),
158 )
159 .route(
160 "/{course_module_id}/completion-registration-link",
161 web::get().to(get_course_module_completion_registration_link),
162 )
163 .route(
164 "/{course_module_id}/set-certificate-generation/{enabled}",
165 web::post().to(enable_or_disable_certificate_generation),
166 )
167 .route(
168 "/{course_module_id}/course-module-completion",
169 web::get().to(get_best_course_module_completion_for_user),
170 );
171}