Implement websocket events.
See https://trello.com/c/xjQeLsd4/19-websocket-notification-portal-%F0%9F%94%94
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
use crate::database::{ self, user::User, channel::Channel, message::Message };
|
use crate::database::{ self, user::User, channel::Channel, message::Message };
|
||||||
|
use crate::websocket;
|
||||||
|
|
||||||
use bson::{ bson, doc, from_bson, Bson::UtcDatetime };
|
use bson::{ bson, doc, from_bson, Bson::UtcDatetime };
|
||||||
use rocket_contrib::json::{ JsonValue, Json };
|
use rocket_contrib::json::{ JsonValue, Json };
|
||||||
@@ -35,6 +36,13 @@ fn has_permission(user: &User, target: &Channel) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_recipients(target: &Channel) -> Vec<String> {
|
||||||
|
match target.channel_type {
|
||||||
|
0..=1 => target.recipients.clone().unwrap(),
|
||||||
|
_ => vec![]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// fetch channel information
|
/// fetch channel information
|
||||||
#[get("/<target>")]
|
#[get("/<target>")]
|
||||||
pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
|
pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
|
||||||
@@ -139,17 +147,29 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) ->
|
|||||||
Some(match col.insert_one(
|
Some(match col.insert_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": id.clone(),
|
"_id": id.clone(),
|
||||||
"channel": target.id,
|
"channel": target.id.clone(),
|
||||||
"author": user.id,
|
"author": user.id.clone(),
|
||||||
"content": message.content.clone(),
|
"content": message.content.clone(),
|
||||||
},
|
},
|
||||||
None
|
None
|
||||||
) {
|
) {
|
||||||
Ok(_) =>
|
Ok(_) => {
|
||||||
|
websocket::queue_message(
|
||||||
|
get_recipients(&target),
|
||||||
|
json!({
|
||||||
|
"type": "message",
|
||||||
|
"id": id.clone(),
|
||||||
|
"channel": target.id,
|
||||||
|
"author": user.id,
|
||||||
|
"content": message.content.clone(),
|
||||||
|
}).to_string()
|
||||||
|
);
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"success": true,
|
"success": true,
|
||||||
"id": id
|
"id": id
|
||||||
}),
|
})
|
||||||
|
},
|
||||||
Err(_) =>
|
Err(_) =>
|
||||||
json!({
|
json!({
|
||||||
"success": false,
|
"success": false,
|
||||||
@@ -179,20 +199,33 @@ pub fn edit_message(user: User, target: Channel, message: Message, edit: Json<Se
|
|||||||
} else {
|
} else {
|
||||||
let col = database::get_collection("messages");
|
let col = database::get_collection("messages");
|
||||||
|
|
||||||
|
let edited = UtcDatetime(Utc::now());
|
||||||
match col.update_one(
|
match col.update_one(
|
||||||
doc! { "_id": message.id },
|
doc! { "_id": message.id.clone() },
|
||||||
doc! {
|
doc! {
|
||||||
"$set": {
|
"$set": {
|
||||||
"content": edit.content.clone(),
|
"content": edit.content.clone(),
|
||||||
"edited": UtcDatetime(Utc::now())
|
"edited": edited.clone()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None
|
None
|
||||||
) {
|
) {
|
||||||
Ok(_) =>
|
Ok(_) => {
|
||||||
|
websocket::queue_message(
|
||||||
|
get_recipients(&target),
|
||||||
|
json!({
|
||||||
|
"type": "message_update",
|
||||||
|
"id": message.id,
|
||||||
|
"channel": target.id,
|
||||||
|
"content": message.content.clone(),
|
||||||
|
"edited": edited
|
||||||
|
}).to_string()
|
||||||
|
);
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"success": true
|
"success": true
|
||||||
}),
|
})
|
||||||
|
},
|
||||||
Err(_) =>
|
Err(_) =>
|
||||||
json!({
|
json!({
|
||||||
"success": false,
|
"success": false,
|
||||||
@@ -220,13 +253,23 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J
|
|||||||
let col = database::get_collection("messages");
|
let col = database::get_collection("messages");
|
||||||
|
|
||||||
match col.delete_one(
|
match col.delete_one(
|
||||||
doc! { "_id": message.id },
|
doc! { "_id": message.id.clone() },
|
||||||
None
|
None
|
||||||
) {
|
) {
|
||||||
Ok(_) =>
|
Ok(_) => {
|
||||||
|
websocket::queue_message(
|
||||||
|
get_recipients(&target),
|
||||||
|
json!({
|
||||||
|
"type": "message_delete",
|
||||||
|
"id": message.id,
|
||||||
|
"channel": target.id
|
||||||
|
}).to_string()
|
||||||
|
);
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"success": true
|
"success": true
|
||||||
}),
|
})
|
||||||
|
},
|
||||||
Err(_) =>
|
Err(_) =>
|
||||||
json!({
|
json!({
|
||||||
"success": false,
|
"success": false,
|
||||||
|
|||||||
@@ -147,15 +147,25 @@ pub fn launch_server() {
|
|||||||
pub fn send_message(id: String, message: String) -> std::result::Result<(), ()> {
|
pub fn send_message(id: String, message: String) -> std::result::Result<(), ()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let map = CLIENTS.get().unwrap().read().unwrap();
|
let map = CLIENTS.get().unwrap().read().unwrap();
|
||||||
let arr = map.get(&id).unwrap();
|
if map.contains_key(&id) {
|
||||||
|
let arr = map.get(&id).unwrap();
|
||||||
|
|
||||||
Ok(for item in arr {
|
for item in arr {
|
||||||
match item.out.send(message.clone()) {
|
if let Err(_) = item.out.send(message.clone()) {
|
||||||
Ok(_) => (),
|
|
||||||
Err(_) => {
|
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ! TODO: WRITE THREADED QUEUE SYSTEM
|
||||||
|
// ! FETCH RECIPIENTS HERE INSTEAD OF IN METHOD
|
||||||
|
|
||||||
|
pub fn queue_message(ids: Vec<String>, message: String) {
|
||||||
|
for id in ids {
|
||||||
|
send_message(id, message.clone()).expect("uhhhhhhhhhh can i get uhhhhhhhhhhhhhhhhhh mcdonald cheese burger with fries");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user