mirror of
https://github.com/modrinth/code.git
synced 2026-08-31 03:55:59 +00:00
feat: invite management frontend
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user