Skip to content

Commit 3081882

Browse files
Merge branch 'main' into feature/RI-6160-Add-a-list-data-type-with-multiple-elements
# Conflicts: # tests/e2e/tests/web/regression/browser/list-key.e2e.ts
2 parents f2be7b3 + bb55035 commit 3081882

File tree

63 files changed

+4102
-1868
lines changed

Some content is hidden

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

63 files changed

+4102
-1868
lines changed

.circleci/config.yml

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ parameters:
213213
redis_client:
214214
type: string
215215
default: ""
216+
env:
217+
type: string
218+
default: "stage"
216219

217220
jobs:
218221
# Test jobs
@@ -1351,24 +1354,24 @@ workflows:
13511354
os: linux
13521355
target: << pipeline.parameters.linux >>
13531356
- setup-sign-certificates:
1354-
name: Setup sign certificates (stage)
1357+
name: Setup sign certificates (<< pipeline.parameters.env >>)
13551358
requires:
13561359
- Validating build parameters
13571360
- setup-build:
1358-
name: Setup build (stage)
1359-
env: stage
1361+
name: Setup build (<< pipeline.parameters.env >>)
1362+
env: << pipeline.parameters.env >>
13601363
requires:
1361-
- Setup sign certificates (stage)
1364+
- Setup sign certificates (<< pipeline.parameters.env >>)
13621365
- linux:
1363-
name: Build app - Linux (stage)
1364-
env: stage
1366+
name: Build app - Linux (<< pipeline.parameters.env >>)
1367+
env: << pipeline.parameters.env >>
13651368
target: << pipeline.parameters.linux >>
13661369
requires:
1367-
- Setup build (stage)
1370+
- Setup build (<< pipeline.parameters.env >>)
13681371
- store-build-artifacts:
1369-
name: Store build artifacts (stage)
1372+
name: Store build artifacts (<< pipeline.parameters.env >>)
13701373
requires:
1371-
- Build app - Linux (stage)
1374+
- Build app - Linux (<< pipeline.parameters.env >>)
13721375
manual-build-mac:
13731376
when: << pipeline.parameters.mac >>
13741377
jobs:
@@ -1377,25 +1380,25 @@ workflows:
13771380
os: mac
13781381
target: << pipeline.parameters.mac >>
13791382
- setup-sign-certificates:
1380-
name: Setup sign certificates (stage)
1383+
name: Setup sign certificates (<< pipeline.parameters.env >>)
13811384
requires:
13821385
- Validating build parameters
13831386
- setup-build:
1384-
name: Setup build (stage)
1385-
env: stage
1387+
name: Setup build (<< pipeline.parameters.env >>)
1388+
env: << pipeline.parameters.env >>
13861389
requires:
1387-
- Setup sign certificates (stage)
1390+
- Setup sign certificates (<< pipeline.parameters.env >>)
13881391
- macosx:
1389-
name: Build app - MacOS (stage)
1390-
env: stage
1392+
name: Build app - MacOS (<< pipeline.parameters.env >>)
1393+
env: << pipeline.parameters.env >>
13911394
redisstack: false
13921395
target: << pipeline.parameters.mac >>
13931396
requires:
1394-
- Setup build (stage)
1397+
- Setup build (<< pipeline.parameters.env >>)
13951398
- store-build-artifacts:
1396-
name: Store build artifacts (stage)
1399+
name: Store build artifacts (<< pipeline.parameters.env >>)
13971400
requires:
1398-
- Build app - MacOS (stage)
1401+
- Build app - MacOS (<< pipeline.parameters.env >>)
13991402
manual-build-windows:
14001403
when: << pipeline.parameters.windows >>
14011404
jobs:
@@ -1404,24 +1407,24 @@ workflows:
14041407
os: windows
14051408
target: << pipeline.parameters.windows >>
14061409
- setup-sign-certificates:
1407-
name: Setup sign certificates (stage)
1410+
name: Setup sign certificates (<< pipeline.parameters.env >>)
14081411
requires:
14091412
- Validating build parameters
14101413
- setup-build:
1411-
name: Setup build (stage)
1412-
env: stage
1414+
name: Setup build (<< pipeline.parameters.env >>)
1415+
env: << pipeline.parameters.env >>
14131416
requires:
1414-
- Setup sign certificates (stage)
1417+
- Setup sign certificates (<< pipeline.parameters.env >>)
14151418
- windows:
1416-
name: Build app - Windows (stage)
1417-
env: stage
1419+
name: Build app - Windows (<< pipeline.parameters.env >>)
1420+
env: << pipeline.parameters.env >>
14181421
target: << pipeline.parameters.windows >>
14191422
requires:
1420-
- Setup build (stage)
1423+
- Setup build (<< pipeline.parameters.env >>)
14211424
- store-build-artifacts:
1422-
name: Store build artifacts (stage)
1425+
name: Store build artifacts (<< pipeline.parameters.env >>)
14231426
requires:
1424-
- Build app - Windows (stage)
1427+
- Build app - Windows (<< pipeline.parameters.env >>)
14251428
manual-build-docker:
14261429
when: << pipeline.parameters.docker >>
14271430
jobs:
@@ -1430,22 +1433,22 @@ workflows:
14301433
os: docker
14311434
target: << pipeline.parameters.docker >>
14321435
- setup-sign-certificates:
1433-
name: Setup sign certificates (stage)
1436+
name: Setup sign certificates (<< pipeline.parameters.env >>)
14341437
requires:
14351438
- Validating build parameters
14361439
- setup-build:
1437-
name: Setup build (stage)
1438-
env: stage
1440+
name: Setup build (<< pipeline.parameters.env >>)
1441+
env: << pipeline.parameters.env >>
14391442
requires:
1440-
- Setup sign certificates (stage)
1443+
- Setup sign certificates (<< pipeline.parameters.env >>)
14411444
- docker:
1442-
name: Build docker images (stage)
1445+
name: Build docker images (<< pipeline.parameters.env >>)
14431446
requires:
1444-
- Setup build (stage)
1447+
- Setup build (<< pipeline.parameters.env >>)
14451448
- store-build-artifacts:
1446-
name: Store build artifacts (stage)
1449+
name: Store build artifacts (<< pipeline.parameters.env >>)
14471450
requires:
1448-
- Build docker images (stage)
1451+
- Build docker images (<< pipeline.parameters.env >>)
14491452

