Skip to main content

headless_lms_models/
chatbot_conversation_message_messages.rs

1use crate::prelude::*;
2use std::fmt;
3use utoipa::ToSchema;
4
5#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy, Type, ToSchema)]
6#[sqlx(type_name = "message_role", rename_all = "snake_case")]
7#[serde(rename_all = "snake_case")]
8pub enum MessageRole {
9    Assistant,
10    User,
11    Developer,
12    System,
13}
14
15impl fmt::Display for MessageRole {
16    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17        write!(f, "{:?}", self)
18    }
19}
20
21#[derive(Clone, PartialEq, Deserialize, Serialize, Debug, ToSchema)]
22pub struct ChatbotConversationMessageMessage {
23    pub id: Uuid,
24    pub created_at: DateTime<Utc>,
25    pub updated_at: DateTime<Utc>,
26    pub deleted_at: Option<DateTime<Utc>>,
27    pub chatbot_conversation_message_id: Uuid,
28    pub text: String,
29    pub message_role: MessageRole,
30    pub message_is_complete: bool,
31    pub used_tokens: i32,
32    pub response_id: Option<String>,
33}
34
35impl Default for ChatbotConversationMessageMessage {
36    fn default() -> Self {
37        Self {
38            id: Uuid::nil(),
39            chatbot_conversation_message_id: Uuid::nil(),
40            created_at: Default::default(),
41            updated_at: Default::default(),
42            deleted_at: None,
43            text: Default::default(),
44            message_role: MessageRole::System,
45            message_is_complete: false,
46            used_tokens: Default::default(),
47            response_id: None,
48        }
49    }
50}
51
52pub async fn insert(
53    conn: &mut PgConnection,
54    input: ChatbotConversationMessageMessage,
55    message_id: Uuid,
56) -> ModelResult<ChatbotConversationMessageMessage> {
57    if input.message_role == MessageRole::System {
58        return Err(ModelError::new(
59            ModelErrorType::InvalidRequest,
60            "Cannot save chatbot conversation message with role system to the database.",
61            None,
62        ));
63    }
64    let res = sqlx::query_as!(
65        ChatbotConversationMessageMessage,
66        r#"
67INSERT INTO chatbot_conversation_message_messages (
68    chatbot_conversation_message_id,
69    text,
70    message_role,
71    message_is_complete,
72    used_tokens,
73    response_id
74  )
75VALUES ($1, $2, $3, $4, $5, $6)
76RETURNING
77    id,
78    created_at,
79    updated_at,
80    deleted_at,
81    chatbot_conversation_message_id,
82    text,
83    message_role as "message_role: MessageRole",
84    message_is_complete,
85    used_tokens,
86    response_id
87        "#,
88        message_id,
89        input.text,
90        input.message_role as MessageRole,
91        input.message_is_complete,
92        input.used_tokens,
93        input.response_id,
94    )
95    .fetch_one(conn)
96    .await?;
97    Ok(res)
98}
99
100pub async fn update(
101    conn: &mut PgConnection,
102    conversation_message_id: Uuid,
103    text: &str,
104    message_is_complete: bool,
105    used_tokens: i32,
106) -> ModelResult<ChatbotConversationMessageMessage> {
107    let res = sqlx::query_as!(
108        ChatbotConversationMessageMessage,
109        r#"
110UPDATE chatbot_conversation_message_messages
111SET text = $2, message_is_complete = $3, used_tokens = $4
112WHERE chatbot_conversation_message_id = $1
113RETURNING
114    id,
115    created_at,
116    updated_at,
117    deleted_at,
118    chatbot_conversation_message_id,
119    text,
120    message_role as "message_role: MessageRole",
121    message_is_complete,
122    used_tokens,
123    response_id
124        "#,
125        conversation_message_id,
126        text.to_string(),
127        message_is_complete,
128        used_tokens
129    )
130    .fetch_one(conn)
131    .await?;
132
133    Ok(res)
134}
135
136pub async fn get_by_id(
137    conn: &mut PgConnection,
138    id: Uuid,
139) -> ModelResult<ChatbotConversationMessageMessage> {
140    let res = sqlx::query_as!(
141        ChatbotConversationMessageMessage,
142        r#"
143SELECT
144    id,
145    created_at,
146    updated_at,
147    deleted_at,
148    chatbot_conversation_message_id,
149    text,
150    message_role as "message_role: MessageRole",
151    message_is_complete,
152    used_tokens,
153    response_id
154FROM chatbot_conversation_message_messages
155WHERE id = $1
156  AND deleted_at IS NULL
157        "#,
158        id
159    )
160    .fetch_one(conn)
161    .await?;
162    Ok(res)
163}
164
165pub async fn get_by_message_id(
166    conn: &mut PgConnection,
167    message_id: Uuid,
168) -> ModelResult<Option<ChatbotConversationMessageMessage>> {
169    let res = sqlx::query_as!(
170        ChatbotConversationMessageMessage,
171        r#"
172SELECT
173    id,
174    created_at,
175    updated_at,
176    deleted_at,
177    chatbot_conversation_message_id,
178    text,
179    message_role as "message_role: MessageRole",
180    message_is_complete,
181    used_tokens,
182    response_id
183FROM chatbot_conversation_message_messages
184WHERE chatbot_conversation_message_id = $1
185  AND deleted_at IS NULL
186        "#,
187        message_id
188    )
189    .fetch_optional(conn)
190    .await?;
191    Ok(res)
192}
193
194pub async fn delete(
195    conn: &mut PgConnection,
196    id: Uuid,
197) -> ModelResult<ChatbotConversationMessageMessage> {
198    let res = sqlx::query_as!(
199        ChatbotConversationMessageMessage,
200        r#"
201UPDATE chatbot_conversation_message_messages
202SET deleted_at = NOW()
203WHERE id = $1
204  AND deleted_at IS NULL
205RETURNING
206    id,
207    created_at,
208    updated_at,
209    deleted_at,
210    chatbot_conversation_message_id,
211    text,
212    message_role as "message_role: MessageRole",
213    message_is_complete,
214    used_tokens,
215    response_id
216        "#,
217        id
218    )
219    .fetch_one(conn)
220    .await?;
221    Ok(res)
222}