Skip to main content

headless_lms_server/controllers/main_frontend/
external_courses.rs

1//! Controllers for requests starting with `/api/v0/main-frontend/external_courses`.
2use utoipa::OpenApi;
3
4use models::external_courses::{
5    ExternalCourseOutput, NewExternalCourse, create_external_course, delete_by_id,
6    get_all_external_courses, update_by_id,
7};
8
9use crate::prelude::*;
10
11#[derive(OpenApi)]
12#[openapi(paths(
13    insert_external_course,
14    get_external_courses,
15    update_external_course,
16    delete_external_course
17))]
18pub(crate) struct MainFrontendExternalCoursesApiDoc;
19
20/**
21POST `/api/v0/main-frontend/external-courses/new` - Creates new external course.
22*/
23#[utoipa::path(
24    post,
25    path = "/new",
26    operation_id = "createExternalCourse",
27    tag = "externalCourses",
28    request_body = NewExternalCourse,
29    responses(
30        (status = 200, description = "Created external course", body = ExternalCourseOutput)
31    )
32)]
33#[instrument(skip(pool, app_conf))]
34async fn insert_external_course(
35    request_id: RequestId,
36    pool: web::Data<PgPool>,
37    payload: web::Json<NewExternalCourse>,
38    user: AuthUser,
39    app_conf: web::Data<ApplicationConfiguration>,
40) -> ControllerResult<web::Json<ExternalCourseOutput>> {
41    let mut conn = pool.acquire().await?;
42    let new_course = payload.0;
43    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?;
44
45    let external_course = create_external_course(&mut conn, &app_conf, new_course).await?;
46
47    token.authorized_ok(web::Json(external_course))
48}
49
50/**
51GET `/api/v0/main-frontend/external-courses/all` - Gets all external courses.
52 */
53#[utoipa::path(
54    get,
55    path = "/all",
56    operation_id = "getExternalCourses",
57    tag = "externalCourses",
58    responses(
59        (
60            status = 200,
61            description = "All external courses",
62            body = Vec<ExternalCourseOutput>
63        )
64    )
65)]
66#[instrument(skip(pool))]
67async fn get_external_courses(
68    pool: web::Data<PgPool>,
69    user: AuthUser,
70) -> ControllerResult<web::Json<Vec<ExternalCourseOutput>>> {
71    let mut conn = pool.acquire().await?;
72    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?;
73
74    let external_courses = get_all_external_courses(&mut conn).await?;
75    token.authorized_ok(web::Json(external_courses))
76}
77
78/**
79POST `/api/v0/main-frontend/external-courses/update` - Updates external course.
80*/
81#[utoipa::path(
82    post,
83    path = "/update",
84    operation_id = "updateExternalCourse",
85    tag = "externalCourses",
86    request_body = ExternalCourseOutput,
87    responses(
88        (status = 200, description = "Updated external course", body = ExternalCourseOutput)
89    )
90)]
91#[instrument(skip(pool, app_conf))]
92async fn update_external_course(
93    request_id: RequestId,
94    pool: web::Data<PgPool>,
95    payload: web::Json<ExternalCourseOutput>,
96    user: AuthUser,
97    app_conf: web::Data<ApplicationConfiguration>,
98) -> ControllerResult<web::Json<ExternalCourseOutput>> {
99    let mut conn = pool.acquire().await?;
100    let update = payload.0;
101    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?;
102
103    let external_course = update_by_id(&mut conn, &app_conf, update).await?;
104
105    token.authorized_ok(web::Json(external_course))
106}
107
108/**
109POST `/api/v0/main-frontend/external-courses/delete` - Deletes external course.
110*/
111#[utoipa::path(
112    post,
113    path = "/delete",
114    operation_id = "deleteExternalCourse",
115    tag = "externalCourses",
116    request_body = ExternalCourseOutput,
117    responses(
118        (status = 200, description = "Deleted external course", body = ExternalCourseOutput)
119    )
120)]
121#[instrument(skip(pool))]
122async fn delete_external_course(
123    request_id: RequestId,
124    pool: web::Data<PgPool>,
125    payload: web::Json<ExternalCourseOutput>,
126    user: AuthUser,
127) -> ControllerResult<web::Json<ExternalCourseOutput>> {
128    let mut conn = pool.acquire().await?;
129    let to_delete = payload.0;
130    let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::GlobalPermissions).await?;
131
132    let deleted_course = delete_by_id(&mut conn, to_delete.id).await?;
133
134    token.authorized_ok(web::Json(deleted_course))
135}
136
137/**
138Add a route for each controller in this module.
139
140The name starts with an underline in order to appear before other functions in the module documentation.
141
142We add the routes by calling the route method instead of using the route annotations because this method preserves the function signatures for documentation.
143*/
144pub fn _add_routes(cfg: &mut ServiceConfig) {
145    cfg.route("/new", web::post().to(insert_external_course))
146        .route("/all", web::get().to(get_external_courses))
147        .route("update", web::post().to(update_external_course))
148        .route("delete", web::post().to(delete_external_course));
149}