From 39d01bb0d04883b1d4789b2b64c8039b493e4441 Mon Sep 17 00:00:00 2001 From: Radical Date: Tue, 27 May 2025 07:46:10 +0000 Subject: [PATCH] feat: move me endpoint to /me and add /me/servers --- src/api/v1/me/friends/mod.rs | 0 src/api/v1/me/friends/pending.rs | 0 src/api/v1/{users/me.rs => me/mod.rs} | 16 +++++++++--- src/api/v1/me/servers.rs | 35 +++++++++++++++++++++++++++ src/api/v1/mod.rs | 2 ++ src/api/v1/users/mod.rs | 3 --- src/structs.rs | 13 +++++++++- 7 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/api/v1/me/friends/mod.rs create mode 100644 src/api/v1/me/friends/pending.rs rename src/api/v1/{users/me.rs => me/mod.rs} (88%) create mode 100644 src/api/v1/me/servers.rs diff --git a/src/api/v1/me/friends/mod.rs b/src/api/v1/me/friends/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/api/v1/me/friends/pending.rs b/src/api/v1/me/friends/pending.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/api/v1/users/me.rs b/src/api/v1/me/mod.rs similarity index 88% rename from src/api/v1/users/me.rs rename to src/api/v1/me/mod.rs index 83d02db..14067c3 100644 --- a/src/api/v1/users/me.rs +++ b/src/api/v1/me/mod.rs @@ -1,13 +1,21 @@ use actix_multipart::form::{MultipartForm, json::Json as MpJson, tempfile::TempFile}; -use actix_web::{HttpRequest, HttpResponse, get, patch, web}; +use actix_web::{get, patch, web, HttpRequest, HttpResponse, Scope}; use serde::Deserialize; use crate::{ Data, api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header, }; -#[get("/me")] -pub async fn res(req: HttpRequest, data: web::Data) -> Result { +mod servers; + +pub fn web() -> Scope { + web::scope("/me") + .service(get) + .service(update) +} + +#[get("")] +pub async fn get(req: HttpRequest, data: web::Data) -> Result { let headers = req.headers(); let auth_header = get_auth_header(headers)?; @@ -36,7 +44,7 @@ struct UploadForm { json: Option>, } -#[patch("/me")] +#[patch("")] pub async fn update( req: HttpRequest, MultipartForm(form): MultipartForm, diff --git a/src/api/v1/me/servers.rs b/src/api/v1/me/servers.rs new file mode 100644 index 0000000..73ab139 --- /dev/null +++ b/src/api/v1/me/servers.rs @@ -0,0 +1,35 @@ +//! Contains endpoint related to guild memberships + +use actix_web::{get, web, HttpRequest, HttpResponse}; + +use crate::{api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header, Data}; + + +/// `GET /api/v1/me/servers` Returns all guild memberships in a list +/// +/// Example Response: +/// ``` +/// json!({ +/// "uuid": "22006503-fb01-46e6-8e0e-70336dac6c63", +/// "nickname": "This field is nullable", +/// "user_uuid": "522bca17-de63-4706-9d18-0971867ad1e0", +/// "guild_uuid": "0911e468-3e9e-47bf-8381-59b30e8b68a8" +/// }); +/// ``` +/// NOTE: UUIDs in this response are made using `uuidgen`, UUIDs made by the actual backend will be UUIDv7 and have extractable timestamps +#[get("/servers")] +pub async fn get(req: HttpRequest, data: web::Data) -> Result { + 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?; + + let me = Me::get(&mut conn, uuid).await?; + + let memberships = me.fetch_memberships(&mut conn).await?; + + Ok(HttpResponse::Ok().json(memberships)) +} \ No newline at end of file diff --git a/src/api/v1/mod.rs b/src/api/v1/mod.rs index 749774d..f711fe5 100644 --- a/src/api/v1/mod.rs +++ b/src/api/v1/mod.rs @@ -5,6 +5,7 @@ mod invites; mod servers; mod stats; mod users; +mod me; pub fn web() -> Scope { web::scope("/v1") @@ -13,4 +14,5 @@ pub fn web() -> Scope { .service(users::web()) .service(servers::web()) .service(invites::web()) + .service(me::web()) } diff --git a/src/api/v1/users/mod.rs b/src/api/v1/users/mod.rs index a0b1ea6..a81491c 100644 --- a/src/api/v1/users/mod.rs +++ b/src/api/v1/users/mod.rs @@ -8,14 +8,11 @@ use crate::{ utils::get_auth_header, }; -mod me; mod uuid; pub fn web() -> Scope { web::scope("/users") .service(res) - .service(me::res) - .service(me::update) .service(uuid::res) } diff --git a/src/structs.rs b/src/structs.rs index b423b20..fc1d9ca 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -542,7 +542,7 @@ impl Role { } } -#[derive(Queryable, Selectable, Insertable)] +#[derive(Serialize, Queryable, Selectable, Insertable)] #[diesel(table_name = guild_members)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct Member { @@ -703,6 +703,17 @@ impl Me { Ok(me) } + pub async fn fetch_memberships(&self, conn: &mut Conn) -> Result, Error> { + use guild_members::dsl; + let memberships: Vec = dsl::guild_members + .filter(dsl::user_uuid.eq(self.uuid)) + .select(Member::as_select()) + .load(conn) + .await?; + + Ok(memberships) + } + pub async fn set_avatar( &mut self, bunny_cdn: &bunny_api_tokio::Client,