headless_lms_server/controllers/course_material/
chapters.rs1use models::pages::{Page, PageVisibility, PageWithExercises};
4
5use crate::prelude::*;
6
7#[instrument(skip(pool))]
11async fn get_public_chapter_pages(
12 chapter_id: web::Path<Uuid>,
13 pool: web::Data<PgPool>,
14 auth: Option<AuthUser>,
15) -> ControllerResult<web::Json<Vec<Page>>> {
16 let mut conn = pool.acquire().await?;
17 let token = authorize(
18 &mut conn,
19 Act::View,
20 auth.map(|u| u.id),
21 Res::Chapter(*chapter_id),
22 )
23 .await?;
24 let chapter_pages: Vec<Page> = models::pages::get_course_pages_by_chapter_id_and_visibility(
25 &mut conn,
26 *chapter_id,
27 PageVisibility::Public,
28 )
29 .await?;
30 token.authorized_ok(web::Json(chapter_pages))
31}
32
33#[instrument(skip(pool))]
37async fn get_chapters_exercises(
38 chapter_id: web::Path<Uuid>,
39 pool: web::Data<PgPool>,
40 auth: Option<AuthUser>,
41) -> ControllerResult<web::Json<Vec<PageWithExercises>>> {
42 let mut conn = pool.acquire().await?;
43 let token = authorize(
44 &mut conn,
45 Act::View,
46 auth.map(|u| u.id),
47 Res::Chapter(*chapter_id),
48 )
49 .await?;
50
51 let chapter_pages_with_exercises =
52 models::pages::get_chapters_pages_with_exercises(&mut conn, *chapter_id).await?;
53 token.authorized_ok(web::Json(chapter_pages_with_exercises))
54}
55
56#[instrument(skip(pool))]
60async fn get_chapters_pages_without_main_frontpage(
61 chapter_id: web::Path<Uuid>,
62 pool: web::Data<PgPool>,
63 auth: Option<AuthUser>,
64) -> ControllerResult<web::Json<Vec<Page>>> {
65 let mut conn = pool.acquire().await?;
66 let token = authorize(
67 &mut conn,
68 Act::View,
69 auth.map(|u| u.id),
70 Res::Chapter(*chapter_id),
71 )
72 .await?;
73 let chapter_pages =
74 models::pages::get_chapters_visible_pages_exclude_main_frontpage(&mut conn, *chapter_id)
75 .await?
76 .into_iter()
77 .collect();
78 token.authorized_ok(web::Json(chapter_pages))
79}
80
81pub fn _add_routes(cfg: &mut ServiceConfig) {
89 cfg.route(
90 "/{chapter_id}/pages",
91 web::get().to(get_public_chapter_pages),
92 )
93 .route(
94 "/{chapter_id}/exercises",
95 web::get().to(get_chapters_exercises),
96 )
97 .route(
98 "/{chapter_id}/pages-exclude-mainfrontpage",
99 web::get().to(get_chapters_pages_without_main_frontpage),
100 );
101}