Skip to main content

headless_lms_server/controllers/main_frontend/
course_auditing.rs

1use headless_lms_models::courses::CourseAuditingData;
2use models::courses::CourseAuditingDataUpdate;
3use utoipa::OpenApi;
4
5use crate::prelude::*;
6
7#[derive(OpenApi)]
8#[openapi(paths(get_courses_for_auditing, update_course_auditing_data))]
9pub(crate) struct MainFrontendCourseAuditingApiDoc;
10
11/**
12GET `/api/v0/main-frontend/course-auditing`
13*/
14#[utoipa::path(
15    get,
16    path = "/",
17    operation_id = "getCoursesForAuditing",
18    tag = "course_auditing",
19    responses(
20        (status = 200, description = "Courses for auditing", body = Vec<CourseAuditingData>)
21    )
22)]
23#[instrument(skip(pool))]
24async fn get_courses_for_auditing(
25    pool: web::Data<PgPool>,
26    user: AuthUser,
27) -> ControllerResult<web::Json<Vec<CourseAuditingData>>> {
28    let mut conn = pool.acquire().await?;
29
30    let data = models::courses::all_courses_for_auditing(&mut conn).await?;
31
32    let token = authorize(&mut conn, Act::View, Some(user.id), Res::GlobalPermissions).await?;
33    token.authorized_ok(web::Json(data))
34}
35
36/**
37PUT `/api/v0/main-frontend/course-auditing/:id`
38*/
39#[utoipa::path(
40    put,
41    path = "/{course_id}",
42    operation_id = "updateCourseAuditingData",
43    tag = "course_auditing",
44    params(
45        ("course_id" = Uuid, Path, description = "Course id")
46    ),
47    request_body = CourseAuditingDataUpdate,
48    responses(
49        (status = 200, description = "Updated course", body = CourseAuditingData)
50    )
51)]
52#[instrument(skip(pool, app_conf))]
53async fn update_course_auditing_data(
54    payload: web::Json<CourseAuditingDataUpdate>,
55    app_conf: web::Data<ApplicationConfiguration>,
56    course_id: web::Path<Uuid>,
57    pool: web::Data<PgPool>,
58    user: AuthUser,
59) -> ControllerResult<web::Json<CourseAuditingData>> {
60    let mut conn = pool.acquire().await?;
61
62    models::courses::update_course_auditing_data(
63        &mut conn,
64        app_conf.as_ref(),
65        *course_id,
66        payload.0,
67    )
68    .await?;
69
70    let updated_course = models::courses::course_auditing_data_by_id(&mut conn, *course_id).await?;
71
72    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?;
73
74    token.authorized_ok(web::Json(updated_course))
75}
76
77/**
78Add a route for each controller in this module.
79
80The name starts with an underline in order to appear before other functions in the module documentation.
81
82We add the routes by calling the route method instead of using the route annotations because this method preserves the function signatures for documentation.
83*/
84pub fn _add_routes(cfg: &mut ServiceConfig) {
85    cfg.route("/", web::get().to(get_courses_for_auditing))
86        .route("/{course_id}", web::put().to(update_course_auditing_data));
87}