feat: add friends!

This commit is contained in:
Radical 2025-07-10 15:37:38 +02:00
parent ac3e7e242b
commit e8b8b49643
13 changed files with 439 additions and 39 deletions

View file

@ -1,9 +1,5 @@
use crate::{
Data,
api::v1::auth::check_access_token,
error::Error,
objects::Member,
utils::{get_auth_header, global_checks},
api::v1::auth::check_access_token, error::Error, objects::{Me, Member}, utils::{get_auth_header, global_checks}, Data
};
use ::uuid::Uuid;
use actix_web::{HttpRequest, HttpResponse, get, web};
@ -28,7 +24,9 @@ pub async fn get(
Member::check_membership(&mut conn, uuid, guild_uuid).await?;
let members = Member::fetch_all(&data, guild_uuid).await?;
let me = Me::get(&mut conn, uuid).await?;
let members = Member::fetch_all(&data, &me, guild_uuid).await?;
Ok(HttpResponse::Ok().json(members))
}

View file

@ -0,0 +1,76 @@
use actix_web::{HttpRequest, HttpResponse, get, post, web};
use serde::Deserialize;
use ::uuid::Uuid;
pub mod uuid;
use crate::{
Data,
api::v1::auth::check_access_token,
error::Error,
objects::Me,
utils::{get_auth_header, global_checks},
};
/// Returns a list of users that are your friends
#[get("/friends")]
pub async fn get(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse, Error> {
let headers = req.headers();
let auth_header = get_auth_header(headers)?;
let mut conn = data.pool.get().await?;
let uuid = check_access_token(auth_header, &mut conn).await?;
global_checks(&data, uuid).await?;
let me = Me::get(&mut conn, uuid).await?;
let friends = me.get_friends(&data).await?;
Ok(HttpResponse::Ok().json(friends))
}
#[derive(Deserialize)]
struct UserReq {
uuid: Uuid,
}
/// `POST /api/v1/me/friends` Send friend request
///
/// requires auth? yes
///
/// ### Request Example:
/// ```
/// json!({
/// "uuid": "155d2291-fb23-46bd-a656-ae7c5d8218e6",
/// });
/// ```
/// NOTE: UUIDs in this response are made using `uuidgen`, UUIDs made by the actual backend will be UUIDv7 and have extractable timestamps
///
/// ### Responses
/// 200 Success
///
/// 404 Not Found
///
/// 400 Bad Request (usually means users are already friends)
///
#[post("/friends")]
pub async fn post(req: HttpRequest, json: web::Json<UserReq>, data: web::Data<Data>) -> Result<HttpResponse, Error> {
let headers = req.headers();
let auth_header = get_auth_header(headers)?;
let mut conn = data.pool.get().await?;
let uuid = check_access_token(auth_header, &mut conn).await?;
global_checks(&data, uuid).await?;
let me = Me::get(&mut conn, uuid).await?;
me.add_friend(&mut conn, json.uuid).await?;
Ok(HttpResponse::Ok().finish())
}

View file

@ -0,0 +1,29 @@
use actix_web::{HttpRequest, HttpResponse, delete, web};
use uuid::Uuid;
use crate::{
Data,
api::v1::auth::check_access_token,
error::Error,
objects::Me,
utils::{get_auth_header, global_checks},
};
#[delete("/friends/{uuid}")]
pub async fn delete(req: HttpRequest, path: web::Path<(Uuid,)>, data: web::Data<Data>) -> Result<HttpResponse, Error> {
let headers = req.headers();
let auth_header = get_auth_header(headers)?;
let mut conn = data.pool.get().await?;
let uuid = check_access_token(auth_header, &mut conn).await?;
global_checks(&data, uuid).await?;
let me = Me::get(&mut conn, uuid).await?;
me.remove_friend(&mut conn, path.0).await?;
Ok(HttpResponse::Ok().finish())
}

View file

@ -11,12 +11,16 @@ use crate::{
};
mod guilds;
mod friends;
pub fn web() -> Scope {
web::scope("/me")
.service(get)
.service(update)
.service(guilds::get)
.service(friends::get)
.service(friends::post)
.service(friends::uuid::delete)
}
#[get("")]

View file

@ -4,11 +4,7 @@ use actix_web::{HttpRequest, HttpResponse, get, web};
use uuid::Uuid;
use crate::{
Data,
api::v1::auth::check_access_token,
error::Error,
objects::User,
utils::{get_auth_header, global_checks},
api::v1::auth::check_access_token, error::Error, objects::{Me, User}, utils::{get_auth_header, global_checks}, Data
};
/// `GET /api/v1/users/{uuid}` Returns user with the given UUID
@ -45,7 +41,9 @@ pub async fn get(
global_checks(&data, uuid).await?;
let user = User::fetch_one(&data, user_uuid).await?;
let me = Me::get(&mut conn, uuid).await?;
let user = User::fetch_one_with_friendship(&data, &me, user_uuid).await?;
Ok(HttpResponse::Ok().json(user))
}