headless_lms_server/controllers/main_frontend/courses/
chatbots.rs1use crate::prelude::*;
3
4use headless_lms_models::chatbot_configurations::NewChatbotConf;
5use models::chatbot_configurations::ChatbotConfiguration;
6
7#[instrument(skip(pool))]
9async fn get_chatbots(
10 course_id: web::Path<Uuid>,
11 pool: web::Data<PgPool>,
12 user: AuthUser,
13) -> ControllerResult<web::Json<Vec<ChatbotConfiguration>>> {
14 let mut conn = pool.acquire().await?;
15 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Course(*course_id)).await?;
16
17 let configurations =
18 models::chatbot_configurations::get_for_course(&mut conn, *course_id).await?;
19 token.authorized_ok(web::Json(configurations))
20}
21
22#[instrument(skip(pool, payload))]
24async fn create_chatbot(
25 course_id: web::Path<Uuid>,
26 payload: web::Json<String>,
27 pool: web::Data<PgPool>,
28 user: AuthUser,
29) -> ControllerResult<web::Json<ChatbotConfiguration>> {
30 let mut conn = pool.acquire().await?;
31 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Course(*course_id)).await?;
32 let mut tx = conn.begin().await?;
33
34 let course = models::courses::get_course(&mut tx, *course_id).await?;
35
36 if !course.can_add_chatbot {
37 return Err(ControllerError::new(
38 ControllerErrorType::BadRequest,
39 "Course doesn't allow creating chatbots.".to_string(),
40 None,
41 ));
42 }
43
44 let configuration = models::chatbot_configurations::insert(
45 &mut tx,
46 PKeyPolicy::Generate,
47 NewChatbotConf {
48 chatbot_name: payload.into_inner(),
49 course_id: *course_id,
50 ..Default::default()
51 },
52 )
53 .await?;
54 tx.commit().await?;
55
56 token.authorized_ok(web::Json(configuration))
57}
58
59#[instrument(skip(pool))]
61async fn set_default_chatbot(
62 ids: web::Path<(Uuid, Uuid)>,
63 pool: web::Data<PgPool>,
64 user: AuthUser,
65) -> ControllerResult<web::Json<ChatbotConfiguration>> {
66 let mut conn = pool.acquire().await?;
67 let (course_id, chatbot_configuration_id) = *ids;
68
69 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Course(course_id)).await?;
70 let mut tx = conn.begin().await?;
71
72 models::chatbot_configurations::remove_default_chatbot_from_course(&mut tx, course_id).await?;
73
74 let chatbot =
75 models::chatbot_configurations::get_by_id(&mut tx, chatbot_configuration_id).await?;
76
77 if course_id != chatbot.course_id {
78 return Err(ControllerError::new(
79 ControllerErrorType::BadRequest,
80 "Chatbot course id doesn't match the course id provided.".to_string(),
81 None,
82 ));
83 }
84
85 let configuration = models::chatbot_configurations::set_default_chatbot_for_course(
86 &mut tx,
87 chatbot_configuration_id,
88 )
89 .await?;
90 tx.commit().await?;
91
92 token.authorized_ok(web::Json(configuration))
93}
94
95#[instrument(skip(pool))]
97async fn set_non_default_chatbot(
98 ids: web::Path<(Uuid, Uuid)>,
99 pool: web::Data<PgPool>,
100 user: AuthUser,
101) -> ControllerResult<web::Json<ChatbotConfiguration>> {
102 let mut conn = pool.acquire().await?;
103 let (course_id, chatbot_configuration_id) = *ids;
104
105 let token = authorize(&mut conn, Act::Edit, Some(user.id), Res::Course(course_id)).await?;
106 let mut tx = conn.begin().await?;
107
108 models::chatbot_configurations::remove_default_chatbot_from_course(&mut tx, course_id).await?;
109
110 let configuration =
111 models::chatbot_configurations::get_by_id(&mut tx, chatbot_configuration_id).await?;
112
113 if course_id != configuration.course_id {
114 return Err(ControllerError::new(
115 ControllerErrorType::BadRequest,
116 "Chatbot course id doesn't match the course id provided.".to_string(),
117 None,
118 ));
119 }
120 tx.commit().await?;
121
122 token.authorized_ok(web::Json(configuration))
123}
124
125pub fn _add_routes(cfg: &mut web::ServiceConfig) {
126 cfg.route("", web::get().to(get_chatbots))
127 .route("", web::post().to(create_chatbot))
128 .route(
129 "/{chatbot_configuration_id}/set-as-default",
130 web::post().to(set_default_chatbot),
131 )
132 .route(
133 "/{chatbot_configuration_id}/set-as-non-default",
134 web::post().to(set_non_default_chatbot),
135 );
136}