headless_lms_server/controllers/main_frontend/courses/
students.rs

1//! Controllers for requests starting with `/api/v0/main-frontend/courses/{course_id}/students`.
2use crate::prelude::*;
3
4use headless_lms_models::chapters::CourseUserInfo;
5use headless_lms_models::library::students_view::{
6    CertificateGridRow, CompletionGridRow, ProgressOverview,
7};
8
9/// GET `/api/v0/main-frontend/courses/{course_id}/students/progress`
10#[instrument(skip(pool))]
11async fn get_progress(
12    course_id: web::Path<Uuid>,
13    pool: web::Data<PgPool>,
14    user: AuthUser,
15) -> ControllerResult<web::Json<ProgressOverview>> {
16    let mut conn = pool.acquire().await?;
17    let token = authorize(
18        &mut conn,
19        Act::Teach,
20        Some(user.id),
21        Res::Course(*course_id),
22    )
23    .await?;
24    let res =
25        headless_lms_models::library::students_view::get_progress(&mut conn, *course_id).await?;
26
27    token.authorized_ok(web::Json(res))
28}
29
30/// GET `/api/v0/main-frontend/courses/{course_id}/students/users`
31#[instrument(skip(pool))]
32async fn get_course_users(
33    course_id: web::Path<Uuid>,
34    pool: web::Data<PgPool>,
35    user: AuthUser,
36) -> ControllerResult<web::Json<Vec<CourseUserInfo>>> {
37    let mut conn = pool.acquire().await?;
38    let token = authorize(
39        &mut conn,
40        Act::Teach,
41        Some(user.id),
42        Res::Course(*course_id),
43    )
44    .await?;
45    let res = headless_lms_models::library::students_view::get_course_users(&mut conn, *course_id)
46        .await?;
47
48    token.authorized_ok(web::Json(res))
49}
50
51/// GET `/api/v0/main-frontend/courses/{course_id}/students/completions`
52#[instrument(skip(pool))]
53async fn get_completions(
54    course_id: web::Path<Uuid>,
55    pool: web::Data<PgPool>,
56    user: AuthUser,
57) -> ControllerResult<web::Json<Vec<CompletionGridRow>>> {
58    let mut conn = pool.acquire().await?;
59    let token = authorize(
60        &mut conn,
61        Act::Teach,
62        Some(user.id),
63        Res::Course(*course_id),
64    )
65    .await?;
66    let rows = headless_lms_models::library::students_view::get_completions_grid_by_course_id(
67        &mut conn, *course_id,
68    )
69    .await?;
70
71    token.authorized_ok(web::Json(rows))
72}
73
74/// GET `/api/v0/main-frontend/courses/{course_id}/students/certificates`
75#[instrument(skip(pool))]
76async fn get_certificates(
77    course_id: web::Path<Uuid>,
78    pool: web::Data<PgPool>,
79    user: AuthUser,
80) -> ControllerResult<web::Json<Vec<CertificateGridRow>>> {
81    let mut conn = pool.acquire().await?;
82    let token = authorize(
83        &mut conn,
84        Act::Teach,
85        Some(user.id),
86        Res::Course(*course_id),
87    )
88    .await?;
89    let rows = headless_lms_models::library::students_view::get_certificates_grid_by_course_id(
90        &mut conn, *course_id,
91    )
92    .await?;
93
94    token.authorized_ok(web::Json(rows))
95}
96
97pub fn _add_routes(cfg: &mut web::ServiceConfig) {
98    cfg.route("/progress", web::get().to(get_progress));
99    cfg.route("/users", web::get().to(get_course_users));
100    cfg.route("/completions", web::get().to(get_completions));
101    cfg.route("/certificates", web::get().to(get_certificates));
102}