backend/api/v1/me/friends/
mod.rs

1use actix_web::{HttpRequest, HttpResponse, get, post, web};
2use serde::Deserialize;
3
4pub mod uuid;
5
6use crate::{
7    Data,
8    api::v1::auth::check_access_token,
9    error::Error,
10    objects::Me,
11    utils::{get_auth_header, global_checks, user_uuid_from_username}
12};
13
14/// Returns a list of users that are your friends
15#[get("/friends")]
16pub async fn get(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse, Error> {
17    let headers = req.headers();
18
19    let auth_header = get_auth_header(headers)?;
20
21    let mut conn = data.pool.get().await?;
22
23    let uuid = check_access_token(auth_header, &mut conn).await?;
24
25    global_checks(&data, uuid).await?;
26
27    let me = Me::get(&mut conn, uuid).await?;
28
29    let friends = me.get_friends(&data).await?;
30
31    Ok(HttpResponse::Ok().json(friends))
32}
33
34#[derive(Deserialize)]
35struct UserReq {
36    username: String,
37}
38
39/// `POST /api/v1/me/friends` Send friend request
40///
41/// requires auth? yes
42///
43/// ### Request Example:
44/// ```
45/// json!({
46///     "uuid": "155d2291-fb23-46bd-a656-ae7c5d8218e6",
47/// });
48/// ```
49/// NOTE: UUIDs in this response are made using `uuidgen`, UUIDs made by the actual backend will be UUIDv7 and have extractable timestamps
50///
51/// ### Responses
52/// 200 Success
53///
54/// 404 Not Found
55///
56/// 400 Bad Request (usually means users are already friends)
57///
58#[post("/friends")]
59pub async fn post(
60    req: HttpRequest,
61    json: web::Json<UserReq>,
62    data: web::Data<Data>,
63) -> Result<HttpResponse, Error> {
64    let headers = req.headers();
65
66    let auth_header = get_auth_header(headers)?;
67
68    let mut conn = data.pool.get().await?;
69
70    let uuid = check_access_token(auth_header, &mut conn).await?;
71
72    global_checks(&data, uuid).await?;
73
74    let me = Me::get(&mut conn, uuid).await?;
75
76    let target_uuid = user_uuid_from_username(&mut conn, &json.username).await?;
77    me.add_friend(&mut conn, target_uuid).await?;
78
79    Ok(HttpResponse::Ok().finish())
80}