Skip to content
Snippets Groups Projects
Commit 3a3de449 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

user privileges are fetched together with other user data

parent 5c1b96f7
No related branches found
No related tags found
2 merge requests!223reset the pin numbers before search results are fetch (so the results will be...,!199Resolve "[MIN-321] form for reporting errors in minerva"
......@@ -12,6 +12,7 @@ import { loginFixture } from '@/models/fixtures/loginFixture';
import { overlaysFixture } from '@/models/fixtures/overlaysFixture';
import { userPrivilegesFixture } from '@/models/fixtures/userPrivilegesFixture';
import { MODAL_INITIAL_STATE_MOCK } from '@/redux/modal/modal.mock';
import { userFixture } from '@/models/fixtures/userFixture';
import { LoginModal } from './LoginModal.component';
const mockedAxiosClient = mockNetworkResponse();
......@@ -71,9 +72,7 @@ describe('LoginModal - component', () => {
});
it('should fetch user overlays when login is successful', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient
.onGet(apiPath.userPrivileges(loginFixture.login))
.reply(HttpStatusCode.Ok, userPrivilegesFixture);
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, userFixture);
mockedAxiosClient
.onGet(
apiPath.getAllUserOverlaysByCreatorQuery({
......@@ -103,8 +102,8 @@ describe('LoginModal - component', () => {
});
it('should display loggedInMenuModal after successful login as admin', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient.onGet(apiPath.userPrivileges(loginFixture.login)).reply(HttpStatusCode.Ok, {
...userPrivilegesFixture,
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, {
...userFixture,
privileges: [
{
privilegeType: 'IS_ADMIN',
......@@ -142,8 +141,8 @@ describe('LoginModal - component', () => {
});
it('should display loggedInMenuModal after successful login as curator', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient.onGet(apiPath.userPrivileges(loginFixture.login)).reply(HttpStatusCode.Ok, {
...userPrivilegesFixture,
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, {
...userFixture,
privileges: [
{
privilegeType: 'IS_CURATOR',
......
import { z } from 'zod';
const userPrivilege = z.object({
export const userPrivilegeSchema = z.object({
privilegeType: z.string(),
objectId: z.string().nullable(),
});
export const userPrivilegesSchema = z.object({
privileges: z.array(userPrivilege),
privileges: z.array(userPrivilegeSchema),
});
import { z } from 'zod';
import { userPrivilegesSchema } from '@/models/userPrivilegesSchema';
import { userPrivilegeSchema } from '@/models/userPrivilegesSchema';
import { ZERO } from '@/constants/common';
export const userSchema = z.object({
......@@ -14,7 +14,7 @@ export const userSchema = z.object({
simpleColor: z.string().nullable(),
removed: z.boolean(),
termsOfUseConsent: z.boolean(),
privileges: z.array(userPrivilegesSchema),
privileges: z.array(userPrivilegeSchema),
active: z.boolean(),
confirmed: z.boolean(),
ldapAccountAvailable: z.boolean(),
......
......@@ -42,9 +42,7 @@ describe('user reducer', () => {
it('should update store after successful login query', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient
.onGet(apiPath.userPrivileges(loginFixture.login))
.reply(HttpStatusCode.Ok, userPrivilegesFixture);
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, userFixture);
await store.dispatch(login(CREDENTIALS));
const { authenticated, loading } = store.getState().user;
......@@ -54,6 +52,7 @@ describe('user reducer', () => {
it('should update store on loading login query', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, userFixture);
const loginPromise = store.dispatch(login(CREDENTIALS));
const { authenticated, loading } = store.getState().user;
......@@ -65,8 +64,8 @@ describe('user reducer', () => {
const { authenticated: authenticatedFulfilled, loading: promiseFulfilled } =
store.getState().user;
expect(authenticatedFulfilled).toBe(true);
expect(promiseFulfilled).toEqual('succeeded');
expect(authenticatedFulfilled).toBe(true);
});
it('should update store after successful getSessionValid query', async () => {
......
......@@ -3,22 +3,14 @@ import { createAsyncThunk } from '@reduxjs/toolkit';
import { validateDataUsingZodSchema } from '@/utils/validateDataUsingZodSchema';
import { loginSchema } from '@/models/loginSchema';
import { sessionSchemaValid } from '@/models/sessionValidSchema';
import { Login, SessionValid, User, UserPrivileges } from '@/types/models';
import { Login, SessionValid, User, UserPrivilege } from '@/types/models';
import { USER_ROLE } from '@/constants/user';
import { getError } from '@/utils/error-report/getError';
import { apiPath } from '../apiPath';
import { closeModal, openLoggedInMenuModal } from '../modal/modal.slice';
import { hasPrivilege } from './user.utils';
const getUserRole = async (login: string): Promise<string> => {
const response = await axiosInstance.get<UserPrivileges>(apiPath.userPrivileges(login), {
withCredentials: true,
});
const {
data: { privileges },
} = response;
const getUserRole = (privileges: UserPrivilege[]): string => {
if (hasPrivilege(privileges, 'IS_ADMIN')) {
return USER_ROLE.ADMIN;
}
......@@ -50,7 +42,8 @@ export const login = createAsyncThunk(
const loginName = response.data.login;
if (isDataValid) {
const role = await getUserRole(loginName);
const userData = await getUserData(loginName);
const role = getUserRole(userData.privileges);
if (role !== USER_ROLE.ADMIN && role !== USER_ROLE.CURATOR) {
dispatch(closeModal());
......@@ -82,8 +75,8 @@ export const getSessionValid = createAsyncThunk('user/getSessionValid', async ()
data: { login: loginName },
} = response;
const role = await getUserRole(loginName);
const userData = await getUserData(loginName);
const role = getUserRole(userData.privileges);
if (isDataValid) {
return {
......
......@@ -59,7 +59,7 @@ import { submapConnection } from '@/models/submapConnection';
import { targetElementSchema } from '@/models/targetElementSchema';
import { targetSchema } from '@/models/targetSchema';
import { targetSearchNameResult } from '@/models/targetSearchNameResult';
import { userPrivilegesSchema } from '@/models/userPrivilegesSchema';
import { userPrivilegeSchema, userPrivilegesSchema } from '@/models/userPrivilegesSchema';
import { z } from 'zod';
import { userSchema } from '@/models/userSchema';
......@@ -113,6 +113,7 @@ export type TargetSearchNameResult = z.infer<typeof targetSearchNameResult>;
export type TargetElement = z.infer<typeof targetElementSchema>;
export type SubmapConnection = z.infer<typeof submapConnection>;
export type UserPrivileges = z.infer<typeof userPrivilegesSchema>;
export type UserPrivilege = z.infer<typeof userPrivilegeSchema>;
export type User = z.infer<typeof userSchema>;
export type MarkerType = z.infer<typeof markerTypeSchema>;
export type MarkerPin = z.infer<typeof markerPinSchema>;
......
/* eslint-disable no-magic-numbers */
import { createErrorData } from '@/utils/error-report/errorReporting';
import { apiPath } from '@/redux/apiPath';
import { HttpStatusCode } from 'axios';
import { loginFixture } from '@/models/fixtures/loginFixture';
import { userPrivilegesFixture } from '@/models/fixtures/userPrivilegesFixture';
import { login } from '@/redux/user/user.thunks';
import { mockNetworkResponse } from '@/utils/mockNetworkResponse';
import { store } from '@/redux/store';
import { getConfiguration } from '@/redux/configuration/configuration.thunks';
import { configurationFixture } from '@/models/fixtures/configurationFixture';
import { userFixture } from '@/models/fixtures/userFixture';
const mockedAxiosClient = mockNetworkResponse();
......@@ -40,9 +39,7 @@ describe('createErrorData', () => {
it('should add login when logged', async () => {
mockedAxiosClient.onPost(apiPath.postLogin()).reply(HttpStatusCode.Ok, loginFixture);
mockedAxiosClient
.onGet(apiPath.userPrivileges(loginFixture.login))
.reply(HttpStatusCode.Ok, userPrivilegesFixture);
mockedAxiosClient.onGet(apiPath.user(loginFixture.login)).reply(HttpStatusCode.Ok, userFixture);
await store.dispatch(login(CREDENTIALS));
const error = createErrorData(new Error('hello'));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment