From 3669df3f8ab0aec5f54f49dd9b0bd3ebd292f814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Fri, 16 Jan 2026 16:09:04 +0400 Subject: [PATCH] Handle membership deletions and role updates in iam policies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- .../settings/_components/MemberListItem.tsx | 21 +++++-------- pkg/coredata/membership.go | 19 +++++++++--- pkg/iam/authorizer.go | 15 ++++++---- pkg/iam/iam_actions.go | 3 ++ pkg/iam/iam_policies.go | 30 ++++++++++++++++--- pkg/server/api/connect/v1/v1_resolver.go | 6 ++++ 6 files changed, 66 insertions(+), 28 deletions(-) diff --git a/apps/console/src/pages/iam/organizations/settings/_components/MemberListItem.tsx b/apps/console/src/pages/iam/organizations/settings/_components/MemberListItem.tsx index f6494e09d..1dc2b4568 100644 --- a/apps/console/src/pages/iam/organizations/settings/_components/MemberListItem.tsx +++ b/apps/console/src/pages/iam/organizations/settings/_components/MemberListItem.tsx @@ -10,7 +10,7 @@ import { useConfirm, } from "@probo/ui"; import clsx from "clsx"; -import { use, useState } from "react"; +import { useState } from "react"; import { useFragment } from "react-relay"; import { graphql } from "relay-runtime"; import type { MemberListItemFragment$key } from "/__generated__/iam/MemberListItemFragment.graphql"; @@ -18,7 +18,6 @@ import { useMutationWithToasts } from "/hooks/useMutationWithToasts"; import { useOrganizationId } from "/hooks/useOrganizationId"; import { sprintf } from "@probo/helpers"; import { EditMemberDialog } from "./EditMemberDialog"; -import { CurrentUser } from "/providers/CurrentUser"; const fragment = graphql` fragment MemberListItemFragment on Membership { @@ -62,19 +61,15 @@ export function MemberListItem(props: { const [dialogOpen, setDialogOpen] = useState(false); const membership = useFragment(fragment, fKey); - const { role } = use(CurrentUser); const isInactive = membership.state === "INACTIVE"; - // Only OWNER can edit OWNER members - const canEditThisRole = membership.role === "OWNER" ? role === "OWNER" : true; - const [removeMembership, isRemoving] = useMutationWithToasts( removeMemberMutation, { successMessage: __("Member removed successfully"), errorMessage: __("Failed to remove member"), - } + }, ); const handleRemove = async () => { @@ -93,9 +88,9 @@ export function MemberListItem(props: { { message: sprintf( __("Are you sure you want to remove %s?"), - membership.profile.fullName + membership.profile.fullName, ), - } + }, ); }; @@ -104,7 +99,7 @@ export function MemberListItem(props: { @@ -129,7 +124,7 @@ export function MemberListItem(props: { className="flex gap-2 justify-end" onClick={(e) => e.stopPropagation()} > - {membership.canUpdate && canEditThisRole && ( + {membership.canUpdate && (