Skip to content

Commit 415901d

Browse files
authored
Feat: Verify user permissions before loading a page (#30)
Implement a permission system to allow us to define that a page requires the user to have some permissions. At the moment, the only permission available is beeing logged, but the system should allow to add new permissions very easily
1 parent ccbd9e2 commit 415901d

File tree

19 files changed

+154
-136
lines changed

19 files changed

+154
-136
lines changed

src/api/auth/applications/fetchApplications.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Dispatch, SetStateAction, useEffect, useState } from 'react';
22
import { useAPI } from '@/api/api';
33
import { ApplicationOverview } from '@/api/auth/applications/application.interface';
4-
import { useConnectedUser } from '@/module/user';
4+
import { useConnectedUser } from '@/module/session';
55

66
export default function useApplications(): [
77
ApplicationOverview[] | undefined,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { API, ResponseHandler } from '@/api/api';
2+
import { Permissions } from '@/api/permissions/permissions.interface';
3+
4+
export function fetchMyPermissions(api: API): ResponseHandler<Permissions, void | Permissions | undefined> {
5+
return api.get<Permissions>('/auth/permissions/current');
6+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export interface Permissions {
2+
apiPermissions: ApiPermission[];
3+
userPermissions: UserPermissions[];
4+
}
5+
6+
interface UserPermissions<SoftPermission extends boolean = boolean> {
7+
permission: UserPermission;
8+
isSoftPermission: SoftPermission;
9+
users: SoftPermission extends true ? string[] : null;
10+
}
11+
12+
enum Permission {
13+
API_SEE_OPINIONS_UE = 'API_SEE_OPINIONS_UE',
14+
API_UPLOAD_ANNAL = 'API_UPLOAD_ANNAL',
15+
API_MODERATE_ANNAL = 'API_MODERATE_ANNAL',
16+
API_MODERATE_COMMENTS = 'API_MODERATE_COMMENTS',
17+
18+
USER_SEE_DETAILS = 'USER_SEE_DETAILS',
19+
USER_UPDATE_DETAILS = 'USER_UPDATE_DETAILS',
20+
}
21+
22+
type UserPermission = Permission & `USER_${string}`;
23+
type ApiPermission = Permission & `API_${string}`;

src/api/profile/profile.types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UserType } from '@/module/user';
1+
import { UserType } from '@/module/session';
22

33
export interface Profile {
44
id: string;

src/app/developers/application/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import { useState } from 'react';
88
import Button from '@/components/UI/Button';
99
import createApplication from '@/api/auth/applications/createApplication';
1010
import { useAPI } from '@/api/api';
11-
import { useConnectedUser } from '@/module/user';
1211
import updateApplicationToken from '@/api/auth/applications/updateToken';
1312
import Icons from '@/icons';
1413
import Page from '@/components/utilities/Page';
14+
import { useConnectedUser } from '@/module/session';
1515

1616
export default function ApplicationsPage() {
1717
const loggedIn = !!useConnectedUser();

src/app/login/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default function LoginPage() {
5959
}
6060
if (registerToken) {
6161
return (
62-
<Page hasNavbar={true} permissions={'public'} needsLoading={true} className={styles.confirmRegister}>
62+
<Page hasNavbar={true} needsLoading={true} className={styles.confirmRegister}>
6363
<div>
6464
<Trans
6565
i18nKey={'login:legal.text'}
@@ -95,7 +95,7 @@ export default function LoginPage() {
9595
}
9696

9797
return (
98-
<Page hasNavbar={true} permissions={'public'} needsLoading={true} id="login-page" className={styles.loginPage}>
98+
<Page hasNavbar={true} needsLoading={true} id="login-page" className={styles.loginPage}>
9999
<LoginForm application={application} />
100100
</Page>
101101
);

src/app/profile/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
// import { useConnectedUser } from '@/module/user';
3+
// import { useConnectedUser } from '@/module/session';
44
import { setProfilePicture } from '@/api/profile/setProfilePicture';
55
import { useAPI } from '@/api/api';
66
import { useAppTranslation } from '@/lib/i18n';

src/app/register/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Page from '@/components/utilities/Page';
55

66
export default function RegisterPage() {
77
return (
8-
<Page hasNavbar={false} permissions={'public'} id="register-page" className={styles.loginPage}>
8+
<Page hasNavbar={false} id="register-page" className={styles.loginPage}>
99
<RegisterForm />
1010
</Page>
1111
);

src/app/ues/[code]/Comments.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { TFunction, useAppTranslation } from '@/lib/i18n';
55
import Icons from '@/icons';
66
import EditableText from '@/components/EditableText';
77
import Button from '@/components/UI/Button';
8-
import { useConnectedUser } from '@/module/user';
8+
import { useConnectedUser } from '@/module/session';
99
import { Comment } from '@/api/comment/comment.interface';
1010
import { useState } from 'react';
1111
import { editComment } from '@/api/comment/editComment';

src/app/ues/[code]/comments/[commentId]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { TFunction, useAppTranslation } from '@/lib/i18n';
88
import TextArea from '@/components/UI/TextArea';
99
import Button from '@/components/UI/Button';
1010
import { useState } from 'react';
11-
import { useConnectedUser } from '@/module/user';
11+
import { useConnectedUser } from '@/module/session';
1212
import EditableText from '@/components/EditableText';
1313
import { editCommentReply } from '@/api/commentReply/editCommentReply';
1414
import { useAPI } from '@/api/api';

0 commit comments

Comments
 (0)