headless_lms_models/
chatbot_conversation_messages.rs

1use crate::prelude::*;
2
3#[derive(Clone, PartialEq, Deserialize, Serialize)]
4#[cfg_attr(feature = "ts_rs", derive(TS))]
5pub struct ChatbotConversationMessage {
6    pub id: Uuid,
7    pub created_at: DateTime<Utc>,
8    pub updated_at: DateTime<Utc>,
9    pub deleted_at: Option<DateTime<Utc>>,
10    pub conversation_id: Uuid,
11    pub message: Option<String>,
12    pub is_from_chatbot: bool,
13    pub message_is_complete: bool,
14    pub used_tokens: i32,
15    pub order_number: i32,
16}
17
18pub async fn insert(
19    conn: &mut PgConnection,
20    input: ChatbotConversationMessage,
21) -> ModelResult<ChatbotConversationMessage> {
22    let res = sqlx::query_as!(
23        ChatbotConversationMessage,
24        r#"
25INSERT INTO chatbot_conversation_messages (conversation_id, message, is_from_chatbot, message_is_complete, used_tokens, order_number)
26VALUES ($1, $2, $3, $4, $5, $6)
27RETURNING *
28        "#,
29        input.conversation_id,
30        input.message,
31        input.is_from_chatbot,
32        input.message_is_complete,
33        input.used_tokens,
34        input.order_number
35    )
36    .fetch_one(conn)
37    .await?;
38    Ok(res)
39}
40
41pub async fn get_by_conversation_id(
42    conn: &mut PgConnection,
43    conversation_id: Uuid,
44) -> ModelResult<Vec<ChatbotConversationMessage>> {
45    let mut res = sqlx::query_as!(
46        ChatbotConversationMessage,
47        r#"
48SELECT * FROM chatbot_conversation_messages
49WHERE conversation_id = $1
50        "#,
51        conversation_id
52    )
53    .fetch_all(conn)
54    .await?;
55    // Should have the same order as in the conversation.
56    res.sort_by(|a, b| a.order_number.cmp(&b.order_number));
57    Ok(res)
58}
59
60pub async fn update(
61    conn: &mut PgConnection,
62    id: Uuid,
63    message: &str,
64    message_is_complete: bool,
65    used_tokens: i32,
66) -> ModelResult<ChatbotConversationMessage> {
67    let res = sqlx::query_as!(
68        ChatbotConversationMessage,
69        r#"
70UPDATE chatbot_conversation_messages
71SET message = $2, message_is_complete = $3, used_tokens = $4
72WHERE id = $1
73RETURNING *
74        "#,
75        id,
76        message,
77        message_is_complete,
78        used_tokens
79    )
80    .fetch_one(conn)
81    .await?;
82    Ok(res)
83}
84
85pub async fn delete(conn: &mut PgConnection, id: Uuid) -> ModelResult<ChatbotConversationMessage> {
86    let res = sqlx::query_as!(
87        ChatbotConversationMessage,
88        r#"
89UPDATE chatbot_conversation_messages
90SET deleted_at = NOW()
91WHERE id = $1
92RETURNING *
93        "#,
94        id
95    )
96    .fetch_one(conn)
97    .await?;
98    Ok(res)
99}