forked from gorb/backend
feat: move me endpoint to /me and add /me/servers
This commit is contained in:
parent
b8cf21903e
commit
39d01bb0d0
7 changed files with 61 additions and 8 deletions
0
src/api/v1/me/friends/mod.rs
Normal file
0
src/api/v1/me/friends/mod.rs
Normal file
0
src/api/v1/me/friends/pending.rs
Normal file
0
src/api/v1/me/friends/pending.rs
Normal file
|
@ -1,13 +1,21 @@
|
||||||
use actix_multipart::form::{MultipartForm, json::Json as MpJson, tempfile::TempFile};
|
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 serde::Deserialize;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Data, api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header,
|
Data, api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[get("/me")]
|
mod servers;
|
||||||
pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse, Error> {
|
|
||||||
|
pub fn web() -> Scope {
|
||||||
|
web::scope("/me")
|
||||||
|
.service(get)
|
||||||
|
.service(update)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("")]
|
||||||
|
pub async fn get(req: HttpRequest, 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)?;
|
||||||
|
@ -36,7 +44,7 @@ struct UploadForm {
|
||||||
json: Option<MpJson<NewInfo>>,
|
json: Option<MpJson<NewInfo>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[patch("/me")]
|
#[patch("")]
|
||||||
pub async fn update(
|
pub async fn update(
|
||||||
req: HttpRequest,
|
req: HttpRequest,
|
||||||
MultipartForm(form): MultipartForm<UploadForm>,
|
MultipartForm(form): MultipartForm<UploadForm>,
|
35
src/api/v1/me/servers.rs
Normal file
35
src/api/v1/me/servers.rs
Normal file
|
@ -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<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?;
|
||||||
|
|
||||||
|
let me = Me::get(&mut conn, uuid).await?;
|
||||||
|
|
||||||
|
let memberships = me.fetch_memberships(&mut conn).await?;
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok().json(memberships))
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ mod invites;
|
||||||
mod servers;
|
mod servers;
|
||||||
mod stats;
|
mod stats;
|
||||||
mod users;
|
mod users;
|
||||||
|
mod me;
|
||||||
|
|
||||||
pub fn web() -> Scope {
|
pub fn web() -> Scope {
|
||||||
web::scope("/v1")
|
web::scope("/v1")
|
||||||
|
@ -13,4 +14,5 @@ pub fn web() -> Scope {
|
||||||
.service(users::web())
|
.service(users::web())
|
||||||
.service(servers::web())
|
.service(servers::web())
|
||||||
.service(invites::web())
|
.service(invites::web())
|
||||||
|
.service(me::web())
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,11 @@ use crate::{
|
||||||
utils::get_auth_header,
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod me;
|
|
||||||
mod uuid;
|
mod uuid;
|
||||||
|
|
||||||
pub fn web() -> Scope {
|
pub fn web() -> Scope {
|
||||||
web::scope("/users")
|
web::scope("/users")
|
||||||
.service(res)
|
.service(res)
|
||||||
.service(me::res)
|
|
||||||
.service(me::update)
|
|
||||||
.service(uuid::res)
|
.service(uuid::res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,7 @@ impl Role {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Queryable, Selectable, Insertable)]
|
#[derive(Serialize, Queryable, Selectable, Insertable)]
|
||||||
#[diesel(table_name = guild_members)]
|
#[diesel(table_name = guild_members)]
|
||||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||||
pub struct Member {
|
pub struct Member {
|
||||||
|
@ -703,6 +703,17 @@ impl Me {
|
||||||
Ok(me)
|
Ok(me)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn fetch_memberships(&self, conn: &mut Conn) -> Result<Vec<Member>, Error> {
|
||||||
|
use guild_members::dsl;
|
||||||
|
let memberships: Vec<Member> = dsl::guild_members
|
||||||
|
.filter(dsl::user_uuid.eq(self.uuid))
|
||||||
|
.select(Member::as_select())
|
||||||
|
.load(conn)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(memberships)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn set_avatar(
|
pub async fn set_avatar(
|
||||||
&mut self,
|
&mut self,
|
||||||
bunny_cdn: &bunny_api_tokio::Client,
|
bunny_cdn: &bunny_api_tokio::Client,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue