use models::{
page_history::HistoryChangeReason,
pages::{
CmsPageUpdate, ContentManagementPage, PageInfo, PageNavigationInformation, PageUpdateArgs,
},
CourseOrExamId,
};
use crate::{
domain::{
models_requests::{self, JwtKey},
request_id::RequestId,
},
prelude::*,
};
#[instrument(skip(pool))]
async fn get_page(
page_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
user: AuthUser,
) -> ControllerResult<web::Json<ContentManagementPage>> {
let mut conn = pool.acquire().await?;
let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
let cms_page = models::pages::get_page_with_exercises(&mut conn, *page_id).await?;
token.authorized_ok(web::Json(cms_page))
}
async fn get_page_info(
page_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
user: AuthUser,
) -> ControllerResult<web::Json<PageInfo>> {
let mut conn = pool.acquire().await?;
let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
let cms_page_info = models::pages::get_page_info(&mut conn, *page_id).await?;
token.authorized_ok(web::Json(cms_page_info))
}
#[instrument(skip(pool, app_conf))]
async fn update_page(
request_id: RequestId,
payload: web::Json<CmsPageUpdate>,
page_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
jwt_key: web::Data<JwtKey>,
app_conf: web::Data<ApplicationConfiguration>,
user: AuthUser,
) -> ControllerResult<web::Json<ContentManagementPage>> {
let mut conn = pool.acquire().await?;
let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Page(*page_id)).await?;
let cms_page_update = payload.0;
let course_or_exam_id = models::pages::get_course_and_exam_id(&mut conn, *page_id).await?;
let is_exam_page = matches!(course_or_exam_id, CourseOrExamId::Exam(_));
let saved = models::pages::update_page(
&mut conn,
PageUpdateArgs {
page_id: *page_id,
author: user.id,
cms_page_update,
retain_ids: false,
history_change_reason: HistoryChangeReason::PageSaved,
is_exam_page,
},
models_requests::make_spec_fetcher(
app_conf.base_url.clone(),
request_id.0,
jwt_key.into_inner(),
),
models_requests::fetch_service_info,
)
.await?;
token.authorized_ok(web::Json(saved))
}
#[instrument(skip(pool))]
async fn get_page_navigation(
page_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
) -> ControllerResult<web::Json<PageNavigationInformation>> {
let mut conn = pool.acquire().await?;
let token = skip_authorize();
let res = models::pages::get_page_navigation_data(&mut conn, *page_id).await?;
token.authorized_ok(web::Json(res))
}
pub fn _add_routes(cfg: &mut ServiceConfig) {
cfg.route("/{page_id}", web::get().to(get_page))
.route("/{page_id}/info", web::get().to(get_page_info))
.route(
"/{page_id}/page-navigation",
web::get().to(get_page_navigation),
)
.route("/{page_id}", web::put().to(update_page));
}