headless_lms_server/controllers/main_frontend/
external_courses.rs1use 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#[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#[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#[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#[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
137pub 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}