diff --git a/crates/core/database/src/models/server_members/model.rs b/crates/core/database/src/models/server_members/model.rs index 0ca09ed40..83372c86b 100644 --- a/crates/core/database/src/models/server_members/model.rs +++ b/crates/core/database/src/models/server_members/model.rs @@ -17,6 +17,10 @@ auto_derived_partial!( /// Time at which this user joined the server pub joined_at: Timestamp, + /// Invite used by member to join server + #[serde(skip_serializing_if = "Option::is_none")] + pub used_invite: Option, + /// Member's nickname #[serde(skip_serializing_if = "Option::is_none")] pub nickname: Option, @@ -69,6 +73,7 @@ impl Default for Member { avatar: None, roles: vec![], timeout: None, + used_invite: None, } } } @@ -81,6 +86,7 @@ impl Member { server: &Server, user: &User, channels: Option>, + used_invite: Option, ) -> Result> { if db.fetch_ban(&server.id, &user.id).await.is_ok() { return Err(create_error!(Banned)); @@ -95,6 +101,7 @@ impl Member { server: server.id.to_string(), user: user.id.to_string(), }, + used_invite, ..Default::default() }; diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index 747857cde..c5f8a4515 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -616,6 +616,7 @@ impl From for Member { avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + used_invite: value.used_invite, } } } @@ -629,6 +630,7 @@ impl From for crate::Member { avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + used_invite: value.used_invite, } } } @@ -642,6 +644,7 @@ impl From for PartialMember { avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + used_invite: value.used_invite, } } } @@ -655,6 +658,7 @@ impl From for crate::PartialMember { avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + used_invite: value.used_invite, } } } diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index 5b26b88a2..65cd8fc5e 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -41,6 +41,10 @@ auto_derived_partial!( /// Time at which this user joined the server pub joined_at: Timestamp, + /// Invite used by member to join server + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub used_invite: Option, + /// Member's nickname #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub nickname: Option, diff --git a/crates/delta/src/routes/bots/invite.rs b/crates/delta/src/routes/bots/invite.rs index 70e68bb69..9b389c5a2 100644 --- a/crates/delta/src/routes/bots/invite.rs +++ b/crates/delta/src/routes/bots/invite.rs @@ -42,7 +42,7 @@ pub async fn invite_bot( .await .throw_if_lacking_channel_permission(ChannelPermission::ManageServer)?; - Member::create(db, &server, &bot_user, None) + Member::create(db, &server, &bot_user, None, None) .await .map(|_| EmptyResponse) } diff --git a/crates/delta/src/routes/invites/invite_join.rs b/crates/delta/src/routes/invites/invite_join.rs index bfcb307b1..cd7e3b789 100644 --- a/crates/delta/src/routes/invites/invite_join.rs +++ b/crates/delta/src/routes/invites/invite_join.rs @@ -21,9 +21,9 @@ pub async fn join( let invite = target.as_invite(db).await?; match &invite { - Invite::Server { server, .. } => { + Invite::Server { server, code, .. } => { let server = db.fetch_server(server).await?; - let channels = Member::create(db, &server, &user, None).await?; + let channels = Member::create(db, &server, &user, None, Some(code.to_string())).await?; Ok(Json(InviteJoinResponse::Server { channels: channels.into_iter().map(|c| c.into()).collect(), server: server.into(), diff --git a/crates/delta/src/routes/servers/server_create.rs b/crates/delta/src/routes/servers/server_create.rs index 8e682c4c4..57e950b6b 100644 --- a/crates/delta/src/routes/servers/server_create.rs +++ b/crates/delta/src/routes/servers/server_create.rs @@ -30,7 +30,7 @@ pub async fn create_server( user.can_acquire_server(db).await?; let (server, channels) = Server::create(db, data, &user, true).await?; - let channels = Member::create(db, &server, &user, Some(channels)).await?; + let channels = Member::create(db, &server, &user, Some(channels), None).await?; Ok(Json(v0::CreateServerLegacyResponse { server: server.into(),