Skip to content

Commit 77ff39d

Browse files
BC-10583: Restrict options for EP (#3988)
* chore: check isExpert -- this check will be deleted after BE provides spesific permission * restrict access via URL * chore: make the content invisible if the user has no permission to view * add unit test for the user has not permission to view the content * chore: introduce hardcoded permission to control the memberList menu option * update generated api * use new Permission on checking them menu option * fix unit tests for RoomMenu component * correct permission usaga in component and test file * chore: set default value to false --------- Co-authored-by: Murat Merdoglu <[email protected]> Co-authored-by: Murat Merdoglu <[email protected]>
1 parent 87aae42 commit 77ff39d

File tree

8 files changed

+53
-16
lines changed

8 files changed

+53
-16
lines changed

src/modules/data/room/roomAuthorization.composable.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,26 @@ export const useRoomAuthorization = () => {
3131
const canManageRoomInvitationLinks = computed(
3232
() => userCanManageRoomInvitationLinks.value && checkRoomPermission(Permission.RoomManageInvitationlinks)
3333
);
34-
3534
const canAddAllStudents = computed(() => canAddRoomMembers.value && canSeeAllStudents.value);
35+
const canSeeMembersList = hasPermission(Permission.SchoolListRoomMembers);
3636

3737
return {
38+
canAddAllStudents,
3839
canAddRoomMembers,
3940
canChangeOwner,
41+
canCopyRoom,
4042
canCreateRoom,
4143
canDeleteRoom,
42-
canCopyRoom,
43-
canShareRoom,
4444
canEditRoom,
4545
canEditRoomContent,
4646
canLeaveRoom,
47+
canListDrafts,
48+
canManageRoomInvitationLinks,
49+
canManageVideoconferences,
4750
canRemoveRoomMembers,
48-
canAddAllStudents,
4951
canSeeAllStudents,
52+
canSeeMembersList,
53+
canShareRoom,
5054
canViewRoom,
51-
canManageRoomInvitationLinks,
52-
canListDrafts,
53-
canManageVideoconferences,
5455
};
5556
};

src/modules/feature/room/RoomMenu.unit.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ describe("@feature-room/RoomMenu", () => {
4848
canListDrafts: computed(() => false),
4949
canManageRoomInvitationLinks: computed(() => false),
5050
canManageVideoconferences: computed(() => false),
51+
canSeeMembersList: computed(() => false),
5152
};
5253
roomAuthorization.mockReturnValue(roomPermissions);
5354

@@ -139,7 +140,7 @@ describe("@feature-room/RoomMenu", () => {
139140

140141
describe("when user only has view members permission", () => {
141142
it("should contain room members menu item with correct membersInfoText and leave menu item", async () => {
142-
roomPermissions.canViewRoom = computed(() => true);
143+
roomPermissions.canSeeMembersList = computed(() => true);
143144
roomPermissions.canAddRoomMembers = computed(() => false);
144145

145146
const { wrapper, menuBtn } = setup();
@@ -158,7 +159,7 @@ describe("@feature-room/RoomMenu", () => {
158159

159160
describe("when user has view room, edit, delete and leave permissions", () => {
160161
it("should show all menu items", async () => {
161-
roomPermissions.canViewRoom = computed(() => true);
162+
roomPermissions.canSeeMembersList = computed(() => true);
162163
roomPermissions.canEditRoom = computed(() => true);
163164
roomPermissions.canDeleteRoom = computed(() => true);
164165

@@ -265,7 +266,7 @@ describe("@feature-room/RoomMenu", () => {
265266

266267
describe("when user can add room members", () => {
267268
it("should show the correct membersInfoText", async () => {
268-
roomPermissions.canViewRoom = computed(() => true);
269+
roomPermissions.canSeeMembersList = computed(() => true);
269270
roomPermissions.canAddRoomMembers = computed(() => true);
270271

271272
const { wrapper, menuBtn } = setup();
@@ -280,7 +281,7 @@ describe("@feature-room/RoomMenu", () => {
280281

281282
describe("when clicking on menu button", () => {
282283
beforeEach(() => {
283-
roomPermissions.canViewRoom = computed(() => true);
284+
roomPermissions.canSeeMembersList = computed(() => true);
284285
roomPermissions.canEditRoom = computed(() => true);
285286
roomPermissions.canDeleteRoom = computed(() => true);
286287
});

src/modules/feature/room/RoomMenu.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<KebabMenu class="mx-2" :aria-label="t('pages.roomDetails.ariaLabels.menu')" data-testid="room-menu">
33
<KebabMenuActionEdit v-if="canEditRoom" @click="() => $emit('room:edit')" />
44
<KebabMenuActionRoomMembers
5-
v-if="canViewRoom"
5+
v-if="canSeeMembersList"
66
:members-info-text="membersInfoText"
77
@click="() => $emit('room:manage-members')"
88
/>
@@ -44,7 +44,7 @@ const { t } = useI18n();
4444
const isRoomCopyFeatureEnabled = computed(() => useEnvConfig().value.FEATURE_ROOM_COPY_ENABLED);
4545
const isRoomShareFeatureEnabled = computed(() => useEnvConfig().value.FEATURE_ROOM_SHARE);
4646
47-
const { canAddRoomMembers, canCopyRoom, canShareRoom, canEditRoom, canDeleteRoom, canViewRoom } =
47+
const { canAddRoomMembers, canCopyRoom, canShareRoom, canEditRoom, canDeleteRoom, canSeeMembersList } =
4848
useRoomAuthorization();
4949
5050
const membersInfoText = computed(() =>

src/modules/page/room/RoomDetails.page.unit.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ describe("@pages/RoomsDetails.page.vue", () => {
6666
canListDrafts: computed(() => false),
6767
canManageRoomInvitationLinks: computed(() => false),
6868
canManageVideoconferences: computed(() => false),
69+
canSeeMembersList: computed(() => false),
6970
};
7071
roomAuthorization.mockReturnValue(roomPermissions);
7172
});

src/modules/page/room/RoomMembers.page.unit.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ describe("RoomMembersPage", () => {
8181

8282
router = createMock<Router>({
8383
currentRoute: ref({ query: { tab: "" } }),
84+
replace: vi.fn(),
8485
});
8586
useRouterMock.mockReturnValue(router);
8687

@@ -106,6 +107,7 @@ describe("RoomMembersPage", () => {
106107
canManageRoomInvitationLinks: computed(() => false),
107108
canListDrafts: computed(() => false),
108109
canManageVideoconferences: computed(() => false),
110+
canSeeMembersList: computed(() => true),
109111
};
110112
roomAuthorization.mockReturnValue(roomPermissions);
111113

@@ -193,6 +195,25 @@ describe("RoomMembersPage", () => {
193195
expect(wrapper.exists()).toBe(true);
194196
});
195197

198+
describe("when user has no permission to see members list", () => {
199+
beforeEach(() => (roomPermissions.canSeeMembersList = computed(() => false)));
200+
it("should not render content", () => {
201+
const { wrapper } = setup();
202+
const wireframe = wrapper.findComponent(DefaultWireframe);
203+
expect(wireframe.exists()).toBe(false);
204+
});
205+
206+
it("should not fetch members on mount", () => {
207+
const { roomMembersStore } = setup();
208+
expect(roomMembersStore.fetchMembers).not.toHaveBeenCalled();
209+
});
210+
211+
it("should replace the route to /rooms", () => {
212+
setup();
213+
expect(router.replace).toHaveBeenCalledWith("/rooms");
214+
});
215+
});
216+
196217
it("should fetch members on mount", () => {
197218
const { roomMembersStore } = setup();
198219
expect(roomMembersStore.fetchMembers).toHaveBeenCalled();

src/modules/page/room/RoomMembers.page.vue

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
<template>
2-
<DefaultWireframe max-width="full" :breadcrumbs="breadcrumbs" :fab-items="fabAction" @fab:clicked="onFabClick">
2+
<DefaultWireframe
3+
v-if="canSeeMembersList"
4+
max-width="full"
5+
:breadcrumbs="breadcrumbs"
6+
:fab-items="fabAction"
7+
@fab:clicked="onFabClick"
8+
>
39
<template #header>
410
<div ref="header">
511
<div class="d-flex align-center">
@@ -106,7 +112,7 @@ const { fetchMembers, loadSchoolList, leaveRoom, resetStore } = roomMembersStore
106112
const header = ref<HTMLElement | null>(null);
107113
const { bottom: headerBottom } = useElementBounding(header);
108114
const { askConfirmation } = useConfirmationDialog();
109-
const { canAddRoomMembers, canLeaveRoom, canManageRoomInvitationLinks } = useRoomAuthorization();
115+
const { canAddRoomMembers, canLeaveRoom, canManageRoomInvitationLinks, canSeeMembersList } = useRoomAuthorization();
110116
111117
const { isInvitationDialogOpen, invitationStep } = storeToRefs(useRoomInvitationLinkStore());
112118
@@ -225,11 +231,15 @@ const onLeaveRoom = async () => {
225231
226232
onMounted(async () => {
227233
activeTab.value = Object.values(Tab).includes(props.tab) ? props.tab : Tab.Members;
228-
229234
const roomId = route.params.id.toString();
235+
230236
if (room.value === undefined) {
231237
await fetchRoom(roomId);
232238
}
239+
if (canSeeMembersList.value === false) {
240+
router.replace("/rooms");
241+
return;
242+
}
233243
await fetchMembers();
234244
});
235245

src/modules/page/room/Rooms.page.unit.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ describe("RoomsPage", () => {
4343
canListDrafts: computed(() => false),
4444
canManageRoomInvitationLinks: computed(() => false),
4545
canManageVideoconferences: computed(() => false),
46+
canSeeMembersList: computed(() => false),
4647
};
4748
roomAuthorization.mockReturnValue(roomPermissions);
4849
});

src/serverApi/v3/api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ export enum AuthorizationContextParamsRequiredPermissionsEnum {
425425
SchoolEditRoom = 'SCHOOL_EDIT_ROOM',
426426
SchoolDeleteRoom = 'SCHOOL_DELETE_ROOM',
427427
SchoolListDiscoverableTeachers = 'SCHOOL_LIST_DISCOVERABLE_TEACHERS',
428+
SchoolListRoomMembers = 'SCHOOL_LIST_ROOM_MEMBERS',
428429
SchoolManageRoomInvitationlinks = 'SCHOOL_MANAGE_ROOM_INVITATIONLINKS',
429430
ScopePermissionsView = 'SCOPE_PERMISSIONS_VIEW',
430431
StartMeeting = 'START_MEETING',
@@ -7902,6 +7903,7 @@ export enum Permission {
79027903
SchoolEditRoom = 'SCHOOL_EDIT_ROOM',
79037904
SchoolDeleteRoom = 'SCHOOL_DELETE_ROOM',
79047905
SchoolListDiscoverableTeachers = 'SCHOOL_LIST_DISCOVERABLE_TEACHERS',
7906+
SchoolListRoomMembers = 'SCHOOL_LIST_ROOM_MEMBERS',
79057907
SchoolManageRoomInvitationlinks = 'SCHOOL_MANAGE_ROOM_INVITATIONLINKS',
79067908
ScopePermissionsView = 'SCOPE_PERMISSIONS_VIEW',
79077909
StartMeeting = 'START_MEETING',

0 commit comments

Comments
 (0)