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("/")] pub async fn join( db: &State, amqp: &State, user: User, target: Reference<'_>, ) -> Result> { 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!() } } } }