headless_lms_server/controllers/cms/
pages.rs1use models::{
4 CourseOrExamId,
5 page_history::HistoryChangeReason,
6 pages::{
7 CmsPageUpdate, ContentManagementPage, PageInfo, PageNavigationInformation, PageUpdateArgs,
8 },
9};
10
11use crate::{
12 domain::{
13 models_requests::{self, JwtKey},
14 request_id::RequestId,
15 },
16 prelude::*,
17};
18
19#[instrument(skip(pool))]
25async fn get_page(
26 page_id: web::Path<Uuid>,
27 pool: web::Data<PgPool>,
28 user: AuthUser,
29) -> ControllerResult<web::Json<ContentManagementPage>> {
30 let mut conn = pool.acquire().await?;
31 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
32
33 let cms_page = models::pages::get_page_with_exercises(&mut conn, *page_id).await?;
34 token.authorized_ok(web::Json(cms_page))
35}
36
37async fn get_page_info(
43 page_id: web::Path<Uuid>,
44 pool: web::Data<PgPool>,
45 user: AuthUser,
46) -> ControllerResult<web::Json<PageInfo>> {
47 let mut conn = pool.acquire().await?;
48 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
49
50 let cms_page_info = models::pages::get_page_info(&mut conn, *page_id).await?;
51 token.authorized_ok(web::Json(cms_page_info))
52}
53
54#[instrument(skip(pool, app_conf))]
79async fn update_page(
80 request_id: RequestId,
81 payload: web::Json<CmsPageUpdate>,
82 page_id: web::Path<Uuid>,
83 pool: web::Data<PgPool>,
84 jwt_key: web::Data<JwtKey>,
85 app_conf: web::Data<ApplicationConfiguration>,
86 user: AuthUser,
87) -> ControllerResult<web::Json<ContentManagementPage>> {
88 let mut conn = pool.acquire().await?;
89 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
90
91 let cms_page_update = payload.0;
92 let course_or_exam_id = models::pages::get_course_and_exam_id(&mut conn, *page_id).await?;
93 let is_exam_page = matches!(course_or_exam_id, CourseOrExamId::Exam(_));
94 let saved = models::pages::update_page(
95 &mut conn,
96 PageUpdateArgs {
97 page_id: *page_id,
98 author: user.id,
99 cms_page_update,
100 retain_ids: false,
101 history_change_reason: HistoryChangeReason::PageSaved,
102 is_exam_page,
103 },
104 models_requests::make_spec_fetcher(
105 app_conf.base_url.clone(),
106 request_id.0,
107 jwt_key.into_inner(),
108 ),
109 models_requests::fetch_service_info,
110 )
111 .await?;
112 token.authorized_ok(web::Json(saved))
113}
114
115#[instrument(skip(pool))]
119async fn get_page_navigation(
120 page_id: web::Path<Uuid>,
121 pool: web::Data<PgPool>,
122) -> ControllerResult<web::Json<PageNavigationInformation>> {
123 let mut conn = pool.acquire().await?;
124 let token = skip_authorize();
125 let res = models::pages::get_page_navigation_data(&mut conn, *page_id).await?;
126
127 token.authorized_ok(web::Json(res))
128}
129pub fn _add_routes(cfg: &mut ServiceConfig) {
137 cfg.route("/{page_id}", web::get().to(get_page))
138 .route("/{page_id}/info", web::get().to(get_page_info))
139 .route(
140 "/{page_id}/page-navigation",
141 web::get().to(get_page_navigation),
142 )
143 .route("/{page_id}", web::put().to(update_page));
144}