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}