summaryrefslogtreecommitdiff
path: root/src/types
diff options
context:
space:
mode:
Diffstat (limited to 'src/types')
-rw-r--r--src/types/chat.rs98
-rw-r--r--src/types/mod.rs1
2 files changed, 99 insertions, 0 deletions
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<u64>,
+ 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<u64>, name: String) -> Result<Self> {
+ 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<Vec<Self>> {
+ 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<Self> {
+ 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<bool> {
+ 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<bool> {
+ 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<ChatMessage> {
+ 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<Vec<ChatMessage>> {
+ 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;