summaryrefslogtreecommitdiff
path: root/src/types/chat.rs
blob: dadcf1073ad29bea65884ad1ae971a9b1f4d69c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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)
    }
}