From a5ec2704e65e982a6c4b649de29a63f2594aa4e4 Mon Sep 17 00:00:00 2001 From: Radical Date: Mon, 12 May 2025 00:08:21 +0200 Subject: [PATCH 1/2] style: get object from cache more cleanly --- src/api/v1/servers/uuid/channels/uuid/messages.rs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/api/v1/servers/uuid/channels/uuid/messages.rs b/src/api/v1/servers/uuid/channels/uuid/messages.rs index 70aa10b..eb999be 100644 --- a/src/api/v1/servers/uuid/channels/uuid/messages.rs +++ b/src/api/v1/servers/uuid/channels/uuid/messages.rs @@ -38,22 +38,20 @@ pub async fn res(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, message_reques let cache_result = data.get_cache_key(format!("{}", channel_uuid)).await; - let mut channel_raw: Option = None; + let channel: Channel; if let Ok(cache_hit) = cache_result { - channel_raw = Some(serde_json::from_str(&cache_hit).unwrap()) - } - - if channel_raw.is_none() { + channel = serde_json::from_str(&cache_hit).unwrap() + } else { let channel_result = Channel::fetch_one(&data.pool, guild_uuid, channel_uuid).await; if let Err(error) = channel_result { return Ok(error) } - channel_raw = Some(channel_result.unwrap()); + channel = channel_result.unwrap(); - let cache_result = data.set_cache_key(format!("{}", channel_uuid), channel_raw.clone().unwrap(), 60).await; + let cache_result = data.set_cache_key(format!("{}", channel_uuid), channel.clone(), 60).await; if let Err(error) = cache_result { error!("{}", error); @@ -61,8 +59,6 @@ pub async fn res(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, message_reques } } - let channel = channel_raw.unwrap(); - let messages = channel.fetch_messages(&data.pool, message_request.amount, message_request.offset).await; if let Err(error) = messages { From 8fdbf8cc488353e64efda9d3b46656eddcddc862 Mon Sep 17 00:00:00 2001 From: Radical Date: Mon, 12 May 2025 00:09:17 +0200 Subject: [PATCH 2/2] feat: add channel deletion --- src/api/v1/servers/uuid/channels/uuid/mod.rs | 62 +++++++++++++++++++- src/api/v1/servers/uuid/mod.rs | 3 +- src/structs.rs | 14 +++++ 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/api/v1/servers/uuid/channels/uuid/mod.rs b/src/api/v1/servers/uuid/channels/uuid/mod.rs index a223ad1..277052c 100644 --- a/src/api/v1/servers/uuid/channels/uuid/mod.rs +++ b/src/api/v1/servers/uuid/channels/uuid/mod.rs @@ -1,12 +1,12 @@ pub mod messages; -use actix_web::{get, web, Error, HttpRequest, HttpResponse}; +use actix_web::{delete, get, web, Error, HttpRequest, HttpResponse}; use crate::{api::v1::auth::check_access_token, structs::{Channel, Member}, utils::get_auth_header, Data}; use ::uuid::Uuid; use log::error; #[get("{uuid}/channels/{channel_uuid}")] -pub async fn res(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, data: web::Data) -> Result { +pub async fn get(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, data: web::Data) -> Result { let headers = req.headers(); let auth_header = get_auth_header(headers); @@ -54,3 +54,61 @@ pub async fn res(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, data: web::Dat Ok(HttpResponse::Ok().json(channel)) } + +#[delete("{uuid}/channels/{channel_uuid}")] +pub async fn delete(req: HttpRequest, path: web::Path<(Uuid, Uuid)>, data: web::Data) -> Result { + let headers = req.headers(); + + let auth_header = get_auth_header(headers); + + if let Err(error) = auth_header { + return Ok(error) + } + + let (guild_uuid, channel_uuid) = path.into_inner(); + + let authorized = check_access_token(auth_header.unwrap(), &data.pool).await; + + if let Err(error) = authorized { + return Ok(error) + } + + let uuid = authorized.unwrap(); + + let member = Member::fetch_one(&data.pool, uuid, guild_uuid).await; + + if let Err(error) = member { + return Ok(error); + } + + let cache_result = data.get_cache_key(format!("{}", channel_uuid)).await; + + let channel: Channel; + + if let Ok(cache_hit) = cache_result { + channel = serde_json::from_str(&cache_hit).unwrap(); + + let result = data.del_cache_key(format!("{}", channel_uuid)).await; + + if let Err(error) = result { + error!("{}", error) + } + } else { + let channel_result = Channel::fetch_one(&data.pool, guild_uuid, channel_uuid).await; + + if let Err(error) = channel_result { + return Ok(error) + } + + channel = channel_result.unwrap(); + } + + let delete_result = channel.delete(&data.pool).await; + + if let Err(error) = delete_result { + return Ok(error) + } + + Ok(HttpResponse::Ok().finish()) +} + diff --git a/src/api/v1/servers/uuid/mod.rs b/src/api/v1/servers/uuid/mod.rs index e9c14a8..0f567d0 100644 --- a/src/api/v1/servers/uuid/mod.rs +++ b/src/api/v1/servers/uuid/mod.rs @@ -14,7 +14,8 @@ pub fn web() -> Scope { // Channels .service(channels::response) .service(channels::response_post) - .service(channels::uuid::res) + .service(channels::uuid::get) + .service(channels::uuid::delete) .service(channels::uuid::messages::res) // Roles .service(roles::response) diff --git a/src/structs.rs b/src/structs.rs index 0f72aaf..ac34e9d 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -156,6 +156,20 @@ impl Channel { Ok(channel) } + pub async fn delete(self, pool: &Pool) -> Result<(), HttpResponse> { + let result = sqlx::query(&format!("DELETE FROM channels WHERE channel_uuid = '{}'", self.uuid)) + .execute(pool) + .await; + + if let Err(error) = result { + error!("{}", error); + + return Err(HttpResponse::InternalServerError().finish()) + } + + Ok(()) + } + pub async fn fetch_messages(&self, pool: &Pool, amount: i64, offset: i64) -> Result, HttpResponse> { let row = sqlx::query_as(&format!("SELECT uuid, user_uuid, message FROM channels WHERE channel_uuid = '{}' ORDER BY uuid LIMIT $1 OFFSET $2", self.uuid)) .bind(amount)