style: cargo fmt
All checks were successful
ci/woodpecker/push/build-and-publish Pipeline was successful
ci/woodpecker/push/publish-docs Pipeline was successful

This commit is contained in:
Radical 2025-07-10 15:37:45 +02:00
parent e8b8b49643
commit e8a9857e19
13 changed files with 87 additions and 41 deletions

View file

@ -38,7 +38,9 @@ pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
refresh_token_cookie.make_removal(); refresh_token_cookie.make_removal();
if deleted == 0 { if deleted == 0 {
return Ok(HttpResponse::NotFound().cookie(refresh_token_cookie).finish()) return Ok(HttpResponse::NotFound()
.cookie(refresh_token_cookie)
.finish());
} }
Ok(HttpResponse::Ok().cookie(refresh_token_cookie).finish()) Ok(HttpResponse::Ok().cookie(refresh_token_cookie).finish())

View file

@ -83,7 +83,9 @@ pub async fn ws(
let message_body: MessageBody = serde_json::from_str(&text)?; let message_body: MessageBody = serde_json::from_str(&text)?;
let message = channel.new_message(&data, uuid, message_body.message, message_body.reply_to).await?; let message = channel
.new_message(&data, uuid, message_body.message, message_body.reply_to)
.await?;
redis::cmd("PUBLISH") redis::cmd("PUBLISH")
.arg(&[channel_uuid.to_string(), serde_json::to_string(&message)?]) .arg(&[channel_uuid.to_string(), serde_json::to_string(&message)?])

View file

@ -1,5 +1,9 @@
use crate::{ use crate::{
api::v1::auth::check_access_token, error::Error, objects::{Me, Member}, utils::{get_auth_header, global_checks}, Data Data,
api::v1::auth::check_access_token,
error::Error,
objects::{Me, Member},
utils::{get_auth_header, global_checks},
}; };
use ::uuid::Uuid; use ::uuid::Uuid;
use actix_web::{HttpRequest, HttpResponse, get, web}; use actix_web::{HttpRequest, HttpResponse, get, web};

View file

@ -1,6 +1,6 @@
use ::uuid::Uuid;
use actix_web::{HttpRequest, HttpResponse, get, post, web}; use actix_web::{HttpRequest, HttpResponse, get, post, web};
use serde::Deserialize; use serde::Deserialize;
use ::uuid::Uuid;
pub mod uuid; pub mod uuid;
@ -57,7 +57,11 @@ struct UserReq {
/// 400 Bad Request (usually means users are already friends) /// 400 Bad Request (usually means users are already friends)
/// ///
#[post("/friends")] #[post("/friends")]
pub async fn post(req: HttpRequest, json: web::Json<UserReq>, data: web::Data<Data>) -> Result<HttpResponse, Error> { pub async fn post(
req: HttpRequest,
json: web::Json<UserReq>,
data: web::Data<Data>,
) -> Result<HttpResponse, Error> {
let headers = req.headers(); let headers = req.headers();
let auth_header = get_auth_header(headers)?; let auth_header = get_auth_header(headers)?;

View file

@ -10,7 +10,11 @@ use crate::{
}; };
#[delete("/friends/{uuid}")] #[delete("/friends/{uuid}")]
pub async fn delete(req: HttpRequest, path: web::Path<(Uuid,)>, data: web::Data<Data>) -> Result<HttpResponse, Error> { pub async fn delete(
req: HttpRequest,
path: web::Path<(Uuid,)>,
data: web::Data<Data>,
) -> Result<HttpResponse, Error> {
let headers = req.headers(); let headers = req.headers();
let auth_header = get_auth_header(headers)?; let auth_header = get_auth_header(headers)?;

View file

@ -10,8 +10,8 @@ use crate::{
utils::{get_auth_header, global_checks}, utils::{get_auth_header, global_checks},
}; };
mod guilds;
mod friends; mod friends;
mod guilds;
pub fn web() -> Scope { pub fn web() -> Scope {
web::scope("/me") web::scope("/me")

View file

@ -4,7 +4,11 @@ use actix_web::{HttpRequest, HttpResponse, get, web};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
api::v1::auth::check_access_token, error::Error, objects::{Me, User}, utils::{get_auth_header, global_checks}, Data Data,
api::v1::auth::check_access_token,
error::Error,
objects::{Me, User},
utils::{get_auth_header, global_checks},
}; };
/// `GET /api/v1/users/{uuid}` Returns user with the given UUID /// `GET /api/v1/users/{uuid}` Returns user with the given UUID

View file

@ -9,7 +9,7 @@ use crate::schema::{friend_requests, friends};
#[diesel(table_name = friends)] #[diesel(table_name = friends)]
#[diesel(check_for_backend(diesel::pg::Pg))] #[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Friend { pub struct Friend {
pub uuid1: Uuid, pub uuid1: Uuid,
pub uuid2: Uuid, pub uuid2: Uuid,
pub accepted_at: DateTime<Utc>, pub accepted_at: DateTime<Utc>,
} }

View file

@ -1,5 +1,8 @@
use actix_web::web::BytesMut; use actix_web::web::BytesMut;
use diesel::{delete, insert_into, update, ExpressionMethods, QueryDsl, Queryable, Selectable, SelectableHelper}; use diesel::{
ExpressionMethods, QueryDsl, Queryable, Selectable, SelectableHelper, delete, insert_into,
update,
};
use diesel_async::RunQueryDsl; use diesel_async::RunQueryDsl;
use serde::Serialize; use serde::Serialize;
use tokio::task; use tokio::task;
@ -7,7 +10,11 @@ use url::Url;
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
error::Error, objects::{FriendRequest, Friend, User}, schema::{friend_requests, friends, guild_members, guilds, users}, utils::{image_check, EMAIL_REGEX, USERNAME_REGEX}, Conn, Data Conn, Data,
error::Error,
objects::{Friend, FriendRequest, User},
schema::{friend_requests, friends, guild_members, guilds, users},
utils::{EMAIL_REGEX, USERNAME_REGEX, image_check},
}; };
use super::{Guild, guild::GuildBuilder, load_or_empty, member::MemberBuilder}; use super::{Guild, guild::GuildBuilder, load_or_empty, member::MemberBuilder};
@ -121,7 +128,10 @@ impl Me {
} }
pub async fn set_username(&mut self, data: &Data, new_username: String) -> Result<(), Error> { pub async fn set_username(&mut self, data: &Data, new_username: String) -> Result<(), Error> {
if !USERNAME_REGEX.is_match(&new_username) || new_username.len() < 3 || new_username.len() > 32 { if !USERNAME_REGEX.is_match(&new_username)
|| new_username.len() < 3
|| new_username.len() > 32
{
return Err(Error::BadRequest("Invalid username".to_string())); return Err(Error::BadRequest("Invalid username".to_string()));
} }
@ -232,7 +242,11 @@ impl Me {
Ok(()) Ok(())
} }
pub async fn friends_with(&self, conn: &mut Conn, user_uuid: Uuid) -> Result<Option<Friend>, Error> { pub async fn friends_with(
&self,
conn: &mut Conn,
user_uuid: Uuid,
) -> Result<Option<Friend>, Error> {
use friends::dsl; use friends::dsl;
let friends: Vec<Friend> = if self.uuid < user_uuid { let friends: Vec<Friend> = if self.uuid < user_uuid {
@ -241,7 +255,7 @@ impl Me {
.filter(dsl::uuid1.eq(self.uuid)) .filter(dsl::uuid1.eq(self.uuid))
.filter(dsl::uuid2.eq(user_uuid)) .filter(dsl::uuid2.eq(user_uuid))
.load(conn) .load(conn)
.await .await,
)? )?
} else { } else {
load_or_empty( load_or_empty(
@ -249,12 +263,12 @@ impl Me {
.filter(dsl::uuid1.eq(user_uuid)) .filter(dsl::uuid1.eq(user_uuid))
.filter(dsl::uuid2.eq(self.uuid)) .filter(dsl::uuid2.eq(self.uuid))
.load(conn) .load(conn)
.await .await,
)? )?
}; };
if friends.is_empty() { if friends.is_empty() {
return Ok(None) return Ok(None);
} }
Ok(Some(friends[0].clone())) Ok(Some(friends[0].clone()))
@ -263,7 +277,7 @@ impl Me {
pub async fn add_friend(&self, conn: &mut Conn, user_uuid: Uuid) -> Result<(), Error> { pub async fn add_friend(&self, conn: &mut Conn, user_uuid: Uuid) -> Result<(), Error> {
if self.friends_with(conn, user_uuid).await?.is_some() { if self.friends_with(conn, user_uuid).await?.is_some() {
// TODO: Check if another error should be used // TODO: Check if another error should be used
return Err(Error::BadRequest("Already friends with user".to_string())) return Err(Error::BadRequest("Already friends with user".to_string()));
} }
use friend_requests::dsl; use friend_requests::dsl;
@ -273,7 +287,7 @@ impl Me {
.filter(dsl::sender.eq(user_uuid)) .filter(dsl::sender.eq(user_uuid))
.filter(dsl::receiver.eq(self.uuid)) .filter(dsl::receiver.eq(self.uuid))
.load(conn) .load(conn)
.await .await,
)?; )?;
#[allow(clippy::get_first)] #[allow(clippy::get_first)]
@ -316,7 +330,7 @@ impl Me {
pub async fn remove_friend(&self, conn: &mut Conn, user_uuid: Uuid) -> Result<(), Error> { pub async fn remove_friend(&self, conn: &mut Conn, user_uuid: Uuid) -> Result<(), Error> {
if self.friends_with(conn, user_uuid).await?.is_none() { if self.friends_with(conn, user_uuid).await?.is_none() {
// TODO: Check if another error should be used // TODO: Check if another error should be used
return Err(Error::BadRequest("Not friends with user".to_string())) return Err(Error::BadRequest("Not friends with user".to_string()));
} }
use friends::dsl; use friends::dsl;
@ -348,7 +362,7 @@ impl Me {
.filter(dsl::uuid1.eq(self.uuid)) .filter(dsl::uuid1.eq(self.uuid))
.select(Friend::as_select()) .select(Friend::as_select())
.load(&mut conn) .load(&mut conn)
.await .await,
)?; )?;
let friends2 = load_or_empty( let friends2 = load_or_empty(
@ -356,7 +370,7 @@ impl Me {
.filter(dsl::uuid2.eq(self.uuid)) .filter(dsl::uuid2.eq(self.uuid))
.select(Friend::as_select()) .select(Friend::as_select())
.load(&mut conn) .load(&mut conn)
.await .await,
)?; )?;
let friend_futures = friends1.iter().map(async move |friend| { let friend_futures = friends1.iter().map(async move |friend| {

View file

@ -6,7 +6,10 @@ use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
error::Error, objects::{Me, Permissions, Role}, schema::guild_members, Conn, Data Conn, Data,
error::Error,
objects::{Me, Permissions, Role},
schema::guild_members,
}; };
use super::{User, load_or_empty}; use super::{User, load_or_empty};
@ -97,7 +100,12 @@ impl Member {
Ok(member_builder) Ok(member_builder)
} }
pub async fn fetch_one(data: &Data, me: &Me, user_uuid: Uuid, guild_uuid: Uuid) -> Result<Self, Error> { pub async fn fetch_one(
data: &Data,
me: &Me,
user_uuid: Uuid,
guild_uuid: Uuid,
) -> Result<Self, Error> {
let mut conn = data.pool.get().await?; let mut conn = data.pool.get().await?;
use guild_members::dsl; use guild_members::dsl;

View file

@ -9,6 +9,7 @@ use uuid::Uuid;
mod channel; mod channel;
mod email_token; mod email_token;
mod friends;
mod guild; mod guild;
mod invite; mod invite;
mod me; mod me;
@ -17,10 +18,11 @@ mod message;
mod password_reset_token; mod password_reset_token;
mod role; mod role;
mod user; mod user;
mod friends;
pub use channel::Channel; pub use channel::Channel;
pub use email_token::EmailToken; pub use email_token::EmailToken;
pub use friends::Friend;
pub use friends::FriendRequest;
pub use guild::Guild; pub use guild::Guild;
pub use invite::Invite; pub use invite::Invite;
pub use me::Me; pub use me::Me;
@ -30,8 +32,6 @@ pub use password_reset_token::PasswordResetToken;
pub use role::Permissions; pub use role::Permissions;
pub use role::Role; pub use role::Role;
pub use user::User; pub use user::User;
pub use friends::Friend;
pub use friends::FriendRequest;
use crate::error::Error; use crate::error::Error;

View file

@ -4,7 +4,7 @@ use diesel_async::RunQueryDsl;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{error::Error, objects::Me, schema::users, Conn, Data}; use crate::{Conn, Data, error::Error, objects::Me, schema::users};
use super::load_or_empty; use super::load_or_empty;
@ -68,7 +68,11 @@ impl User {
Ok(user) Ok(user)
} }
pub async fn fetch_one_with_friendship(data: &Data, me: &Me, user_uuid: Uuid) -> Result<Self, Error> { pub async fn fetch_one_with_friendship(
data: &Data,
me: &Me,
user_uuid: Uuid,
) -> Result<Self, Error> {
let mut conn = data.pool.get().await?; let mut conn = data.pool.get().await?;
let mut user = Self::fetch_one(data, user_uuid).await?; let mut user = Self::fetch_one(data, user_uuid).await?;