Skip to content

Commit 6d3d608

Browse files
committed
fix: issue with summary permissions
1 parent c30748b commit 6d3d608

7 files changed

Lines changed: 29 additions & 20 deletions

File tree

apps/api/prisma/schema.prisma

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ enum AppSubject {
168168
InstrumentRecord
169169
Session
170170
Subject
171-
Summary
172171
User
173172
}
174173

apps/api/src/ability/ability.factory.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,17 @@ export class AbilityFactory {
2727
ability.can('read', 'Session', { groupId: { in: user.groupIds } });
2828
ability.can('create', 'Subject');
2929
ability.can('read', 'Subject', { groupIds: { hasSome: user.groupIds } });
30-
ability.can('read', 'Summary');
3130
ability.can('read', 'User', { groupIds: { hasSome: user.groupIds } });
32-
3331
break;
3432
case 'STANDARD':
3533
ability.can('read', 'Group', { id: { in: user.groupIds } });
3634
ability.can('read', 'Instrument');
3735
ability.can('create', 'InstrumentRecord');
38-
ability.can('read', 'Session');
36+
ability.can('read', 'Session', { groupId: { in: user.groupIds } });
3937
ability.can('create', 'Session');
4038
ability.can('create', 'Subject');
4139
ability.can('read', 'Subject', { groupIds: { hasSome: user.groupIds } });
40+
break;
4241
}
4342
user.additionalPermissions.forEach(({ action, subject }) => {
4443
ability.can(action, subject);

apps/api/src/summary/summary.controller.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ export class SummaryController {
1212
constructor(private readonly summaryService: SummaryService) {}
1313

1414
@Get()
15-
@RouteAccess([{ action: 'read', subject: 'Instrument' }])
15+
@RouteAccess([
16+
{ action: 'read', subject: 'Instrument' },
17+
{ action: 'read', subject: 'InstrumentRecord' },
18+
{ action: 'read', subject: 'Subject' },
19+
{ action: 'read', subject: 'User' }
20+
])
1621
async getSummary(@CurrentUser('ability') ability: AppAbility, @Query('groupId') groupId?: string): Promise<Summary> {
1722
return this.summaryService.getSummary(groupId, { ability });
1823
}

apps/web/src/features/admin/pages/ManageUsersPage.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,6 @@ export const ManageUsersPage = () => {
178178
en: 'Subject',
179179
fr: 'Client'
180180
}),
181-
Summary: t({
182-
en: 'Summary',
183-
fr: 'Résumé'
184-
}),
185181
User: t({
186182
en: 'User',
187183
fr: 'Utilisateur'

apps/web/src/features/dashboard/pages/DashboardPage.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Heading } from '@douglasneuroinformatics/libui/components';
22
import { useTranslation } from '@douglasneuroinformatics/libui/hooks';
3+
import type { AppSubjectName } from '@opendatacapture/schemas/core';
34
import { Navigate } from 'react-router-dom';
45

56
import { PageHeader } from '@/components/PageHeader';
@@ -13,7 +14,11 @@ export const DashboardPage = () => {
1314
const currentUser = useAppStore((store) => store.currentUser);
1415
const { t } = useTranslation();
1516

16-
if (!currentUser?.ability.can('read', 'Summary')) {
17+
const ability = currentUser?.ability;
18+
const subjects: AppSubjectName[] = ['Instrument', 'InstrumentRecord', 'Subject', 'User'];
19+
const isAuthorized = subjects.every((subject) => ability?.can('read', subject));
20+
21+
if (!isAuthorized) {
1722
return <Navigate to="/session/start-session" />;
1823
}
1924

apps/web/src/hooks/useNavItems.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,30 @@ export function useNavItems() {
3939
const setupState = useSetupState();
4040

4141
useEffect(() => {
42+
const ability = currentUser?.ability;
4243
const globalItems: NavItem[] = [];
43-
if (currentUser?.ability.can('read', 'Summary')) {
44+
if (
45+
ability?.can('read', 'Instrument') &&
46+
ability.can('read', 'InstrumentRecord') &&
47+
ability.can('read', 'Subject') &&
48+
ability.can('read', 'User')
49+
) {
4450
globalItems.push({
4551
icon: BarChartBigIcon,
4652
label: t('layout.navLinks.dashboard'),
4753
url: '/dashboard'
4854
});
4955
}
50-
if (currentUser?.ability.can('read', 'Subject') && currentUser.ability.can('read', 'InstrumentRecord')) {
56+
if (ability?.can('read', 'Subject') && ability.can('read', 'InstrumentRecord')) {
5157
globalItems.push({
5258
icon: DatabaseIcon,
5359
label: t('layout.navLinks.datahub'),
5460
url: '/datahub'
5561
});
5662
}
5763
if (
58-
currentUser?.ability.can('read', 'Subject') &&
59-
currentUser.ability.can('create', 'InstrumentRecord') &&
64+
ability?.can('read', 'Subject') &&
65+
ability.can('create', 'InstrumentRecord') &&
6066
setupState.data?.isExperimentalFeaturesEnabled
6167
) {
6268
globalItems.push({
@@ -65,7 +71,7 @@ export function useNavItems() {
6571
url: '/upload'
6672
});
6773
}
68-
if (currentGroup && currentUser?.ability.can('manage', 'Group')) {
74+
if (currentGroup && ability?.can('manage', 'Group')) {
6975
globalItems.push({
7076
icon: UsersIcon,
7177
label: t('layout.navLinks.manageGroup'),
@@ -74,7 +80,7 @@ export function useNavItems() {
7480
}
7581

7682
const adminItems: NavItem[] = [];
77-
if (currentUser?.ability.can('manage', 'all')) {
83+
if (ability?.can('manage', 'all')) {
7884
adminItems.push({
7985
icon: CogIcon,
8086
label: t({
@@ -102,23 +108,23 @@ export function useNavItems() {
102108
}
103109

104110
const sessionItems: NavItem[] = [];
105-
if (currentUser?.ability.can('create', 'Session')) {
111+
if (ability?.can('create', 'Session')) {
106112
sessionItems.push({
107113
disabled: currentSession !== null,
108114
icon: CirclePlayIcon,
109115
label: t('layout.navLinks.startSession'),
110116
url: '/session/start-session'
111117
});
112118
}
113-
if (currentUser?.ability.can('create', 'InstrumentRecord')) {
119+
if (ability?.can('create', 'InstrumentRecord')) {
114120
sessionItems.push({
115121
disabled: currentSession === null,
116122
icon: ComputerIcon,
117123
label: t('layout.navLinks.accessibleInstruments'),
118124
url: '/instruments/accessible-instruments'
119125
});
120126
}
121-
if (currentUser?.ability.can('read', 'Subject') && currentUser.ability.can('read', 'InstrumentRecord')) {
127+
if (ability?.can('read', 'Subject') && ability.can('read', 'InstrumentRecord')) {
122128
sessionItems.push({
123129
disabled: currentSession === null,
124130
icon: EyeIcon,

packages/schemas/src/core/core.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export const $AppSubjectName = z.enum([
1717
'InstrumentRecord',
1818
'Session',
1919
'Subject',
20-
'Summary',
2120
'User'
2221
]);
2322

0 commit comments

Comments
 (0)