From a2c89301d5c63f573ac6680f9c11acda69043a78 Mon Sep 17 00:00:00 2001 From: Tyler Murphy <=> Date: Wed, 26 Jul 2023 01:04:39 -0400 Subject: start dms --- src/types/chat.rs | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/types/mod.rs | 1 + 2 files changed, 99 insertions(+) create mode 100644 src/types/chat.rs (limited to 'src/types') diff --git a/src/types/chat.rs b/src/types/chat.rs new file mode 100644 index 0000000..dadcf10 --- /dev/null +++ b/src/types/chat.rs @@ -0,0 +1,98 @@ +use serde::Serialize; +use tracing::instrument; +use crate::{types::http::{ResponseCode, Result}, database::Database}; + +#[derive(Serialize, Clone, Debug)] +pub struct ChatRoom { + pub room_id: u64, + pub users: Vec, + pub name: String +} + +#[derive(Serialize, Clone, Debug)] +pub struct ChatMessage { + pub message_id: u64, + pub user_id: u64, + pub room_id: u64, + pub date: u64, + pub content: String +} + +impl ChatRoom { + + #[instrument(skip(db))] + pub fn new(db: &Database, users: Vec, name: String) -> Result { + let Ok(room) = db.create_room(users, name) else { + tracing::error!("Failed to create room"); + return Err(ResponseCode::InternalServerError.text("Failed to create room")) + }; + + Ok(room) + } + + #[instrument(skip(db))] + pub fn from_user_id(db: &Database, user_id: u64) -> Result> { + let Ok(rooms) = db.get_rooms(user_id) else { + tracing::error!("Failed to get rooms"); + return Err(ResponseCode::InternalServerError.text("Failed to get rooms")) + }; + + Ok(rooms) + } + + #[instrument(skip(db))] + pub fn from_user_and_room_id(db: &Database, user_id: u64, room_id: u64) -> Result { + let Ok(rooms) = db.get_rooms(user_id) else { + tracing::error!("Failed to get room"); + return Err(ResponseCode::InternalServerError.text("Failed to get room")) + }; + + for room in rooms { + if room.room_id == room_id { + return Ok(room); + } + } + + return Err(ResponseCode::BadRequest.text("Room doesnt exist or you are not in it")) + } + + #[instrument(skip(db))] + pub fn add_user(&self, db: &Database, user_id: u64) -> Result { + let Ok(success) = db.add_user_to_room(self.room_id, user_id) else { + tracing::error!("Failed to add user to room"); + return Err(ResponseCode::InternalServerError.text("Failed to add user to room")) + }; + + Ok(success) + } + + #[instrument(skip(db))] + pub fn remove_user(&self, db: &Database, user_id: u64) -> Result { + let Ok(success) = db.remove_user_from_room(self.room_id, user_id) else { + tracing::error!("Failed to remove user from room"); + return Err(ResponseCode::InternalServerError.text("Failed to remove user from room")) + }; + + Ok(success) + } + + #[instrument(skip(db))] + pub fn send_message(&self, db: &Database, user_id: u64, content: String) -> Result { + let Ok(msg) = db.create_message(self.room_id, user_id, content) else { + tracing::error!("Failed to create messgae"); + return Err(ResponseCode::InternalServerError.text("Failed to create message")) + }; + + Ok(msg) + } + + #[instrument(skip(db))] + pub fn load_old_chat_messagegs(&self, db: &Database, newest_message: u64, page: u64) -> Result> { + let Ok(msgs) = db.load_old_chat_messages(self.room_id, newest_message, page) else { + tracing::error!("Failed to load messgaes"); + return Err(ResponseCode::InternalServerError.text("Failed to load messages")) + }; + + Ok(msgs) + } +} diff --git a/src/types/mod.rs b/src/types/mod.rs index 1ee2d08..a325ff9 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,3 +1,4 @@ +pub mod chat; pub mod comment; pub mod extract; pub mod http; -- cgit v1.2.3-freya