Skip to content
Snippets Groups Projects
Verified Commit d5d14305 authored by insert's avatar insert
Browse files

Finish implementing all routes.

parent 331d636f
Branches
Tags
No related merge requests found
......@@ -4,7 +4,10 @@ use serde::{ Deserialize, Serialize };
pub struct Channel {
#[serde(rename = "_id")]
pub id: String,
#[serde(rename = "type")]
pub channel_type: u8,
pub last_message: Option<String>,
// for Direct Messages
pub recipients: Option<Vec<String>>,
......
use serde::{ Deserialize, Serialize };
use bson::{ UtcDateTime };
#[derive(Serialize, Deserialize, Debug)]
pub struct Message {
#[serde(rename = "_id")]
pub id: String,
pub id: String,
pub channel: String,
pub author: String,
pub content: String,
pub edited: Option<UtcDateTime>,
}
......@@ -2,7 +2,7 @@ use rocket::http::{ RawStr };
use rocket::request::{ FromParam };
use bson::{ bson, doc, from_bson };
use crate::database;
use crate::database::{ self, user::User };
use database::channel::Channel;
use database::message::Message;
......
use crate::database::{ user::User, channel::Channel };
use crate::database::{ self, user::User, channel::Channel, message::Message };
use rocket_contrib::json::{ JsonValue };
use bson::{ bson, doc, from_bson, Bson::UtcDatetime };
use rocket_contrib::json::{ JsonValue, Json };
use serde::{ Serialize, Deserialize };
use num_enum::TryFromPrimitive;
use bson::{ doc };
use chrono::prelude::*;
use ulid::Ulid;
#[derive(Debug, TryFromPrimitive)]
#[repr(usize)]
......@@ -46,3 +49,190 @@ pub fn channel(user: User, target: Channel) -> Option<JsonValue> {
}
))
}
/// delete channel
/// or leave group DM
/// or close DM conversation
#[delete("/<target>")]
pub fn delete(user: User, target: Channel) -> Option<JsonValue> {
if !has_permission(&user, &target) {
return None
}
let col = database::get_collection("channels");
Some(match target.channel_type {
0 => {
col.update_one(
doc! { "_id": target.id },
doc! { "$set": { "active": false } },
None
).expect("Failed to update channel.");
json!({
"success": true
})
},
1 => {
// ? TODO: group dm
json!({
"success": true
})
},
2 => {
// ? TODO: guild
json!({
"success": true
})
},
_ =>
json!({
"success": false
})
})
}
/// fetch channel messages
#[get("/<target>/messages")]
pub fn messages(user: User, target: Channel) -> Option<JsonValue> {
if !has_permission(&user, &target) {
return None
}
let col = database::get_collection("messages");
let result = col.find(
doc! { "channel": target.id },
None
).unwrap();
let mut messages = Vec::new();
for item in result {
let message: Message = from_bson(bson::Bson::Document(item.unwrap())).expect("Failed to unwrap message.");
messages.push(
json!({
"id": message.id,
"author": message.author,
"content": message.content,
"edited": if let Some(t) = message.edited { Some(t.timestamp()) } else { None }
})
);
}
Some(json!(messages))
}
#[derive(Serialize, Deserialize)]
pub struct SendMessage {
content: String,
}
/// send a message to a channel
#[post("/<target>/messages", data = "<message>")]
pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> Option<JsonValue> {
if !has_permission(&user, &target) {
return None
}
let col = database::get_collection("messages");
let id = Ulid::new().to_string();
Some(match col.insert_one(
doc! {
"_id": id.clone(),
"channel": target.id,
"author": user.id,
"content": message.content.clone(),
},
None
) {
Ok(_) =>
json!({
"success": true,
"id": id
}),
Err(_) =>
json!({
"success": false,
"error": "Failed database query."
})
})
}
#[derive(Serialize, Deserialize)]
pub struct EditMessage {
content: String,
}
/// edit a message
#[patch("/<target>/messages/<message>", data = "<edit>")]
pub fn edit_message(user: User, target: Channel, message: Message, edit: Json<SendMessage>) -> Option<JsonValue> {
if !has_permission(&user, &target) {
return None
}
Some(
if message.author != user.id {
json!({
"success": false,
"error": "You did not send this message."
})
} else {
let col = database::get_collection("messages");
match col.update_one(
doc! { "_id": message.id },
doc! {
"$set": {
"content": edit.content.clone(),
"edited": UtcDatetime(Utc::now())
}
},
None
) {
Ok(_) =>
json!({
"success": true
}),
Err(_) =>
json!({
"success": false,
"error": "Failed to update message."
})
}
}
)
}
/// delete a message
#[delete("/<target>/messages/<message>")]
pub fn delete_message(user: User, target: Channel, message: Message) -> Option<JsonValue> {
if !has_permission(&user, &target) {
return None
}
Some(
if message.author != user.id {
json!({
"success": false,
"error": "You did not send this message."
})
} else {
let col = database::get_collection("messages");
match col.delete_one(
doc! { "_id": message.id },
None
) {
Ok(_) =>
json!({
"success": true
}),
Err(_) =>
json!({
"success": false,
"error": "Failed to delete message."
})
}
}
)
}
......@@ -8,5 +8,5 @@ pub fn mount(rocket: Rocket) -> Rocket {
rocket
.mount("/api/account", routes![ account::create, account::verify_email, account::resend_email, account::login ])
.mount("/api/users", routes![ user::me, user::user, user::lookup, user::dms, user::dm, user::get_friends, user::get_friend, user::add_friend, user::remove_friend ])
.mount("/api/channels", routes![ channel::channel ])
.mount("/api/channels", routes![ channel::channel, channel::delete, channel::messages, channel::send_message, channel::edit_message, channel::delete_message ])
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment