Files
stoatchat/crates/delta/src/routes/invites/invite_join.rs
2025-11-18 14:57:34 +00:00

59 lines
1.8 KiB
Rust

use revolt_database::{util::reference::Reference, Channel, Database, Invite, Member, User, AMQP};
use revolt_models::v0::{self, InviteJoinResponse};
use revolt_result::{create_error, Result};
use rocket::{serde::json::Json, State};
/// Join Invite
///
/// Join an invite by its ID
#[utoipa::path(
tag = "Invites",
security(("Session-Token" = [])),
params(
("target" = Reference, Path),
),
responses(
(status = 200, body = v0::InviteJoinResponse),
),
)]
#[post("/<target>")]
pub async fn join(
db: &State<Database>,
amqp: &State<AMQP>,
user: User,
target: Reference<'_>,
) -> Result<Json<v0::InviteJoinResponse>> {
if user.bot.is_some() {
return Err(create_error!(IsBot));
}
user.can_acquire_server(db).await?;
let invite = target.as_invite(db).await?;
match &invite {
Invite::Server { server, .. } => {
let server = db.fetch_server(server).await?;
let (_, channels) = Member::create(db, &server, &user, None).await?;
Ok(Json(InviteJoinResponse::Server {
channels: channels.into_iter().map(|c| c.into()).collect(),
server: server.into(),
}))
}
Invite::Group {
channel, creator, ..
} => {
let mut channel = db.fetch_channel(channel).await?;
channel.add_user_to_group(db, amqp, &user, creator).await?;
if let Channel::Group { recipients, .. } = &channel {
Ok(Json(InviteJoinResponse::Group {
users: User::fetch_many_ids_as_mutuals(db, &user, recipients).await?,
channel: channel.into(),
}))
} else {
unreachable!()
}
}
}
}