Skip to content

Commit 0d1a439

Browse files
author
Artem
committed
Merge branch 'feature/RI-3637_databases-import' into feature/RI-3853-database_import_results
# Conflicts: # redisinsight/api/src/modules/database-import/database-import.service.ts
2 parents b774c0f + 4258ede commit 0d1a439

File tree

180 files changed

+3354
-2832
lines changed

Some content is hidden

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

180 files changed

+3354
-2832
lines changed

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,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class databaseNew1670252337342 implements MigrationInterface {
4+
name = 'databaseNew1670252337342'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`CREATE TABLE "temporary_database_instance" ("id" varchar PRIMARY KEY NOT NULL, "host" varchar NOT NULL, "port" integer NOT NULL, "name" varchar NOT NULL, "username" varchar, "password" varchar, "tls" boolean, "verifyServerCert" boolean, "lastConnection" datetime, "caCertId" varchar, "clientCertId" varchar, "connectionType" varchar NOT NULL DEFAULT ('STANDALONE'), "nodes" varchar DEFAULT ('[]'), "nameFromProvider" varchar, "sentinelMasterName" varchar, "sentinelMasterUsername" varchar, "sentinelMasterPassword" varchar, "provider" varchar DEFAULT ('UNKNOWN'), "modules" varchar NOT NULL DEFAULT ('[]'), "db" integer, "encryption" varchar, "tlsServername" varchar, "new" boolean, CONSTRAINT "FK_3b9b625266c00feb2d66a9f36e4" FOREIGN KEY ("clientCertId") REFERENCES "client_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_d1bc747b5938e22b4b708d8e9a5" FOREIGN KEY ("caCertId") REFERENCES "ca_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION)`);
8+
await queryRunner.query(`INSERT INTO "temporary_database_instance"("id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername") SELECT "id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername" FROM "database_instance"`);
9+
await queryRunner.query(`DROP TABLE "database_instance"`);
10+
await queryRunner.query(`ALTER TABLE "temporary_database_instance" RENAME TO "database_instance"`);
11+
}
12+
13+
public async down(queryRunner: QueryRunner): Promise<void> {
14+
await queryRunner.query(`ALTER TABLE "database_instance" RENAME TO "temporary_database_instance"`);
15+
await queryRunner.query(`CREATE TABLE "database_instance" ("id" varchar PRIMARY KEY NOT NULL, "host" varchar NOT NULL, "port" integer NOT NULL, "name" varchar NOT NULL, "username" varchar, "password" varchar, "tls" boolean, "verifyServerCert" boolean, "lastConnection" datetime, "caCertId" varchar, "clientCertId" varchar, "connectionType" varchar NOT NULL DEFAULT ('STANDALONE'), "nodes" varchar DEFAULT ('[]'), "nameFromProvider" varchar, "sentinelMasterName" varchar, "sentinelMasterUsername" varchar, "sentinelMasterPassword" varchar, "provider" varchar DEFAULT ('UNKNOWN'), "modules" varchar NOT NULL DEFAULT ('[]'), "db" integer, "encryption" varchar, "tlsServername" varchar, CONSTRAINT "FK_3b9b625266c00feb2d66a9f36e4" FOREIGN KEY ("clientCertId") REFERENCES "client_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_d1bc747b5938e22b4b708d8e9a5" FOREIGN KEY ("caCertId") REFERENCES "ca_certificate" ("id") ON DELETE SET NULL ON UPDATE NO ACTION)`);
16+
await queryRunner.query(`INSERT INTO "database_instance"("id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername") SELECT "id", "host", "port", "name", "username", "password", "tls", "verifyServerCert", "lastConnection", "caCertId", "clientCertId", "connectionType", "nodes", "nameFromProvider", "sentinelMasterName", "sentinelMasterUsername", "sentinelMasterPassword", "provider", "modules", "db", "encryption", "tlsServername" FROM "temporary_database_instance"`);
17+
await queryRunner.query(`DROP TABLE "temporary_database_instance"`);
18+
}
19+
20+
}

redisinsight/api/migration/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { databaseAnalysis1664785208236 } from './1664785208236-database-analysis
2121
import { databaseAnalysisExpirationGroups1664886479051 } from './1664886479051-database-analysis-expiration-groups';
2222
import { workbenchExecutionTime1667368983699 } from './1667368983699-workbench-execution-time';
2323
import { database1667477693934 } from './1667477693934-database';
24+
import { databaseNew1670252337342 } from './1670252337342-database-new';
2425

2526
export default [
2627
initialMigration1614164490968,
@@ -46,4 +47,5 @@ export default [
4647
databaseAnalysisExpirationGroups1664886479051,
4748
workbenchExecutionTime1667368983699,
4849
database1667477693934,
50+
databaseNew1670252337342,
4951
];

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: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ 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';
11+
import { ClientContext, ClientMetadata } from 'src/common/models';
1312

1413
export const mockDatabaseId = 'a77b23c1-7816-4ea4-b61f-d37795a0f805-db-id';
1514

@@ -27,6 +26,7 @@ export const mockDatabase = Object.assign(new Database(), {
2726
host: '127.0.100.1',
2827
port: 6379,
2928
connectionType: ConnectionType.STANDALONE,
29+
new: false,
3030
});
3131

3232
export const mockDatabaseEntity = Object.assign(new DatabaseEntity(), {
@@ -115,9 +115,15 @@ export const mockClusterDatabaseWithTlsAuthEntity = Object.assign(new DatabaseEn
115115
nodes: JSON.stringify(mockClusterNodes),
116116
});
117117

118+
export const mockNewDatabase = Object.assign(new Database(), {
119+
...mockDatabase,
120+
new: true,
121+
});
122+
118123
export const mockClientMetadata: ClientMetadata = {
124+
session: undefined,
119125
databaseId: mockDatabase.id,
120-
namespace: AppTool.Common,
126+
context: ClientContext.Common,
121127
};
122128

123129
export const mockDatabaseOverview: DatabaseOverview = {

redisinsight/api/src/app.module.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { LocalDatabaseModule } from 'src/local-database.module';
2020
import { CoreModule } from 'src/core.module';
2121
import { AutodiscoveryModule } from 'src/modules/autodiscovery/autodiscovery.module';
2222
import { DatabaseImportModule } from 'src/modules/database-import/database-import.module';
23+
import { DummyAuthMiddleware } from 'src/common/middlewares/dummy-auth.middleware';
2324
import { BrowserModule } from './modules/browser/browser.module';
2425
import { RedisEnterpriseModule } from './modules/redis-enterprise/redis-enterprise.module';
2526
import { RedisSentinelModule } from './modules/redis-sentinel/redis-sentinel.module';
@@ -99,6 +100,11 @@ export class AppModule implements OnModuleInit, NestModule {
99100
}
100101

101102
configure(consumer: MiddlewareConsumer) {
103+
consumer
104+
.apply(DummyAuthMiddleware)
105+
.exclude(...SERVER_CONFIG.excludeAuthRoutes)
106+
.forRoutes('*');
107+
102108
consumer
103109
.apply(ExcludeRouteMiddleware)
104110
.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)