Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
22c4fa1
#RI-3780 databases import. BE base implementation
Nov 8, 2022
f68f3eb
Merge branch 'feature/RI-3238/prepare_for_docker' into feature/RI-363…
Nov 8, 2022
97417a1
Change cluster connection + add data validation
Nov 9, 2022
9c7ce93
Merge branch 'feature/RI-3238/prepare_for_docker' into feature/RI-363…
rsergeenko Nov 9, 2022
3e168fe
finilize + Itests
Nov 10, 2022
ebde0a5
#RI-3779 - add import db connections
rsergeenko Nov 14, 2022
a3a2636
Merge pull request #1391 from RedisInsight/fe/feature/RI-3637_databas…
rsergeenko Nov 14, 2022
b4b6f64
Merge branch 'feature/RI-3238/prepare_for_docker' into feature/RI-363…
Nov 14, 2022
7bd548f
Merge branch 'feature/RI-3238/prepare_for_docker' into feature/RI-363…
Nov 14, 2022
ce231de
Fix validation + add telemetry
Nov 14, 2022
5eae362
Merge branch 'feature/RI-3238/prepare_for_docker' into feature/RI-363…
Nov 16, 2022
aec6614
#RI-3817 improve port validation + add UTests
Nov 16, 2022
9661ccb
fix max port validation
Nov 16, 2022
775325a
add tests for databases import
vlad-dargel Nov 16, 2022
a984c4d
Revert "add tests for databases import"
vlad-dargel Nov 16, 2022
dbe45df
upd
vlad-dargel Nov 16, 2022
a6a45d7
Merge branch 'feature/RI-3637_databases-import' into e2e/feature/RI-3…
vlad-dargel Nov 16, 2022
3fc1872
fix
vlad-dargel Nov 17, 2022
aa9bd15
add test for remove file
vlad-dargel Nov 17, 2022
000a632
#RI-3852 - update text
rsergeenko Nov 18, 2022
4be338b
fixes by comments
vlad-dargel Nov 18, 2022
294d730
Merge pull request #1405 from RedisInsight/e2e/feature/RI-3637_databa…
vlad-dargel Nov 21, 2022
4f4b62b
Merge branch 'main' into feature/RI-3637_databases-import
rsergeenko Dec 2, 2022
f945ff1
#RI-3902 import result with statuses
Dec 5, 2022
84cea2b
#RI-3902 add transformers for host, port fields + add tests (resolve …
Dec 5, 2022
937e343
#RI-3219 - [BE] Indicate new connections
egor-zalenski Dec 6, 2022
1cce58a
#RI-3219 - Indicate new connections
egor-zalenski Dec 6, 2022
6272645
#RI-3219 - Integration tests
egor-zalenski Dec 6, 2022
5cb450c
#RI-3219 - Integration tests
egor-zalenski Dec 6, 2022
501bbe1
#RI-3219 - Integration tests
egor-zalenski Dec 6, 2022
0d3b83f
fix pr comments
egor-zalenski Dec 7, 2022
7792eea
fix pr comments
egor-zalenski Dec 7, 2022
882ce86
Merge pull request #1482 from RedisInsight/fe/feature/RI-3219_Indicat…
egor-zalenski Dec 7, 2022
4d3e4eb
#RI-3854 - add features highlighting, add highlighting for import dat…
rsergeenko Dec 7, 2022
990cb90
#RI-3854 - remove page from build_features config
rsergeenko Dec 7, 2022
e59eb82
Merge pull request #1481 from RedisInsight/be/feature/RI-3219_Indicat…
egor-zalenski Dec 7, 2022
cb816e1
#RI-3854 - fix pr comments
rsergeenko Dec 8, 2022
b83fd5f
#RI-3902 rework errors to return
Dec 8, 2022
b774c0f
Merge pull request #1479 from RedisInsight/be/feature/RI-3902-import-…
Dec 8, 2022
d7e7024
Initial Commit
nmammadli Dec 8, 2022
f96392b
#RI-3728 - Base BE implementation. Import certs by plain values
Dec 12, 2022
85ae014
Merge pull request #1484 from RedisInsight/fe/feature/RI-3854_highlig…
vlad-dargel Dec 12, 2022
f3fe413
Implement feedback from comments
nmammadli Dec 13, 2022
f4c46ed
After eslint
nmammadli Dec 13, 2022
7b89ce1
#RI-3903 - add imports results
rsergeenko Dec 13, 2022
0ce880f
update for re cloud
vlad-dargel Dec 13, 2022
e87480d
moved verifyDatabaseStatusIsVisible() from browser page object to my …
vlad-dargel Dec 13, 2022
94de3e9
deleted unused import
vlad-dargel Dec 13, 2022
280365b
Merge pull request #1495 from RedisInsight/e2e/feature/RI-3219_new_co…
nmammadli Dec 14, 2022
ae311f7
Merge pull request #1489 from RedisInsight/feature/RI-3219_New_connec…
nmammadli Dec 14, 2022
6897aa0
Merge branch 'main' into feature/RI-3637_databases-import
Dec 14, 2022
4258ede
resolve merge conflicts
Dec 14, 2022
0d1a439
Merge branch 'feature/RI-3637_databases-import' into feature/RI-3853-…
Dec 14, 2022
c09f6d9
resolve merge conflicts
Dec 14, 2022
65fbe73
resolve merge conflicts
Dec 14, 2022
6f8868f
temporary run all tests
Dec 14, 2022
2e9856f
#RI-3903 - add tests, ui changes
rsergeenko Dec 14, 2022
ddb6ebd
#RI-3903 - fix tests
rsergeenko Dec 14, 2022
51cd240
Merge pull request #1500 from RedisInsight/fe/feature/RI-3903_db-impo…
rsergeenko Dec 14, 2022
b02beea
rollback CircleCI configs + fix PR comments + fix bug when unable to …
Dec 14, 2022
fdbce72
Merge pull request #1497 from RedisInsight/be/feature/RI-3728-import_…
Dec 14, 2022
3354934
Merge pull request #1492 from RedisInsight/feature/RI-3853-database_i…
Dec 14, 2022
8857266
Merge branch 'main' into feature/RI-3637_databases-import
Dec 14, 2022
73920f6
Merge branch 'feature/RI-3637_databases-import' into feature/RI-3728-…
Dec 14, 2022
9e3444d
resolve conflicts. again...
Dec 14, 2022
b108983
Merge pull request #1502 from RedisInsight/feature/RI-3728-import_cer…
Dec 14, 2022
feebb52
#RI-3938 - fix modal width, add ":"
rsergeenko Dec 15, 2022
753342c
#RI-3938 - fix pr comments
rsergeenko Dec 15, 2022
78b36fc
Merge pull request #1507 from RedisInsight/fe/bugfix/RI-3938
rsergeenko Dec 15, 2022
7f36cda
#RI-3940 - When we edit db name, we are getting "new indicator"
egor-zalenski Dec 15, 2022
d0d6f47
Merge pull request #1508 from RedisInsight/be/bugfix/RI-3940_Indicato…
egor-zalenski Dec 15, 2022
017af2c
add test file with certificates to import
vlad-dargel Dec 16, 2022
77bc5db
added tests for show process results for importeed databases
vlad-dargel Dec 16, 2022
25e1e92
all tests
Dec 19, 2022
565c501
fix failed test
Dec 19, 2022
9d79406
Merge pull request #1513 from RedisInsight/be/feature/3637-database-i…
Dec 19, 2022
bd606ed
Merge branch 'feature/RI-3637_databases-import' into e2e/feature/RI-3…
vlad-dargel Dec 19, 2022
09e98fe
updates for test-data folder structure
vlad-dargel Dec 19, 2022
da974af
Merge pull request #1511 from RedisInsight/e2e/feature/RI-3853_Show-p…
vlad-dargel Dec 19, 2022
33a5553
added tests for certificates
vlad-dargel Dec 20, 2022
ad7cde6
tests for import sertificates
vlad-dargel Dec 20, 2022
3b2af69
pr fix
vlad-dargel Dec 20, 2022
b5b4045
add connection to sentinel
vlad-dargel Dec 20, 2022
cb30d5e
possible solution for editing databases
Dec 20, 2022
c7e5106
fix tests
Dec 20, 2022
8b52a36
Merge pull request #1523 from RedisInsight/bugfix/RI-3954-unable_to_d…
vlad-dargel Dec 21, 2022
f43e062
Merge pull request #1522 from RedisInsight/e2e/feature/Import-certifi…
vlad-dargel Dec 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions redisinsight/api/config/stack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default {
excludeRoutes: [
'redis-enterprise/*',
'redis-sentinel/*',
{ path: 'databases/import' },
{ path: 'databases', method: RequestMethod.POST },
{ path: 'databases', method: RequestMethod.DELETE },
{ path: 'databases/:id', method: RequestMethod.DELETE },
Expand Down
20 changes: 20 additions & 0 deletions redisinsight/api/migration/1670252337342-database-new.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { MigrationInterface, QueryRunner } from "typeorm";

export class databaseNew1670252337342 implements MigrationInterface {
name = 'databaseNew1670252337342'

public async up(queryRunner: QueryRunner): Promise<void> {
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)`);
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"`);
await queryRunner.query(`DROP TABLE "database_instance"`);
await queryRunner.query(`ALTER TABLE "temporary_database_instance" RENAME TO "database_instance"`);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "database_instance" RENAME TO "temporary_database_instance"`);
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)`);
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"`);
await queryRunner.query(`DROP TABLE "temporary_database_instance"`);
}

}
2 changes: 2 additions & 0 deletions redisinsight/api/migration/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { databaseAnalysis1664785208236 } from './1664785208236-database-analysis
import { databaseAnalysisExpirationGroups1664886479051 } from './1664886479051-database-analysis-expiration-groups';
import { workbenchExecutionTime1667368983699 } from './1667368983699-workbench-execution-time';
import { database1667477693934 } from './1667477693934-database';
import { databaseNew1670252337342 } from './1670252337342-database-new';

