feat: connect workspace access lifecycle to admin api

This commit is contained in:
a.tolmachev
2026-03-31 09:12:42 +03:00
parent 3065b3100b
commit cb23f1eb96
12 changed files with 551 additions and 31 deletions
+66 -2
View File
@@ -1,5 +1,5 @@
use axum::{
Json,
Extension, Json,
extract::{Path, State},
http::StatusCode,
};
@@ -7,8 +7,9 @@ use serde::Deserialize;
use serde_json::{Value, json};
use crate::{
auth::AuthenticatedSession,
error::ApiError,
service::{InvitationPayload, PlatformApiKeyPayload},
service::{InvitationPayload, PlatformApiKeyPayload, UpdateMembershipPayload},
state::AppState,
};
@@ -23,6 +24,12 @@ pub struct WorkspaceInvitationPath {
pub invitation_id: String,
}
#[derive(Deserialize)]
pub struct WorkspaceMembershipPath {
pub workspace_id: String,
pub user_id: String,
}
#[derive(Deserialize)]
pub struct WorkspacePlatformApiKeyPath {
pub workspace_id: String,
@@ -40,6 +47,40 @@ pub async fn list_memberships(
Ok(Json(json!({ "items": items })))
}
pub async fn update_membership(
Path(path): Path<WorkspaceMembershipPath>,
State(state): State<AppState>,
Extension(session): Extension<AuthenticatedSession>,
Json(payload): Json<UpdateMembershipPayload>,
) -> Result<Json<Value>, ApiError> {
let items = state
.service
.update_membership_role(
&path.workspace_id.as_str().into(),
&session.user.id,
&path.user_id.as_str().into(),
payload,
)
.await?;
Ok(Json(json!({ "items": items })))
}
pub async fn delete_membership(
Path(path): Path<WorkspaceMembershipPath>,
State(state): State<AppState>,
Extension(session): Extension<AuthenticatedSession>,
) -> Result<StatusCode, ApiError> {
state
.service
.remove_membership(
&path.workspace_id.as_str().into(),
&session.user.id,
&path.user_id.as_str().into(),
)
.await?;
Ok(StatusCode::NO_CONTENT)
}
pub async fn list_invitations(
Path(path): Path<WorkspacePath>,
State(state): State<AppState>,
@@ -127,3 +168,26 @@ pub async fn delete_platform_api_key(
.await?;
Ok(StatusCode::NO_CONTENT)
}
pub async fn export_workspace(
Path(path): Path<WorkspacePath>,
State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
let exported = state
.service
.export_workspace(&path.workspace_id.as_str().into())
.await?;
Ok(Json(json!(exported)))
}
pub async fn delete_workspace(
Path(path): Path<WorkspacePath>,
State(state): State<AppState>,
Extension(session): Extension<AuthenticatedSession>,
) -> Result<StatusCode, ApiError> {
state
.service
.delete_workspace(&path.workspace_id.as_str().into(), &session.user.id)
.await?;
Ok(StatusCode::NO_CONTENT)
}