Skip to content

Commit

Permalink
feat(routes): Add server members routes
Browse files Browse the repository at this point in the history
  • Loading branch information
abdulrahman1s committed Jun 8, 2022
1 parent 736c561 commit 9b74e22
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 11 deletions.
97 changes: 96 additions & 1 deletion src/routes/servers/channels.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,98 @@
use crate::guards::r#ref::Ref;
use crate::structures::*;
use crate::utils::error::*;
use crate::utils::permissions::Permissions;
use rocket::serde::{json::Json, Deserialize};
use validator::Validate;

#[derive(Deserialize, Validate)]
struct CreateChannelSchema<'a> {
r#type: ChannelTypes,
#[validate(length(min = 1, max = 32))]
name: &'a str,
}

#[get("/<server_id>/<channel_id>")]
async fn fetch_one(user: User, server_id: u64, channel_id: u64) -> Result<Json<Channel>> {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

let channel = Channel::find_one(|q| q.eq("id", channel_id).eq("server_id", server_id)).await;

match channel {
Some(channel) => Ok(Json(channel)),
None => Err(Error::UnknownChannel),
}
}

#[get("/<server_id>")]
async fn fetch_many(user: User, server_id: u64) -> Result<Json<Vec<Channel>>> {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

let channels = Channel::find(|q| q.eq("server_id", server_id)).await;

Ok(Json(channels))
}

#[post("/<server_id>", data = "<data>")]
async fn create(
user: User,
server_id: u64,
data: Json<CreateChannelSchema<'_>>,
) -> Result<Json<Channel>> {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

let p = Permissions::fetch(&user, server_id.into(), None).await?;

if !p.contains(Permissions::MANAGE_CHANNELS) {
return Err(Error::MissingPermissions);
}

match data.r#type {
ChannelTypes::Text => Ok(Json(Channel::new_text(data.name.into(), server_id))),
ChannelTypes::Category => Ok(Json(Channel::new_category(data.name.into(), server_id))),
ChannelTypes::Voice => Ok(Json(Channel::new_voice(data.name.into(), server_id))),
_ => Err(Error::MissingAccess),
}
}

#[delete("/<server_id>/<channel_id>")]
async fn delete(user: User, server_id: u64, channel_id: Ref) -> Result<()> {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

let p = Permissions::fetch(&user, server_id.into(), channel_id.0.into()).await?;

if !p.contains(Permissions::MANAGE_CHANNELS) {
return Err(Error::MissingPermissions);
}

channel_id.channel(None).await?.delete(channel_id.0).await;

Ok(())
}

#[patch("/<server_id>/<channel_id>")]
async fn update(user: User, server_id: u64, channel_id: Ref) -> Result<Json<Channel>> {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

let p = Permissions::fetch(&user, server_id.into(), channel_id.0.into()).await?;

if !p.contains(Permissions::MANAGE_CHANNELS) {
return Err(Error::MissingPermissions);
}

todo!("Update channels route")
}

pub fn routes() -> Vec<rocket::Route> {
routes![]
routes![fetch_one, fetch_many, create, update, delete]
}
14 changes: 4 additions & 10 deletions src/routes/servers/members.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,9 @@ use crate::utils::permissions::Permissions;
use rocket::serde::{json::Json, Deserialize};
use validator::Validate;

async fn is_in_server(user: &User, server_id: u64) -> bool {
Member::find_one(|q| q.eq("id", user.id).eq("server_id", server_id))
.await
.is_some()
}

#[get("/<server_id>/<member_id>")]
async fn fetch_one(user: User, server_id: u64, member_id: Ref) -> Result<Json<Member>> {
if !is_in_server(&user, server_id).await {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

Expand All @@ -24,7 +18,7 @@ async fn fetch_one(user: User, server_id: u64, member_id: Ref) -> Result<Json<Me

#[get("/<server_id>?<limit>")]
async fn fetch_many(user: User, server_id: u64, limit: Option<u32>) -> Result<Json<Vec<Member>>> {
if !is_in_server(&user, server_id).await {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

Expand All @@ -42,7 +36,7 @@ async fn fetch_many(user: User, server_id: u64, limit: Option<u32>) -> Result<Js

#[delete("/<server_id>/<member_id>")]
async fn kick(user: User, server_id: u64, member_id: Ref) -> Result<()> {
if !is_in_server(&user, server_id).await {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

Expand Down Expand Up @@ -77,7 +71,7 @@ async fn update(
data.validate()
.map_err(|error| Error::InvalidBody { error })?;

if !is_in_server(&user, server_id).await {
if !user.is_in_server(server_id).await {
return Err(Error::UnknownServer);
}

Expand Down

0 comments on commit 9b74e22

Please sign in to comment.