Remove ChannelRef, use the full Channel object.

This commit is contained in:
Paul Makles
2020-08-03 11:01:05 +02:00
parent b0f8abef33
commit fa6ed75ed8
6 changed files with 52 additions and 39 deletions

View File

@@ -1,8 +1,8 @@
use super::get_collection; use super::get_collection;
use crate::guards::channel::ChannelRef;
use crate::notifications; use crate::notifications;
use crate::notifications::events::message::Create; use crate::notifications::events::message::Create;
use crate::notifications::events::Notification; use crate::notifications::events::Notification;
use crate::database::channel::Channel;
use crate::routes::channel::ChannelType; use crate::routes::channel::ChannelType;
use bson::{doc, to_bson, UtcDateTime}; use bson::{doc, to_bson, UtcDateTime};
@@ -32,7 +32,7 @@ pub struct Message {
// ? pub fn send_message(); // ? pub fn send_message();
// ? handle websockets? // ? handle websockets?
impl Message { impl Message {
pub fn send(&self, target: &ChannelRef) -> bool { pub fn send(&self, target: &Channel) -> bool {
if get_collection("messages") if get_collection("messages")
.insert_one(to_bson(&self).unwrap().as_document().unwrap().clone(), None) .insert_one(to_bson(&self).unwrap().as_document().unwrap().clone(), None)
.is_ok() .is_ok()

View File

@@ -1,8 +1,8 @@
use super::mutual::has_mutual_connection; use super::mutual::has_mutual_connection;
use crate::database::channel::Channel;
use crate::database::guild::Member; use crate::database::guild::Member;
use crate::database::user::UserRelationship; use crate::database::user::UserRelationship;
use crate::guards::auth::UserRef; use crate::guards::auth::UserRef;
use crate::guards::channel::ChannelRef;
use crate::guards::guild::{get_member, GuildRef}; use crate::guards::guild::{get_member, GuildRef};
use num_enum::TryFromPrimitive; use num_enum::TryFromPrimitive;
@@ -88,7 +88,7 @@ pub fn get_relationship(a: &UserRef, b: &UserRef) -> Relationship {
pub struct PermissionCalculator { pub struct PermissionCalculator {
pub user: UserRef, pub user: UserRef,
pub channel: Option<ChannelRef>, pub channel: Option<Channel>,
pub guild: Option<GuildRef>, pub guild: Option<GuildRef>,
pub member: Option<Member>, 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 { PermissionCalculator {
channel: Some(channel), channel: Some(channel),
..self ..self

View File

@@ -6,9 +6,23 @@ use serde::{Deserialize, Serialize};
use crate::database; use crate::database;
use database::channel::LastMessage; use database::channel::{ Channel, fetch_channel };
use database::message::Message; 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)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ChannelRef { pub struct ChannelRef {
#[serde(rename = "_id")] #[serde(rename = "_id")]
@@ -84,7 +98,7 @@ impl<'r> FromParam<'r> for ChannelRef {
Err(param) Err(param)
} }
} }
} }*/
impl<'r> FromParam<'r> for Message { impl<'r> FromParam<'r> for Message {
type Error = &'r RawStr; type Error = &'r RawStr;

View File

@@ -1,4 +1,4 @@
use crate::guards::channel::ChannelRef; use crate::database::channel::Channel;
use once_cell::sync::OnceCell; use once_cell::sync::OnceCell;
use std::sync::mpsc::{channel, Sender}; 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 { match channel.channel_type {
0..=1 => send_message_threaded(channel.recipients.clone(), None, data), 0..=1 => send_message_threaded(channel.recipients.clone(), None, data),
2 => send_message_threaded(None, channel.guild.clone(), data), 2 => send_message_threaded(None, channel.guild.clone(), data),

View File

@@ -1,10 +1,9 @@
use super::Response; use super::Response;
use crate::database::{ use crate::database::{
self, get_relationship, get_relationship_internal, message::Message, Permission, self, get_relationship, get_relationship_internal, message::Message, Permission,
PermissionCalculator, Relationship, PermissionCalculator, Relationship, channel::Channel
}; };
use crate::guards::auth::UserRef; use crate::guards::auth::UserRef;
use crate::guards::channel::ChannelRef;
use crate::notifications::{ use crate::notifications::{
self, self,
events::{groups::*, guilds::ChannelDelete, message::*, Notification}, events::{groups::*, guilds::ChannelDelete, message::*, Notification},
@@ -130,7 +129,7 @@ pub fn create_group(user: UserRef, info: Json<CreateGroup>) -> Response {
/// fetch channel information /// fetch channel information
#[get("/<target>")] #[get("/<target>")]
pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> { pub fn channel(user: UserRef, target: Channel) -> Option<Response> {
with_permissions!(user, target); with_permissions!(user, target);
match target.channel_type { match target.channel_type {
@@ -141,39 +140,39 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> {
"recipients": target.recipients, "recipients": target.recipients,
}))), }))),
1 => { 1 => {
if let Some(info) = target.fetch_data(doc! { /*if let Some(info) = target.fetch_data(doc! {
"name": 1, "name": 1,
"description": 1, "description": 1,
"owner": 1, "owner": 1,
}) { }) {*/
Some(Response::Success(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"type": target.channel_type, "type": target.channel_type,
"last_message": target.last_message, "last_message": target.last_message,
"recipients": target.recipients, "recipients": target.recipients,
"name": info.get_str("name").unwrap(), "name": target.name,
"owner": info.get_str("owner").unwrap(), "owner": target.owner,
"description": info.get_str("description").unwrap_or(""), "description": target.description,
}))) })))
} else { /*} else {
None None
} }*/
} }
2 => { 2 => {
if let Some(info) = target.fetch_data(doc! { /*if let Some(info) = target.fetch_data(doc! {
"name": 1, "name": 1,
"description": 1, "description": 1,
}) { }) {*/
Some(Response::Success(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"type": target.channel_type, "type": target.channel_type,
"guild": target.guild, "guild": target.guild,
"name": info.get_str("name").unwrap(), "name": target.name,
"description": info.get_str("description").unwrap_or(""), "description": target.description,
}))) })))
} else { /*} else {
None None
} }*/
} }
_ => unreachable!(), _ => unreachable!(),
} }
@@ -181,7 +180,7 @@ pub fn channel(user: UserRef, target: ChannelRef) -> Option<Response> {
/// [groups] add user to channel /// [groups] add user to channel
#[put("/<target>/recipients/<member>")] #[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 { if target.channel_type != 1 {
return Some(Response::BadRequest(json!({ "error": "Not a group DM." }))); 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 /// [groups] remove user from channel
#[delete("/<target>/recipients/<member>")] #[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 { if target.channel_type != 1 {
return Some(Response::BadRequest(json!({ "error": "Not a group DM." }))); 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 leave group DM
/// or close DM conversation /// or close DM conversation
#[delete("/<target>")] #[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); let permissions = with_permissions!(user, target);
if !permissions.get_manage_channels() { if !permissions.get_manage_channels() {
@@ -490,7 +489,7 @@ pub struct MessageFetchOptions {
#[get("/<target>/messages?<options..>")] #[get("/<target>/messages?<options..>")]
pub fn messages( pub fn messages(
user: UserRef, user: UserRef,
target: ChannelRef, target: Channel,
options: Form<MessageFetchOptions>, options: Form<MessageFetchOptions>,
) -> Option<Response> { ) -> Option<Response> {
let permissions = with_permissions!(user, target); let permissions = with_permissions!(user, target);
@@ -554,7 +553,7 @@ pub struct SendMessage {
#[post("/<target>/messages", data = "<message>")] #[post("/<target>/messages", data = "<message>")]
pub fn send_message( pub fn send_message(
user: UserRef, user: UserRef,
target: ChannelRef, target: Channel,
message: Json<SendMessage>, message: Json<SendMessage>,
) -> Option<Response> { ) -> Option<Response> {
let permissions = with_permissions!(user, target); let permissions = with_permissions!(user, target);
@@ -609,7 +608,7 @@ pub fn send_message(
/// get a message /// get a message
#[get("/<target>/messages/<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); let permissions = with_permissions!(user, target);
if !permissions.get_read_messages() { if !permissions.get_read_messages() {
@@ -643,7 +642,7 @@ pub struct EditMessage {
#[patch("/<target>/messages/<message>", data = "<edit>")] #[patch("/<target>/messages/<message>", data = "<edit>")]
pub fn edit_message( pub fn edit_message(
user: UserRef, user: UserRef,
target: ChannelRef, target: Channel,
message: Message, message: Message,
edit: Json<EditMessage>, edit: Json<EditMessage>,
) -> Option<Response> { ) -> Option<Response> {
@@ -700,7 +699,7 @@ pub fn edit_message(
/// delete a message /// delete a message
#[delete("/<target>/messages/<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); let permissions = with_permissions!(user, target);
if !permissions.get_manage_messages() { if !permissions.get_manage_messages() {

View File

@@ -1,8 +1,7 @@
use super::channel::ChannelType; use super::channel::ChannelType;
use super::Response; 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::auth::UserRef;
use crate::guards::channel::ChannelRef;
use crate::guards::guild::{get_invite, get_member, GuildRef}; use crate::guards::guild::{get_invite, get_member, GuildRef};
use crate::notifications::{ use crate::notifications::{
self, self,
@@ -331,7 +330,7 @@ pub struct InviteOptions {
pub fn create_invite( pub fn create_invite(
user: UserRef, user: UserRef,
target: GuildRef, target: GuildRef,
channel: ChannelRef, channel: Channel,
_options: Json<InviteOptions>, _options: Json<InviteOptions>,
) -> Option<Response> { ) -> Option<Response> {
let (permissions, _) = with_permissions!(user, target); 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)] #[get("/join/<code>", rank = 1)]
pub fn fetch_invite(user: UserRef, code: String) -> Response { pub fn fetch_invite(user: UserRef, code: String) -> Response {
if let Some((guild_id, name, invite)) = get_invite(&code, user.id) { 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!({ Response::Success(json!({
"guild": { "guild": {
"id": guild_id, "id": guild_id,
@@ -441,9 +441,9 @@ pub fn fetch_invite(user: UserRef, code: String) -> Response {
"name": channel.name, "name": channel.name,
} }
})) }))
} else { /*} else {
Response::BadRequest(json!({ "error": "Failed to fetch channel." })) Response::BadRequest(json!({ "error": "Failed to fetch channel." }))
} }*/
} else { } else {
Response::NotFound(json!({ "error": "Failed to fetch invite or code is invalid." })) Response::NotFound(json!({ "error": "Failed to fetch invite or code is invalid." }))
} }