diff --git a/src/database/message.rs b/src/database/message.rs index 96d671bfe649045d2d3cd8fe59fb19c0cce84373..cdf679cbf6d5518a183bfccfd4e26f7b2b422009 100644 --- a/src/database/message.rs +++ b/src/database/message.rs @@ -1,8 +1,8 @@ use super::get_collection; -use crate::guards::channel::ChannelRef; use crate::notifications; use crate::notifications::events::message::Create; use crate::notifications::events::Notification; +use crate::database::channel::Channel; use crate::routes::channel::ChannelType; use bson::{doc, to_bson, UtcDateTime}; @@ -32,7 +32,7 @@ pub struct Message { // ? pub fn send_message(); // ? handle websockets? impl Message { - pub fn send(&self, target: &ChannelRef) -> bool { + pub fn send(&self, target: &Channel) -> bool { if get_collection("messages") .insert_one(to_bson(&self).unwrap().as_document().unwrap().clone(), None) .is_ok() diff --git a/src/database/permissions.rs b/src/database/permissions.rs index e72236b3b00f355e6daa7c5018c4d58d6676ff0b..0064a7de23105e5c7f1851387e8f73bdfce0ffaf 100644 --- a/src/database/permissions.rs +++ b/src/database/permissions.rs @@ -1,8 +1,8 @@ use super::mutual::has_mutual_connection; +use crate::database::channel::Channel; use crate::database::guild::Member; use crate::database::user::UserRelationship; use crate::guards::auth::UserRef; -use crate::guards::channel::ChannelRef; use crate::guards::guild::{get_member, GuildRef}; use num_enum::TryFromPrimitive; @@ -88,7 +88,7 @@ pub fn get_relationship(a: &UserRef, b: &UserRef) -> Relationship { pub struct PermissionCalculator { pub user: UserRef, - pub channel: Option<ChannelRef>, + pub channel: Option<Channel>, pub guild: Option<GuildRef>, pub member: Option<Member>, } @@ -103,7 +103,7 @@ impl PermissionCalculator { } } - pub fn channel(self, channel: ChannelRef) -> PermissionCalculator { + pub fn channel(self, channel: Channel) -> PermissionCalculator { PermissionCalculator { channel: Some(channel), ..self diff --git a/src/guards/channel.rs b/src/guards/channel.rs index 171136e7f3063475d831602e57117b4f6db38773..37982f2083416fa1ae36193876f5f3dc1e887e0a 100644 --- a/src/guards/channel.rs +++ b/src/guards/channel.rs @@ -6,9 +6,23 @@ use serde::{Deserialize, Serialize}; use crate::database; -use database::channel::LastMessage; +use database::channel::{ Channel, fetch_channel }; use database::message::Message; +impl<'r> FromParam<'r> for Channel { + type Error = &'r RawStr; + + fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> { + Ok(fetch_channel(param)) + /*if let Some(channel) = fetch_channel(param) { + Ok(channel) + } else { + Err(param) + }*/ + } +} + +/* #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ChannelRef { #[serde(rename = "_id")] @@ -84,7 +98,7 @@ impl<'r> FromParam<'r> for ChannelRef { Err(param) } } -} +}*/ impl<'r> FromParam<'r> for Message { type Error = &'r RawStr; diff --git a/src/notifications/mod.rs b/src/notifications/mod.rs index ae911814b26ec0111a95444b0fd5ad84ed7e7dd4..1e3baadcc9d607e43c45f7130b2e50e90c7fbe16 100644 --- a/src/notifications/mod.rs +++ b/src/notifications/mod.rs @@ -1,4 +1,4 @@ -use crate::guards::channel::ChannelRef; +use crate::database::channel::Channel; use once_cell::sync::OnceCell; use std::sync::mpsc::{channel, Sender}; @@ -65,7 +65,7 @@ pub fn send_message_threaded<U: Into<Option<Vec<String>>>, G: Into<Option<String } } -pub fn send_message_given_channel(data: events::Notification, channel: &ChannelRef) { +pub fn send_message_given_channel(data: events::Notification, channel: &Channel) { match channel.channel_type { 0..=1 => send_message_threaded(channel.recipients.clone(), None, data), 2 => send_message_threaded(None, channel.guild.clone(), data), diff --git a/src/routes/channel.rs b/src/routes/channel.rs index 36b576b0db27c0d144a85f685c66daaf07309b6c..adebb6e17d0434a7c05198829cf1b30eb47fbe64 100644 --- a/src/routes/channel.rs +++ b/src/routes/channel.rs @@ -1,10 +1,9 @@ use super::Response; use crate::database::{ self, get_relationship, get_relationship_internal, message::Message, Permission, - PermissionCalculator, Relationship, + PermissionCalculator, Relationship, channel::Channel }; use crate::guards::auth::UserRef; -use crate::guards::channel::ChannelRef; use crate::notifications::{ self, events::{groups::*, guilds::ChannelDelete, message::*, Notification}, @@ -130,7 +129,7 @@ pub fn create_group(user: UserRef, info: Json<CreateGroup>) -> Response { /// fetch channel information #[get("/<target>")] -pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> { +pub fn channel(user: UserRef, target: Channel) -> Option<Response> { with_permissions!(user, target); match target.channel_type { @@ -141,39 +140,39 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> { "recipients": target.recipients, }))), 1 => { - if let Some(info) = target.fetch_data(doc! { + /*if let Some(info) = target.fetch_data(doc! { "name": 1, "description": 1, "owner": 1, - }) { + }) {*/ Some(Response::Success(json!({ "id": target.id, "type": target.channel_type, "last_message": target.last_message, "recipients": target.recipients, - "name": info.get_str("name").unwrap(), - "owner": info.get_str("owner").unwrap(), - "description": info.get_str("description").unwrap_or(""), + "name": target.name, + "owner": target.owner, + "description": target.description, }))) - } else { + /*} else { None - } + }*/ } 2 => { - if let Some(info) = target.fetch_data(doc! { + /*if let Some(info) = target.fetch_data(doc! { "name": 1, "description": 1, - }) { + }) {*/ Some(Response::Success(json!({ "id": target.id, "type": target.channel_type, "guild": target.guild, - "name": info.get_str("name").unwrap(), - "description": info.get_str("description").unwrap_or(""), + "name": target.name, + "description": target.description, }))) - } else { + /*} else { None - } + }*/ } _ => unreachable!(), } @@ -181,7 +180,7 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> { /// [groups] add user to channel #[put("/<target>/recipients/<member>")] -pub fn add_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option<Response> { +pub fn add_member(user: UserRef, target: Channel, member: UserRef) -> Option<Response> { if target.channel_type != 1 { return Some(Response::BadRequest(json!({ "error": "Not a group DM." }))); } @@ -255,7 +254,7 @@ pub fn add_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option< /// [groups] remove user from channel #[delete("/<target>/recipients/<member>")] -pub fn remove_member(user: UserRef, target: ChannelRef, member: UserRef) -> Option<Response> { +pub fn remove_member(user: UserRef, target: Channel, member: UserRef) -> Option<Response> { if target.channel_type != 1 { return Some(Response::BadRequest(json!({ "error": "Not a group DM." }))); } @@ -327,7 +326,7 @@ pub fn remove_member(user: UserRef, target: ChannelRef, member: UserRef) -> Opti /// or leave group DM /// or close DM conversation #[delete("/<target>")] -pub fn delete(user: UserRef, target: ChannelRef) -> Option<Response> { +pub fn delete(user: UserRef, target: Channel) -> Option<Response> { let permissions = with_permissions!(user, target); if !permissions.get_manage_channels() { @@ -490,7 +489,7 @@ pub struct MessageFetchOptions { #[get("/<target>/messages?<options..>")] pub fn messages( user: UserRef, - target: ChannelRef, + target: Channel, options: Form<MessageFetchOptions>, ) -> Option<Response> { let permissions = with_permissions!(user, target); @@ -554,7 +553,7 @@ pub struct SendMessage { #[post("/<target>/messages", data = "<message>")] pub fn send_message( user: UserRef, - target: ChannelRef, + target: Channel, message: Json<SendMessage>, ) -> Option<Response> { let permissions = with_permissions!(user, target); @@ -609,7 +608,7 @@ pub fn send_message( /// get a message #[get("/<target>/messages/<message>")] -pub fn get_message(user: UserRef, target: ChannelRef, message: Message) -> Option<Response> { +pub fn get_message(user: UserRef, target: Channel, message: Message) -> Option<Response> { let permissions = with_permissions!(user, target); if !permissions.get_read_messages() { @@ -643,7 +642,7 @@ pub struct EditMessage { #[patch("/<target>/messages/<message>", data = "<edit>")] pub fn edit_message( user: UserRef, - target: ChannelRef, + target: Channel, message: Message, edit: Json<EditMessage>, ) -> Option<Response> { @@ -700,7 +699,7 @@ pub fn edit_message( /// delete a message #[delete("/<target>/messages/<message>")] -pub fn delete_message(user: UserRef, target: ChannelRef, message: Message) -> Option<Response> { +pub fn delete_message(user: UserRef, target: Channel, message: Message) -> Option<Response> { let permissions = with_permissions!(user, target); if !permissions.get_manage_messages() { diff --git a/src/routes/guild.rs b/src/routes/guild.rs index 9c272087cd70c086609388900910b9b592a243a0..405a3d46a27825f0a6011c9d946c71500c8bca03 100644 --- a/src/routes/guild.rs +++ b/src/routes/guild.rs @@ -1,8 +1,7 @@ use super::channel::ChannelType; use super::Response; -use crate::database::{self, channel::Channel, Permission, PermissionCalculator}; +use crate::database::{self, channel::Channel, channel::fetch_channel, Permission, PermissionCalculator}; use crate::guards::auth::UserRef; -use crate::guards::channel::ChannelRef; use crate::guards::guild::{get_invite, get_member, GuildRef}; use crate::notifications::{ self, @@ -331,7 +330,7 @@ pub struct InviteOptions { pub fn create_invite( user: UserRef, target: GuildRef, - channel: ChannelRef, + channel: Channel, _options: Json<InviteOptions>, ) -> Option<Response> { let (permissions, _) = with_permissions!(user, target); @@ -430,7 +429,8 @@ pub fn fetch_invites(user: UserRef, target: GuildRef) -> Option<Response> { #[get("/join/<code>", rank = 1)] pub fn fetch_invite(user: UserRef, code: String) -> Response { if let Some((guild_id, name, invite)) = get_invite(&code, user.id) { - if let Some(channel) = ChannelRef::from(invite.channel) { + //if let Some(channel) = ChannelRef::from(invite.channel) { + let channel = fetch_channel(&invite.channel); Response::Success(json!({ "guild": { "id": guild_id, @@ -441,9 +441,9 @@ pub fn fetch_invite(user: UserRef, code: String) -> Response { "name": channel.name, } })) - } else { + /*} else { Response::BadRequest(json!({ "error": "Failed to fetch channel." })) - } + }*/ } else { Response::NotFound(json!({ "error": "Failed to fetch invite or code is invalid." })) }