Skip to content

Commit f204ec6

Browse files
Merge pull request #3614 from RedisInsight/fe/feature/CR-95
CR-95: Add option for overriding baseUrl for resources service
2 parents 7bf0f87 + ce64e9b commit f204ec6

File tree

6 files changed

+24
-18
lines changed

6 files changed

+24
-18
lines changed

redisinsight/api/src/__mocks__/database-recommendation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const mockRecommendationName = 'string';
1010

1111
export const mockDatabaseRecommendationParamsEncrypted = 'recommendation.params_ENCRYPTED';
1212

13-
export const mockDatabaseRecommendationParamsPlain = [];
13+
export const mockDatabaseRecommendationParamsPlain = {};
1414

1515
export const mockDatabaseRecommendation = Object.assign(new DatabaseRecommendation(), {
1616
id: mockDatabaseRecommendationId,

redisinsight/api/src/modules/database-recommendation/models/database-recommendation.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Expose } from 'class-transformer';
22
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
33
import {
4-
IsArray, IsEnum, IsOptional, IsBoolean,
4+
IsEnum, IsOptional, IsBoolean,
55
} from 'class-validator';
66
import { DatabaseRecommendationParams } from 'src/modules/database-recommendation/models';
77

@@ -77,11 +77,9 @@ export class DatabaseRecommendation {
7777

7878
@ApiPropertyOptional({
7979
description: 'Additional recommendation params',
80-
isArray: true,
81-
type: () => String,
80+
type: Object,
8281
})
83-
@IsArray()
8482
@IsOptional()
8583
@Expose()
86-
params?: DatabaseRecommendationParams[];
84+
params?: DatabaseRecommendationParams;
8785
}

redisinsight/ui/src/components/csrf/Csrf.spec.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React from 'react'
22

3-
import apiService, { setCSRFHeader } from 'uiSrc/services/apiService'
3+
import apiService, { setApiCsrfHeader } from 'uiSrc/services/apiService'
44
import { render, screen, waitFor } from 'uiSrc/utils/test-utils'
55
import Csrf from './Csrf'
66

77
jest.mock('uiSrc/services/apiService', () => ({
8-
setCSRFHeader: jest.fn(),
8+
setApiCsrfHeader: jest.fn(),
99
get: jest.fn(() => ({ data: { token: 'csrf-token' } })),
1010
}))
1111

@@ -31,7 +31,7 @@ describe('Csrf', () => {
3131
})
3232

3333
it('should not fetch CSRF token when endpoint is not provided', () => {
34-
render(<Csrf />)
34+
render(<Csrf><div>children</div></Csrf>)
3535

3636
expect(apiService.get).not.toHaveBeenCalled()
3737

@@ -41,7 +41,7 @@ describe('Csrf', () => {
4141
it('should render PagePlaceholder when loading', () => {
4242
process.env.RI_CSRF_ENDPOINT = 'csrf-endpoint'
4343

44-
render(<Csrf />)
44+
render(<Csrf><div>children</div></Csrf>)
4545

4646
expect(screen.getByTestId('page-placeholder')).toBeInTheDocument()
4747
})
@@ -57,7 +57,7 @@ describe('Csrf', () => {
5757

5858
await waitFor(() => {
5959
expect(apiService.get).toHaveBeenCalledWith('csrf-endpoint')
60-
expect(setCSRFHeader).toHaveBeenCalledWith('csrf-token')
60+
expect(setApiCsrfHeader).toHaveBeenCalledWith('csrf-token')
6161

6262
expect(screen.getByText('children')).toBeInTheDocument()
6363
})

redisinsight/ui/src/components/csrf/Csrf.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { ReactElement, useEffect, useState } from 'react'
22

3-
import apiService, { setCSRFHeader } from 'uiSrc/services/apiService'
3+
import apiService, { setApiCsrfHeader } from 'uiSrc/services/apiService'
4+
import { setResourceCsrfHeader } from 'uiSrc/services/resourcesService'
45
import PagePlaceholder from '../page-placeholder'
56

67
const getCsrfEndpoint = () => process.env.RI_CSRF_ENDPOINT || ''
@@ -10,16 +11,16 @@ interface CSRFTokenResponse {
1011
}
1112

1213
const Csrf = ({ children }: { children: ReactElement }) => {
13-
const [loading, setLoading] = useState(false)
14+
// default to true to prevent other components from making requests before the CSRF token is fetched
15+
const [loading, setLoading] = useState(true)
1416

1517
const fetchCsrfToken = async () => {
1618
let data: CSRFTokenResponse | undefined
1719
try {
18-
setLoading(true)
19-
2020
const { data } = await apiService.get<CSRFTokenResponse>(getCsrfEndpoint())
2121

22-
setCSRFHeader(data.token)
22+
setApiCsrfHeader(data.token)
23+
setResourceCsrfHeader(data.token)
2324
} catch (error) {
2425
console.error('Error fetching CSRF token: ', error)
2526
} finally {

redisinsight/ui/src/services/apiService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const mutableAxiosInstance: AxiosInstance = axios.create({
2727
withCredentials: !!hostedApiBaseUrl,
2828
})
2929

30-
export const setCSRFHeader = (token: string) => {
30+
export const setApiCsrfHeader = (token: string) => {
3131
mutableAxiosInstance.defaults.headers.common[CustomHeaders.CsrfToken] = token
3232
}
3333

redisinsight/ui/src/services/resourcesService.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import axios from 'axios'
2+
import { CustomHeaders } from 'uiSrc/constants/api'
23
import { IS_ABSOLUTE_PATH } from 'uiSrc/constants/regex'
34

45
const { apiPort } = window.app?.config || { apiPort: process.env.RI_APP_PORT }
56
const baseApiUrl = process.env.RI_BASE_API_URL
67
const isDevelopment = process.env.NODE_ENV === 'development'
78
const isWebApp = process.env.RI_APP_TYPE === 'web'
9+
const hostedApiBaseUrl = process.env.RI_HOSTED_API_BASE_URL
810

911
let BASE_URL = !isDevelopment && isWebApp ? '/' : `${baseApiUrl}:${apiPort}/`
1012

@@ -15,9 +17,14 @@ if (window.__RI_PROXY_PATH__) {
1517
export const RESOURCES_BASE_URL = BASE_URL
1618

1719
const resourcesService = axios.create({
18-
baseURL: RESOURCES_BASE_URL,
20+
baseURL: hostedApiBaseUrl || RESOURCES_BASE_URL,
21+
withCredentials: !!hostedApiBaseUrl,
1922
})
2023

24+
export const setResourceCsrfHeader = (token: string) => {
25+
resourcesService.defaults.headers.common[CustomHeaders.CsrfToken] = token
26+
}
27+
2128
// TODO: it seems it's shoudn't be location.origin
2229
// TODO: check all cases and rename this to getResourcesUrl
2330
// TODO: also might be helpful create function which returns origin url

0 commit comments

Comments
 (0)