14501453
# build electron app (dev) from "build" branches
14511454
build:

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@
215215
"@elastic/eui": "34.6.0",
216216
"@reduxjs/toolkit": "^1.6.2",
217217
"@stablelib/snappy": "^1.0.2",
218-
"axios": "^1.6.0",
218+
"axios": "^1.7.4",
219219
"brotli-unicode": "^1.0.2",
220220
"buffer": "^6.0.3",
221221
"classnames": "^2.3.1",
@@ -266,7 +266,7 @@
266266
"remark-gfm": "^3.0.1",
267267
"remark-parse": "^10.0.1",
268268
"remark-rehype": "^10.0.1",
269-
"socket.io-client": "^4.4.0",
269+
"socket.io-client": "^4.8.0",
270270
"unified": "^10.1.1",
271271
"unist-util-visit": "^4.1.0",
272272
"url-parse": "^1.5.10",

redisinsight/api/package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,25 @@
4343
"nanoid": "^3.1.31",
4444
"word-wrap": "1.2.4",
4545
"mocha/minimatch": "^3.0.5",
46-
"@nestjs/platform-socket.io/socket.io": "^4.7.1",
46+
"@nestjs/platform-socket.io/socket.io": "^4.8.0",
4747
"**/semver": "^7.5.2",
4848
"winston-daily-rotate-file/**/file-stream-rotator": "^1.0.0"
4949
},
5050
"dependencies": {
5151
"@nestjs/common": "^10.3.7",
5252
"@nestjs/core": "^10.3.7",
5353
"@nestjs/event-emitter": "^2.0.4",
54-
"@nestjs/platform-express": "^10.3.7",
55-
"@nestjs/platform-socket.io": "^10.3.7",
54+
"@nestjs/platform-express": "^10.4.4",
55+
"@nestjs/platform-socket.io": "^10.4.4",
5656
"@nestjs/serve-static": "^3.0.0",
5757
"@nestjs/swagger": "^7.3.1",
5858
"@nestjs/typeorm": "^9.0.1",
5959
"@nestjs/websockets": "^10.3.7",
6060
"@okta/okta-auth-js": "^7.3.0",
61-
"@segment/analytics-node": "^2.1.2",
61+
"@segment/analytics-node": "^2.1.3",
6262
"adm-zip": "^0.5.9",
63-
"axios": "^1.6.0",
64-
"body-parser": "^1.19.0",
63+
"axios": "^1.7.4",
64+
"body-parser": "^1.20.3",
6565
"busboy": "^1.6.0",
6666
"class-transformer": "^0.2.3",
6767
"class-validator": "^0.14.0",
@@ -70,7 +70,7 @@
7070
"date-fns": "^2.29.3",
7171
"detect-port": "^1.5.1",
7272
"dotenv": "^16.0.0",
73-
"express": "^4.19.2",
73+
"express": "^4.21.0",
7474
"fs-extra": "^10.0.0",
7575
"ioredis": "^5.2.2",
7676
"is-glob": "^4.0.1",
@@ -84,8 +84,8 @@
8484
"redis": "^4.6.10",
8585
"reflect-metadata": "^0.1.13",
8686
"rxjs": "^7.5.6",
87-
"socket.io": "^4.6.2",
88-
"socket.io-client": "^4.7.5",
87+
"socket.io": "^4.8.0",
88+
"socket.io-client": "^4.8.0",
8989
"source-map-support": "^0.5.19",
9090
"sqlite3": "5.1.7",
9191
"swagger-ui-express": "^4.1.4",

redisinsight/api/src/__mocks__/common.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export type MockType<T> = {
99

1010
export const mockQueryBuilderWhere = jest.fn().mockReturnThis();
1111
export const mockQueryBuilderSelect = jest.fn().mockReturnThis();
12+
export const mockQueryBuilderLeftJoinAndSelect = jest.fn().mockReturnThis();
1213
export const mockQueryBuilderGetOne = jest.fn();
1314
export const mockQueryBuilderGetMany = jest.fn();
1415
export const mockQueryBuilderGetManyRaw = jest.fn();
@@ -26,7 +27,7 @@ export const mockCreateQueryBuilder = jest.fn(() => ({
2627
having: jest.fn().mockReturnThis(),
2728
limit: jest.fn().mockReturnThis(),
2829
leftJoin: jest.fn().mockReturnThis(),
29-
leftJoinAndSelect: jest.fn().mockReturnThis(),
30+
leftJoinAndSelect: mockQueryBuilderLeftJoinAndSelect,
3031
offset: jest.fn().mockReturnThis(),
3132
delete: jest.fn().mockReturnThis(),
3233
whereInIds: jest.fn().mockReturnThis(),

redisinsight/api/src/modules/certificate/ca-certificate.service.spec.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import {
55
mockCaCertificate,
66
mockCaCertificateRepository, mockCreateCaCertificateDto,
77
MockType,
8+
mockRedisClientStorage,
89
} from 'src/__mocks__';
910
import { CaCertificateRepository } from 'src/modules/certificate/repositories/ca-certificate.repository';
11+
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1012
import { pick } from 'lodash';
1113
import { KeytarEncryptionErrorException } from 'src/modules/encryption/exceptions';
1214
import { CaCertificateService } from './ca-certificate.service';
@@ -24,6 +26,10 @@ describe('CaCertificateService', () => {
2426
provide: CaCertificateRepository,
2527
useFactory: mockCaCertificateRepository,
2628
},
29+
{
30+
provide: RedisClientStorage,
31+
useFactory: mockRedisClientStorage,
32+
},
2733
],
2834
}).compile();
2935

@@ -87,9 +93,26 @@ describe('CaCertificateService', () => {
8793
});
8894

8995
describe('delete', () => {
90-
it('should delete ca certificate', async () => {
91-
expect(await service.delete(mockCaCertificate.id)).toEqual(undefined);
96+
const mockId = 'mock-ca-cert-id';
97+
const mockAffectedDatabases = ['db1', 'db2'];
98+
99+
beforeEach(() => {
100+
jest.clearAllMocks();
101+
});
102+
103+
it('should delete CA certificate and remove affected database clients', async () => {
104+
jest.spyOn(repository, 'delete').mockResolvedValue({ affectedDatabases: mockAffectedDatabases });
105+
jest.spyOn(service['redisClientStorage'], 'removeManyByMetadata').mockResolvedValue(undefined);
106+
107+
await service.delete(mockId);
108+
109+
expect(repository.delete).toHaveBeenCalledWith(mockId);
110+
expect(service['redisClientStorage'].removeManyByMetadata).toHaveBeenCalledTimes(mockAffectedDatabases.length);
111+
mockAffectedDatabases.forEach((databaseId) => {
112+
expect(service['redisClientStorage'].removeManyByMetadata).toHaveBeenCalledWith({ databaseId });
113+
});
92114
});
115+
93116
it('should throw encryption error', async () => {
94117
repository.delete.mockRejectedValueOnce(new KeytarEncryptionErrorException());
95118

redisinsight/api/src/modules/certificate/ca-certificate.service.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import { CaCertificateRepository } from 'src/modules/certificate/repositories/ca
1212
import { CaCertificate } from 'src/modules/certificate/models/ca-certificate';
1313
import { CreateCaCertificateDto } from 'src/modules/certificate/dto/create.ca-certificate.dto';
1414
import { classToClass } from 'src/utils';
15+
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1516

1617
@Injectable()
1718
export class CaCertificateService {
1819
private logger = new Logger('CaCertificateService');
1920

2021
constructor(
2122
private readonly repository: CaCertificateRepository,
23+
private redisClientStorage: RedisClientStorage,
2224
) {}
2325

2426
async get(id: string): Promise<CaCertificate> {
@@ -56,10 +58,13 @@ export class CaCertificateService {
5658
}
5759

5860
async delete(id: string): Promise<void> {
59-
this.logger.log(`Deleting certificate. id: ${id}`);
60-
6161
try {
62-
await this.repository.delete(id);
62+
const { affectedDatabases } = await this.repository.delete(id);
63+
64+
await Promise.all(affectedDatabases.map(async (databaseId) => {
65+
// If the certificate is used by the database, remove the client
66+
await this.redisClientStorage.removeManyByMetadata({ databaseId });
67+
}));
6368
} catch (error) {
6469
this.logger.error(`Failed to delete certificate ${id}`, error);
6570

redisinsight/api/src/modules/certificate/client-certificate.service.spec.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import {
66
mockClientCertificate,
77
mockClientCertificateRepository, mockCreateClientCertificateDto,
88
MockType,
9+
mockRedisClientStorage,
910
} from 'src/__mocks__';
1011
import { KeytarEncryptionErrorException } from 'src/modules/encryption/exceptions';
1112
import { ClientCertificateService } from 'src/modules/certificate/client-certificate.service';
1213
import { ClientCertificateRepository } from 'src/modules/certificate/repositories/client-certificate.repository';
14+
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1315

1416
describe('ClientCertificateService', () => {
1517
let service: ClientCertificateService;
@@ -24,6 +26,10 @@ describe('ClientCertificateService', () => {
2426
provide: ClientCertificateRepository,
2527
useFactory: mockClientCertificateRepository,
2628
},
29+
{
30+
provide: RedisClientStorage,
31+
useFactory: mockRedisClientStorage,
32+
},
2733
],
2834
}).compile();
2935

@@ -87,9 +93,26 @@ describe('ClientCertificateService', () => {
8793
});
8894

8995
describe('delete', () => {
90-
it('should delete client certificate', async () => {
91-
expect(await service.delete(mockClientCertificate.id)).toEqual(undefined);
96+
const mockId = 'mock-client-cert-id';
97+
const mockAffectedDatabases = ['db1', 'db2'];
98+
99+
beforeEach(() => {
100+
jest.clearAllMocks();
101+
});
102+
103+
it('should delete client certificate and remove affected database clients', async () => {
104+
jest.spyOn(repository, 'delete').mockResolvedValue({ affectedDatabases: mockAffectedDatabases });
105+
jest.spyOn(service['redisClientStorage'], 'removeManyByMetadata').mockResolvedValue(undefined);
106+
107+
await service.delete(mockId);
108+
109+
expect(repository.delete).toHaveBeenCalledWith(mockId);
110+
expect(service['redisClientStorage'].removeManyByMetadata).toHaveBeenCalledTimes(mockAffectedDatabases.length);
111+
mockAffectedDatabases.forEach((databaseId) => {
112+
expect(service['redisClientStorage'].removeManyByMetadata).toHaveBeenCalledWith({ databaseId });
113+
});
92114
});
115+
93116
it('should throw encryption error', async () => {
94117
repository.delete.mockRejectedValueOnce(new KeytarEncryptionErrorException());
95118

redisinsight/api/src/modules/certificate/client-certificate.service.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import { ClientCertificateRepository } from 'src/modules/certificate/repositorie
1212
import { ClientCertificate } from 'src/modules/certificate/models/client-certificate';
1313
import { CreateClientCertificateDto } from 'src/modules/certificate/dto/create.client-certificate.dto';
1414
import { classToClass } from 'src/utils';
15+
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1516

1617
@Injectable()
1718
export class ClientCertificateService {
1819
private logger = new Logger('ClientCertificateService');
1920

2021
constructor(
2122
private readonly repository: ClientCertificateRepository,
23+
private redisClientStorage: RedisClientStorage,
2224
) {}
2325

2426
/**
@@ -67,7 +69,12 @@ export class ClientCertificateService {
6769
this.logger.log(`Deleting client certificate. id: ${id}`);
6870

6971
try {
70-
await this.repository.delete(id);
72+
const { affectedDatabases } = await this.repository.delete(id);
73+
74+
await Promise.all(affectedDatabases.map(async (databaseId) => {
75+
// If the certificate is used by the database, remove the client
76+
await this.redisClientStorage.removeManyByMetadata({ databaseId });
77+
}));
7178
} catch (error) {
7279
this.logger.error(`Failed to delete certificate ${id}`, error);
7380

0 commit comments

Comments
 (0)