export default [
initialMigration1614164490968,
Expand All @@ -46,4 +47,5 @@ export default [
databaseAnalysisExpirationGroups1664886479051,
workbenchExecutionTime1667368983699,
database1667477693934,
databaseNew1670252337342,
];
1 change: 1 addition & 0 deletions redisinsight/api/src/__mocks__/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export const mockQueryBuilderExecute = jest.fn();
export const mockCreateQueryBuilder = jest.fn(() => ({
// where: jest.fn().mockReturnThis(),
where: mockQueryBuilderWhere,
orWhere: mockQueryBuilderWhere,
update: jest.fn().mockReturnThis(),
select: jest.fn().mockReturnThis(),
set: jest.fn().mockReturnThis(),
Expand Down
89 changes: 89 additions & 0 deletions redisinsight/api/src/__mocks__/database-import.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { DatabaseImportResponse, DatabaseImportStatus } from 'src/modules/database-import/dto/database-import.response';
import { BadRequestException, ForbiddenException } from '@nestjs/common';
import { mockDatabase, mockSentinelDatabaseWithTlsAuth } from 'src/__mocks__/databases';
import { ValidationException } from 'src/common/exceptions';
import { mockCaCertificate, mockClientCertificate } from 'src/__mocks__/certificates';
import {
InvalidCaCertificateBodyException, InvalidCertificateNameException,
} from 'src/modules/database-import/exceptions';

export const mockDatabasesToImportArray = new Array(10).fill(mockSentinelDatabaseWithTlsAuth);

export const mockDatabaseImportFile = {
originalname: 'filename.json',
mimetype: 'application/json',
size: 1,
buffer: Buffer.from(JSON.stringify(mockDatabasesToImportArray)),
};

export const mockDatabaseImportResultSuccess = {
index: 0,
status: DatabaseImportStatus.Success,
host: mockDatabase.host,
port: mockDatabase.port,
};

export const mockDatabaseImportResultFail = {
index: 0,
status: DatabaseImportStatus.Fail,
host: mockDatabase.host,
port: mockDatabase.port,
errors: [new BadRequestException()],
};

export const mockDatabaseImportResultPartial = {
index: 0,
status: DatabaseImportStatus.Partial,
host: mockDatabase.host,
port: mockDatabase.port,
errors: [new InvalidCaCertificateBodyException()],
};

export const mockDatabaseImportResponse = Object.assign(new DatabaseImportResponse(), {
total: 10,
success: (new Array(5).fill(mockDatabaseImportResultSuccess)).map((v, index) => ({
...v,
index: index + 5,
})),
partial: [
[new InvalidCaCertificateBodyException(), new InvalidCertificateNameException()],
[new InvalidCertificateNameException()],
].map((errors, index) => ({
...mockDatabaseImportResultPartial,
index: index + 3,
errors,
})),
fail: [
new ValidationException('Bad request'),
new BadRequestException(),
new ForbiddenException(),
].map((error, index) => ({
...mockDatabaseImportResultFail,
index,
errors: [error],
})),
});

export const mockDatabaseImportPartialAnalyticsPayload = {
partially: mockDatabaseImportResponse.partial.length,
errors: ['InvalidCaCertificateBodyException', 'InvalidCertificateNameException'],
};

export const mockDatabaseImportFailedAnalyticsPayload = {
failed: mockDatabaseImportResponse.fail.length,
errors: ['ValidationException', 'BadRequestException', 'ForbiddenException'],
};

export const mockDatabaseImportSucceededAnalyticsPayload = {
succeed: mockDatabaseImportResponse.success.length,
};

export const mockDatabaseImportAnalytics = jest.fn(() => ({
sendImportResults: jest.fn(),
sendImportFailed: jest.fn(),
}));

export const mockCertificateImportService = jest.fn(() => ({
processCaCertificate: jest.fn().mockResolvedValue(mockCaCertificate),
processClientCertificate: jest.fn().mockResolvedValue(mockClientCertificate),
}));
13 changes: 13 additions & 0 deletions redisinsight/api/src/__mocks__/databases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { mockSentinelMasterDto } from 'src/__mocks__/redis-sentinel';
import { pick } from 'lodash';
import { RedisDatabaseInfoResponse } from 'src/modules/database/dto/redis-info.dto';
import { DatabaseOverview } from 'src/modules/database/models/database-overview';
import { ClientContext, ClientMetadata } from 'src/common/models';

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

Expand All @@ -25,6 +26,7 @@ export const mockDatabase = Object.assign(new Database(), {
host: '127.0.100.1',
port: 6379,
connectionType: ConnectionType.STANDALONE,
new: false,
});

export const mockDatabaseEntity = Object.assign(new DatabaseEntity(), {
Expand Down Expand Up @@ -113,6 +115,17 @@ export const mockClusterDatabaseWithTlsAuthEntity = Object.assign(new DatabaseEn
nodes: JSON.stringify(mockClusterNodes),
});

export const mockNewDatabase = Object.assign(new Database(), {
...mockDatabase,
new: true,
});

export const mockClientMetadata: ClientMetadata = {
session: undefined,
databaseId: mockDatabase.id,
context: ClientContext.Common,
};

export const mockDatabaseOverview: DatabaseOverview = {
version: '6.2.4',
usedMemory: 1,
Expand Down
1 change: 1 addition & 0 deletions redisinsight/api/src/__mocks__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ export * from './redis';
export * from './server';
export * from './redis-enterprise';
export * from './redis-sentinel';
export * from './database-import';
2 changes: 2 additions & 0 deletions redisinsight/api/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { ServerModule } from 'src/modules/server/server.module';
import { LocalDatabaseModule } from 'src/local-database.module';
import { CoreModule } from 'src/core.module';
import { AutodiscoveryModule } from 'src/modules/autodiscovery/autodiscovery.module';
import { DatabaseImportModule } from 'src/modules/database-import/database-import.module';
import { DummyAuthMiddleware } from 'src/common/middlewares/dummy-auth.middleware';
import { BrowserModule } from './modules/browser/browser.module';
import { RedisEnterpriseModule } from './modules/redis-enterprise/redis-enterprise.module';
Expand Down Expand Up @@ -53,6 +54,7 @@ const PATH_CONFIG = config.get('dir_path');
BulkActionsModule,
ClusterMonitorModule,
DatabaseAnalysisModule,
DatabaseImportModule,
...(SERVER_CONFIG.staticContent
? [
ServeStaticModule.forRoot({
Expand Down
1 change: 1 addition & 0 deletions redisinsight/api/src/common/exceptions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './validation.exception';
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { BadRequestException } from '@nestjs/common';

export class ValidationException extends BadRequestException {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { parse } from 'path';
import { readFileSync } from 'fs';

export const isValidPemCertificate = (cert: string): boolean => cert.startsWith('-----BEGIN CERTIFICATE-----');
export const isValidPemPrivateKey = (cert: string): boolean => cert.startsWith('-----BEGIN PRIVATE KEY-----');
export const getPemBodyFromFileSync = (path: string): string => readFileSync(path).toString('utf8');
export const getCertNameFromFilename = (path: string): string => parse(path).name;
1 change: 1 addition & 0 deletions redisinsight/api/src/common/utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './certificate-import.util';
4 changes: 4 additions & 0 deletions redisinsight/api/src/constants/error-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ export default {
INCORRECT_CREDENTIALS: (url) => `Could not connect to ${url}, please check the Username or Password.`,

CA_CERT_EXIST: 'This ca certificate name is already in use.',
INVALID_CA_BODY: 'Invalid CA body',
INVALID_CERTIFICATE_BODY: 'Invalid certificate body',
INVALID_PRIVATE_KEY: 'Invalid private key',
CERTIFICATE_NAME_IS_NOT_DEFINED: 'Certificate name is not defined',
CLIENT_CERT_EXIST: 'This client certificate name is already in use.',
INVALID_CERTIFICATE_ID: 'Invalid certificate id.',
SENTINEL_MASTER_NAME_REQUIRED: 'Sentinel master name must be specified.',
Expand Down
6 changes: 6 additions & 0 deletions redisinsight/api/src/constants/telemetry-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ export enum TelemetryEvents {
RedisInstanceConnectionFailed = 'DATABASE_CONNECTION_FAILED',
RedisInstanceListReceived = 'CONFIG_DATABASES_DATABASE_LIST_DISPLAYED',

// Databases import
DatabaseImportParseFailed = 'CONFIG_DATABASES_REDIS_IMPORT_PARSE_FAILED',
DatabaseImportFailed = 'CONFIG_DATABASES_REDIS_IMPORT_FAILED',
DatabaseImportSucceeded = 'CONFIG_DATABASES_REDIS_IMPORT_SUCCEEDED',
DatabaseImportPartiallySucceeded = 'CONFIG_DATABASES_REDIS_IMPORT_PARTIALLY_SUCCEEDED',

// Events for autodiscovery flows
REClusterDiscoverySucceed = 'CONFIG_DATABASES_RE_CLUSTER_AUTODISCOVERY_SUCCEEDED',
REClusterDiscoveryFailed = 'CONFIG_DATABASES_RE_CLUSTER_AUTODISCOVERY_FAILED',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import {
mockRepository,
MockType,
} from 'src/__mocks__';
import { LocalCaCertificateRepository } from 'src/modules/certificate/repositories/local.ca-certificate.repository';
import { EncryptionService } from 'src/modules/encryption/encryption.service';
import { BadRequestException, NotFoundException } from '@nestjs/common';
import ERROR_MESSAGES from 'src/constants/error-messages';
Expand Down
Loading