feat: invite management frontend

This commit is contained in:
Calum H. (IMB11)
2026-07-27 13:11:38 +01:00
parent e9aedd58d4
commit a04555dc91
13 changed files with 427 additions and 18 deletions
+9 -6
View File
@@ -42,8 +42,9 @@ pub(crate) use self::shared::{
};
pub use self::shared::{
SharedInstanceExternalFilePreview, SharedInstanceInstallPreview,
SharedInstanceInviteInstallPreview, SharedInstanceInviteLink,
SharedInstanceJoinType, SharedInstancePublishPreview,
SharedInstanceInvite, SharedInstanceInviteInstallPreview,
SharedInstanceInviteLink, SharedInstanceJoinType,
SharedInstancePublishPreview,
SharedInstanceUpdateDiff, SharedInstanceUpdateDiffType,
SharedInstanceUpdatePreview, SharedInstanceUser, SharedInstanceUsers,
accept_pending_shared_instance_invite,
@@ -51,8 +52,10 @@ pub use self::shared::{
can_active_user_use_shared_instances, create_shared_instance_invite_link,
decline_pending_shared_instance_invite,
get_shared_instance_install_preview, get_shared_instance_publish_preview,
get_shared_instance_update_preview, get_shared_instance_users,
install_shared_instance, invite_shared_instance_users,
publish_shared_instance, remove_shared_instance_users,
unlink_shared_instance, unpublish_shared_instance, update_shared_instance,
get_shared_instance_invites, get_shared_instance_update_preview,
get_shared_instance_users, install_shared_instance,
invite_shared_instance_users, publish_shared_instance,
remove_shared_instance_users, revoke_shared_instance_invite,
unlink_shared_instance, unpublish_shared_instance,
update_shared_instance,
};
@@ -73,6 +73,14 @@ pub(super) struct CreateInstanceInviteResponse {
pub(super) id: String,
}
#[derive(Clone, Debug, Deserialize)]
pub(super) struct InstanceInviteResponse {
pub(super) id: String,
pub(super) expiration: DateTime<Utc>,
pub(super) max_uses: i32,
pub(super) uses: i32,
}
#[derive(Clone, Debug, Deserialize)]
pub(super) struct BlacklistStatusResponse {
pub(super) blacklisted: bool,
@@ -502,6 +510,20 @@ pub(super) async fn delete_remote_invite(
.await
}
pub(super) async fn get_remote_invites(
shared_instance_id: &str,
state: &State,
) -> crate::Result<Vec<InstanceInviteResponse>> {
request_json(
"get_instance_invites",
Method::GET,
&format!("/instances/{shared_instance_id}/invites"),
None,
state,
)
.await
}
pub(super) async fn get_shared_instance_invite_info(
invite_id: &str,
state: &State,
@@ -124,6 +124,44 @@ pub async fn create_shared_instance_invite_link(
})
}
#[tracing::instrument]
pub async fn get_shared_instance_invites(
instance_id: &str,
) -> crate::Result<Vec<SharedInstanceInvite>> {
let state = State::get().await?;
let Some(attachment) = shared_attachment(instance_id, &state).await? else {
return Ok(Vec::new());
};
ensure_owner(&attachment)?;
Ok(get_remote_invites(&attachment.id, &state)
.await?
.into_iter()
.map(|invite| SharedInstanceInvite {
id: invite.id,
expiration: invite.expiration,
max_uses: invite.max_uses,
uses: invite.uses,
})
.collect())
}
#[tracing::instrument(skip(invite_id))]
pub async fn revoke_shared_instance_invite(
instance_id: &str,
invite_id: String,
) -> crate::Result<()> {
let state = State::get().await?;
let _shared_instance_lock = state.lock_shared_instance(instance_id).await;
let Some(attachment) = shared_attachment(instance_id, &state).await? else {
return Ok(());
};
ensure_owner(&attachment)?;
delete_remote_invite(&attachment.id, &invite_id, &state).await?;
emit_instance(instance_id, InstancePayloadType::Edited).await
}
#[tracing::instrument]
pub async fn remove_shared_instance_users(
instance_id: &str,
@@ -110,8 +110,9 @@ pub use self::install::{
};
pub use self::invites::{
accept_pending_shared_instance_invite, create_shared_instance_invite_link,
decline_pending_shared_instance_invite, get_shared_instance_users,
invite_shared_instance_users, remove_shared_instance_users,
decline_pending_shared_instance_invite, get_shared_instance_invites,
get_shared_instance_users, invite_shared_instance_users,
remove_shared_instance_users, revoke_shared_instance_invite,
};
pub use self::publish::{
get_shared_instance_publish_preview, publish_shared_instance,
@@ -119,8 +120,9 @@ pub use self::publish::{
};
pub use self::types::{
SharedInstanceExternalFilePreview, SharedInstanceInstallPreview,
SharedInstanceInviteInstallPreview, SharedInstanceInviteLink,
SharedInstanceJoinType, SharedInstancePublishPreview,
SharedInstanceInvite, SharedInstanceInviteInstallPreview,
SharedInstanceInviteLink, SharedInstanceJoinType,
SharedInstancePublishPreview,
SharedInstanceUpdateDiff, SharedInstanceUpdateDiffType,
SharedInstanceUpdatePreview, SharedInstanceUser, SharedInstanceUsers,
};
@@ -116,6 +116,15 @@ pub struct SharedInstanceInviteLink {
pub max_uses: i32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SharedInstanceInvite {
pub id: String,
pub expiration: DateTime<Utc>,
pub max_uses: i32,
pub uses: i32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SharedInstanceInviteInstallPreview {