Skip to content

Commit 0a50a0a

Browse files
committed
Merge branch 'main' into feature/RI-3355_Tree_view_improvments
2 parents 0e6d3a2 + a8fe335 commit 0a50a0a

File tree

161 files changed

+3369
-2825
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+3369
-2825
lines changed

jest.config.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ module.exports = {
5454
],
5555
coverageThreshold: {
5656
global: {
57-
statements: 70,
58-
branches: 50,
59-
functions: 60,
60-
lines: 72,
57+
statements: 77,
58+
branches: 55,
59+
functions: 65,
60+
lines: 75,
6161
},
6262
// './redisinsight/ui/src/slices/**/*.ts': {
6363
// statements: 90,
Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,49 @@
1-
import * as React from 'react';
1+
import React, { useEffect } from 'react';
22

33
export default function MonacoEditor(props) {
4-
return <div {...props} data-testid="monaco"/>;
4+
useEffect(() => {
5+
props.editorDidMount && props.editorDidMount(
6+
// editor
7+
{
8+
addCommand: jest.fn(),
9+
getContribution: jest.fn(),
10+
onKeyDown: jest.fn(),
11+
onMouseDown: jest.fn(),
12+
addAction: jest.fn(),
13+
getAction: jest.fn(),
14+
deltaDecorations: jest.fn(),
15+
createContextKey: jest.fn(),
16+
focus: jest.fn(),
17+
onDidChangeCursorPosition: jest.fn(),
18+
executeEdits: jest.fn()
19+
},
20+
// monaco
21+
{
22+
Range: jest.fn().mockImplementation(() => { return {} }),
23+
languages: {
24+
getLanguages: jest.fn(),
25+
register: jest.fn(),
26+
registerCompletionItemProvider: jest.fn().mockReturnValue({
27+
dispose: jest.fn()
28+
}),
29+
registerSignatureHelpProvider: jest.fn().mockReturnValue({
30+
dispose: jest.fn()
31+
}),
32+
setLanguageConfiguration: jest.fn(),
33+
setMonarchTokensProvider: jest.fn(),
34+
},
35+
KeyMod: {},
36+
KeyCode: {}
37+
})
38+
}, [])
39+
return <input {...props} data-testid="monaco"/>;
40+
}
41+
42+
export const languages = {
43+
CompletionItemKind: {
44+
Function: 1
45+
},
46+
CompletionItemInsertTextRule: {
47+
InsertAsSnippet: 4
48+
}
549
}

redisinsight/api/config/default.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export default {
5757
appVersion: process.env.APP_VERSION || '2.0.0',
5858
requestTimeout: parseInt(process.env.REQUEST_TIMEOUT, 10) || 10000,
5959
excludeRoutes: [],
60+
excludeAuthRoutes: [],
6061
},
6162
sockets: {
6263
cors: process.env.SOCKETS_CORS ? process.env.SOCKETS_CORS === 'true' : false,

redisinsight/api/src/__mocks__/common.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import { ClientContext, ClientMetadata, Session } from 'src/common/models';
2+
import { mockDatabase } from 'src/__mocks__/databases';
3+
import { v4 as uuidv4 } from 'uuid';
4+
15
export type MockType<T> = {
26
[P in keyof T]: jest.Mock<any>;
37
};
@@ -57,3 +61,33 @@ export const mockRepository = jest.fn(() => ({
5761
remove: jest.fn(),
5862
createQueryBuilder: mockCreateQueryBuilder,
5963
}));
64+
65+
export const mockSession: Session = {
66+
userId: uuidv4(),
67+
sessionId: uuidv4(),
68+
};
69+
70+
export const mockCliClientMetadata: ClientMetadata = {
71+
session: mockSession,
72+
databaseId: mockDatabase.id,
73+
context: ClientContext.CLI,
74+
uniqueId: uuidv4(),
75+
};
76+
77+
export const mockWorkbenchClientMetadata: ClientMetadata = {
78+
session: mockSession,
79+
databaseId: mockDatabase.id,
80+
context: ClientContext.Workbench,
81+
};
82+
83+
export const mockBrowserClientMetadata: ClientMetadata = {
84+
session: mockSession,
85+
databaseId: mockDatabase.id,
86+
context: ClientContext.Browser,
87+
};
88+
89+
export const mockCommonClientMetadata: ClientMetadata = {
90+
session: mockSession,
91+
databaseId: mockDatabase.id,
92+
context: ClientContext.Common,
93+
};

redisinsight/api/src/__mocks__/databases.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import { mockIORedisClient } from 'src/__mocks__/redis';
77
import { mockSentinelMasterDto } from 'src/__mocks__/redis-sentinel';
88
import { pick } from 'lodash';
99
import { RedisDatabaseInfoResponse } from 'src/modules/database/dto/redis-info.dto';
10-
import { ClientMetadata } from 'src/modules/redis/models/client-metadata';
11-
import { AppTool } from 'src/models';
1210
import { DatabaseOverview } from 'src/modules/database/models/database-overview';
1311

1412
export const mockDatabaseId = 'a77b23c1-7816-4ea4-b61f-d37795a0f805-db-id';
@@ -115,11 +113,6 @@ export const mockClusterDatabaseWithTlsAuthEntity = Object.assign(new DatabaseEn
115113
nodes: JSON.stringify(mockClusterNodes),
116114
});
117115

118-
export const mockClientMetadata: ClientMetadata = {
119-
databaseId: mockDatabase.id,
120-
namespace: AppTool.Common,
121-
};
122-
123116
export const mockDatabaseOverview: DatabaseOverview = {
124117
version: '6.2.4',
125118
usedMemory: 1,

redisinsight/api/src/app.module.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ServerModule } from 'src/modules/server/server.module';
1919
import { LocalDatabaseModule } from 'src/local-database.module';
2020
import { CoreModule } from 'src/core.module';
2121
import { AutodiscoveryModule } from 'src/modules/autodiscovery/autodiscovery.module';
22+
import { DummyAuthMiddleware } from 'src/common/middlewares/dummy-auth.middleware';
2223
import { BrowserModule } from './modules/browser/browser.module';
2324
import { RedisEnterpriseModule } from './modules/redis-enterprise/redis-enterprise.module';
2425
import { RedisSentinelModule } from './modules/redis-sentinel/redis-sentinel.module';
@@ -97,6 +98,11 @@ export class AppModule implements OnModuleInit, NestModule {
9798
}
9899

99100
configure(consumer: MiddlewareConsumer) {
101+
consumer
102+
.apply(DummyAuthMiddleware)
103+
.exclude(...SERVER_CONFIG.excludeAuthRoutes)
104+
.forRoutes('*');
105+
100106
consumer
101107
.apply(ExcludeRouteMiddleware)
102108
.forRoutes(
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const API_PARAM_DATABASE_ID = 'dbInstance';
2+
export const API_PARAM_CLI_CLIENT_ID = 'uuid';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './redis-string';
2+
export * from './api';
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common';
2+
import { plainToClass } from 'class-transformer';
3+
import { ClientContext, ClientMetadata } from 'src/common/models';
4+
import { sessionFromRequestFactory } from 'src/common/decorators';
5+
import { Validator } from 'class-validator';
6+
import { API_PARAM_DATABASE_ID } from 'src/common/constants';
7+
8+
const validator = new Validator();
9+
10+
export interface IClientMetadataParamOptions {
11+
databaseIdParam?: string,
12+
uniqueIdParam?: string,
13+
context?: ClientContext,
14+
}
15+
16+
export const clientMetadataParamFactory = (
17+
options: IClientMetadataParamOptions,
18+
ctx: ExecutionContext,
19+
): ClientMetadata => {
20+
const opts: IClientMetadataParamOptions = {
21+
context: ClientContext.Common,
22+
databaseIdParam: API_PARAM_DATABASE_ID,
23+
...options,
24+
};
25+
26+
const req = ctx.switchToHttp().getRequest();
27+
28+
let databaseId;
29+
if (opts?.databaseIdParam) {
30+
databaseId = req.params?.[opts.databaseIdParam];
31+
}
32+
33+
let uniqueId;
34+
if (opts?.uniqueIdParam) {
35+
uniqueId = req.params?.[opts.uniqueIdParam];
36+
}
37+
38+
const clientMetadata = plainToClass(ClientMetadata, {
39+
session: sessionFromRequestFactory(undefined, ctx),
40+
databaseId,
41+
uniqueId,
42+
context: opts?.context || ClientContext.Common,
43+
});
44+
45+
const errors = validator.validateSync(clientMetadata, {
46+
whitelist: false, // we need this to allow additional fields if needed for flexibility
47+
});
48+
49+
if (errors?.length) {
50+
throw new BadRequestException(Object.values(errors[0].constraints) || 'Bad request');
51+
}
52+
53+
return clientMetadata;
54+
};
55+
56+
export const ClientMetadataParam = createParamDecorator(clientMetadataParamFactory);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './client-metadata.decorator';

0 commit comments

Comments
 (0)