use super::DataManager; use crate::model::{Chat, ChatStyle}; use oiseau::{PostgresRow, cache::Cache, execute, get, params}; use tetratto_core::{ auto_method, model::{Error, Result}, }; impl DataManager { /// Get a [`Chat`] from an SQL row. pub(crate) fn get_chat_from_row(x: &PostgresRow) -> Chat { Chat { id: get!(x->0(i64)) as usize, created: get!(x->1(i64)) as usize, style: serde_json::from_str(&get!(x->2(String))).unwrap(), members: serde_json::from_str(&get!(x->3(String))).unwrap(), last_message_created: get!(x->4(i64)) as usize, last_message_read_by: serde_json::from_str(&get!(x->5(String))).unwrap(), } } auto_method!(get_chat_by_id(usize as i64)@get_chat_from_row -> "SELECT * FROM t_chats WHERE id = $1" --name="chat" --returns=Chat --cache-key-tmpl="twny.chat:{}"); /// Create a new chat in the database. /// /// # Arguments /// * `data` - a mock [`Chat`] object to insert pub async fn create_chat(&self, data: Chat) -> Result { // check values if let ChatStyle::Group(ref info) = data.style { if info.name.trim().len() < 2 { return Err(Error::DataTooShort("name".to_string())); } else if info.name.len() > 128 { return Err(Error::DataTooLong("name".to_string())); } } // ... let conn = match self.0.connect().await { Ok(c) => c, Err(e) => return Err(Error::DatabaseConnection(e.to_string())), }; let res = execute!( &conn, "INSERT INTO t_chats VALUES ($1, $2, $3, $4, $5, $6)", params![ &(data.id as i64), &(data.created as i64), &serde_json::to_string(&data.style).unwrap(), &serde_json::to_string(&data.members).unwrap(), &(data.last_message_created as i64), &serde_json::to_string(&data.last_message_read_by).unwrap() ] ); if let Err(e) = res { return Err(Error::DatabaseError(e.to_string())); } Ok(data) } /// Delete an existing chat. pub async fn delete_chat(&self, id: usize) -> Result<()> { let conn = match self.0.connect().await { Ok(c) => c, Err(e) => return Err(Error::DatabaseConnection(e.to_string())), }; // delete chat let res = execute!( &conn, "DELETE FROM t_chats WHERE id = $1", params![&(id as i64)] ); if let Err(e) = res { return Err(Error::DatabaseError(e.to_string())); } // delete messages let res = execute!( &conn, "DELETE FROM t_messages WHERE chat = $1", params![&(id as i64)] ); if let Err(e) = res { return Err(Error::DatabaseError(e.to_string())); } // ... Ok(()) } auto_method!(update_chat_style(ChatStyle) -> "UPDATE t_chats SET style = $1 WHERE id = $2" --serde --cache-key-tmpl="twny.chat:{}"); auto_method!(update_chat_members(Vec) -> "UPDATE t_chats SET members = $1 WHERE id = $2" --serde --cache-key-tmpl="twny.chat:{}"); auto_method!(update_chat_last_message_read_by(Vec) -> "UPDATE t_chats SET last_message_read_by = $1 WHERE id = $2" --serde --cache-key-tmpl="twny.chat:{}"); auto_method!(update_chat_last_message_created(i64) -> "UPDATE t_chats SET last_message_created = $1 WHERE id = $2" --cache-key-tmpl="twny.chat:{}"); }