Merge pull request #5167 from kuangp/fix/org-plugin

Correctly respect namespace when routing and filtering group members
This commit is contained in:
Fredrik Adelöw
2021-03-29 22:13:29 +02:00
committed by GitHub
5 changed files with 53 additions and 19 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Correctly route to namespaced group members
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Correctly include group members via matching namespace relation
+1
View File
@@ -164,6 +164,7 @@ monorepo
monorepos
msw
namespace
namespaced
namespaces
namespacing
neuro
@@ -47,10 +47,10 @@ describe('MemberTab Test', () => {
items: [
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Group',
kind: 'User',
metadata: {
name: 'tara.macgovern',
namespace: 'default',
namespace: 'foo-bar',
uid: 'a5gerth56',
},
relations: [
@@ -72,6 +72,33 @@ describe('MemberTab Test', () => {
memberOf: ['team-d'],
},
},
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'User',
metadata: {
name: 'sara.macgovern',
namespace: 'default',
uid: 'a5gerth57',
},
relations: [
{
type: 'memberOf',
target: {
kind: 'group',
name: 'team-d',
namespace: 'foo-bar',
},
},
],
spec: {
profile: {
displayName: 'Sara MacGovern',
email: 'sara-macgovern@example.com',
picture: 'https://example.com/staff/sara.jpeg',
},
memberOf: ['foo-bar/team-d'],
},
},
] as Entity[],
}),
};
@@ -99,7 +126,9 @@ describe('MemberTab Test', () => {
).toBeInTheDocument();
expect(rendered.getByText('Tara MacGovern')).toHaveAttribute(
'href',
'/catalog/default/user/tara.macgovern',
'/catalog/foo-bar/user/tara.macgovern',
);
expect(rendered.getByText('Members (1)')).toBeInTheDocument();
});
});
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import {
Entity,
ENTITY_DEFAULT_NAMESPACE,
GroupEntity,
RELATION_MEMBER_OF,
UserEntity,
@@ -59,13 +59,7 @@ const useStyles = makeStyles((theme: Theme) =>
}),
);
const MemberComponent = ({
member,
groupEntity,
}: {
member: UserEntity;
groupEntity: Entity;
}) => {
const MemberComponent = ({ member }: { member: UserEntity }) => {
const classes = useStyles();
const {
metadata: { name: metaName },
@@ -97,7 +91,7 @@ const MemberComponent = ({
component={RouterLink}
to={generatePath(
`/catalog/:namespace/user/${metaName}`,
entityRouteParams(groupEntity),
entityRouteParams(member),
)}
>
{displayName}
@@ -117,13 +111,15 @@ export const MembersListCard = (_props: {
}) => {
const { entity: groupEntity } = useEntity<GroupEntity>();
const {
metadata: { name: groupName },
metadata: { name: groupName, namespace: grpNamespace },
spec: { profile },
} = groupEntity;
const catalogApi = useApi(catalogApiRef);
const displayName = profile?.displayName ?? groupName;
const groupNamespace = grpNamespace || ENTITY_DEFAULT_NAMESPACE;
const { loading, error, value: members } = useAsync(async () => {
const membersList = await catalogApi.getEntities({
filter: { kind: 'User' },
@@ -134,7 +130,9 @@ export const MembersListCard = (_props: {
r =>
r.type === RELATION_MEMBER_OF &&
r.target.name.toLocaleLowerCase('en-US') ===
groupName.toLocaleLowerCase('en-US'),
groupName.toLocaleLowerCase('en-US') &&
r.target.namespace.toLocaleLowerCase('en-US') ===
groupNamespace.toLocaleLowerCase('en-US'),
),
);
return groupMembersList;
@@ -155,11 +153,7 @@ export const MembersListCard = (_props: {
<Grid container spacing={3}>
{members && members.length > 0 ? (
members.map(member => (
<MemberComponent
member={member}
groupEntity={groupEntity}
key={member.metadata.uid}
/>
<MemberComponent member={member} key={member.metadata.uid} />
))
) : (
<Box p={2}>