Skip to content

Commit e0dd096

Browse files
rework bugfix to be more performant and compatible with other app parts
1 parent 3abc70e commit e0dd096

8 files changed

+44
-38
lines changed

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import {
1414
} from '@nestjs/swagger';
1515
import { CaCertificate } from 'src/modules/certificate/models/ca-certificate';
1616
import { CaCertificateService } from 'src/modules/certificate/ca-certificate.service';
17-
import { RequestSessionMetadata } from 'src/common/decorators';
18-
import { SessionMetadata } from 'src/common/models';
1917

2018
@ApiTags('TLS Certificates')
2119
@Controller('certificates/ca')
@@ -41,9 +39,8 @@ export class CaCertificateController {
4139
@ApiOperation({ description: 'Delete Ca Certificate by id' })
4240
@ApiParam({ name: 'id', type: String })
4341
async delete(
44-
@RequestSessionMetadata() sessionMetadata: SessionMetadata,
45-
@Param('id') id: string,
42+
@Param('id') id: string,
4643
): Promise<void> {
47-
await this.service.delete(sessionMetadata, id);
44+
await this.service.delete(id);
4845
}
4946
}

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ 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 { SessionMetadata } from 'src/common/models';
16-
import { DatabaseRepository } from 'src/modules/database/repositories/database.repository';
1715
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1816

1917
@Injectable()
@@ -22,7 +20,6 @@ export class CaCertificateService {
2220

2321
constructor(
2422
private readonly repository: CaCertificateRepository,
25-
private readonly databaseRepository: DatabaseRepository,
2623
private redisClientStorage: RedisClientStorage,
2724
) {}
2825

@@ -60,17 +57,14 @@ export class CaCertificateService {
6057
}
6158
}
6259

63-
async delete(sessionMetadata: SessionMetadata, id: string): Promise<void> {
60+
async delete(id: string): Promise<void> {
6461
try {
65-
const databases = await this.databaseRepository.list(sessionMetadata);
66-
await Promise.all(databases.map(async (database) => {
67-
const db = await this.databaseRepository.get(sessionMetadata, database.id);
68-
if (db.caCert?.id === id) {
69-
// If the certificate is used by the database, remove the client
70-
await this.redisClientStorage.removeManyByMetadata({ databaseId: db.id });
71-
}
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 });
7267
}));
73-
await this.repository.delete(id);
7468
} catch (error) {
7569
this.logger.error(`Failed to delete certificate ${id}`, error);
7670

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import {
1212
ApiParam,
1313
ApiTags,
1414
} from '@nestjs/swagger';
15-
import { RequestSessionMetadata } from 'src/common/decorators';
16-
import { SessionMetadata } from 'src/common/models';
1715
import { ClientCertificateService } from 'src/modules/certificate/client-certificate.service';
1816
import { ClientCertificate } from 'src/modules/certificate/models/client-certificate';
1917

@@ -42,9 +40,8 @@ export class ClientCertificateController {
4240
@ApiOperation({ description: 'Delete Client Certificate pair by id' })
4341
@ApiParam({ name: 'id', type: String })
4442
async deleteClientCertificatePair(
45-
@RequestSessionMetadata() sessionMetadata: SessionMetadata,
46-
@Param('id') id: string,
43+
@Param('id') id: string,
4744
): Promise<void> {
48-
await this.service.delete(sessionMetadata, id);
45+
await this.service.delete(id);
4946
}
5047
}

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ 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 { SessionMetadata } from 'src/common/models';
16-
import { DatabaseRepository } from 'src/modules/database/repositories/database.repository';
1715
import { RedisClientStorage } from 'src/modules/redis/redis.client.storage';
1816

1917
@Injectable()
@@ -22,7 +20,6 @@ export class ClientCertificateService {
2220

2321
constructor(
2422
private readonly repository: ClientCertificateRepository,
25-
private readonly databaseRepository: DatabaseRepository,
2623
private redisClientStorage: RedisClientStorage,
2724
) {}
2825

@@ -68,19 +65,16 @@ export class ClientCertificateService {
6865
}
6966
}
7067

71-
async delete(sessionMetadata: SessionMetadata, id: string): Promise<void> {
68+
async delete(id: string): Promise<void> {
7269
this.logger.log(`Deleting client certificate. id: ${id}`);
7370

7471
try {
75-
const databases = await this.databaseRepository.list(sessionMetadata);
76-
await Promise.all(databases.map(async (database) => {
77-
const db = await this.databaseRepository.get(sessionMetadata, database.id);
78-
if (db.clientCert?.id === id) {
79-
// If the certificate is used by the database, remove the client
80-
await this.redisClientStorage.removeManyByMetadata({ databaseId: db.id });
81-
}
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 });
8277
}));
83-
await this.repository.delete(id);
8478
} catch (error) {
8579
this.logger.error(`Failed to delete certificate ${id}`, error);
8680

redisinsight/api/src/modules/certificate/repositories/ca-certificate.repository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ export abstract class CaCertificateRepository {
2626
* @param id
2727
* @throws NotFoundException in case when try to delete not existing cert (?)
2828
*/
29-
abstract delete(id: string): Promise<void>;
29+
abstract delete(id: string): Promise<{ affectedDatabases: string[] }>;
3030
}

redisinsight/api/src/modules/certificate/repositories/client-certificate.repository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ export abstract class ClientCertificateRepository {
2424
* @param id
2525
* @throws NotFoundException in case when try to delete not existing cert (?)
2626
*/
27-
abstract delete(id: string): Promise<void>;
27+
abstract delete(id: string): Promise<{ affectedDatabases: string[] }>;
2828
}

redisinsight/api/src/modules/certificate/repositories/local.ca-certificate.repository.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import ERROR_MESSAGES from 'src/constants/error-messages';
1313
import { classToClass } from 'src/utils';
1414
import { EncryptionService } from 'src/modules/encryption/encryption.service';
1515
import { ModelEncryptor } from 'src/modules/encryption/model.encryptor';
16+
import { DatabaseEntity } from 'src/modules/database/entities/database.entity';
1617

1718
@Injectable()
1819
export class LocalCaCertificateRepository extends CaCertificateRepository {
@@ -23,6 +24,8 @@ export class LocalCaCertificateRepository extends CaCertificateRepository {
2324
constructor(
2425
@InjectRepository(CaCertificateEntity)
2526
private readonly repository: Repository<CaCertificateEntity>,
27+
@InjectRepository(DatabaseEntity)
28+
private readonly databaseRepository: Repository<DatabaseEntity>,
2629
private readonly encryptionService: EncryptionService,
2730
) {
2831
super();
@@ -71,7 +74,7 @@ export class LocalCaCertificateRepository extends CaCertificateRepository {
7174
/**
7275
* @inheritDoc
7376
*/
74-
async delete(id: string): Promise<void> {
77+
async delete(id: string): Promise<{ affectedDatabases: string[] }> {
7578
this.logger.log(`Deleting certificate. id: ${id}`);
7679

7780
// todo: 1. why we need to check if entity exists?
@@ -84,7 +87,16 @@ export class LocalCaCertificateRepository extends CaCertificateRepository {
8487
throw new NotFoundException();
8588
}
8689

90+
const affectedDatabases = (await this.databaseRepository
91+
.createQueryBuilder('d')
92+
.leftJoinAndSelect('d.caCert', 'c')
93+
.where({ caCert: id })
94+
.select(['d.id'])
95+
.getMany()).map((e) => e.id);
96+
8797
await this.repository.delete(id);
8898
this.logger.log(`Succeed to delete ca certificate: ${id}`);
99+
100+
return { affectedDatabases };
89101
}
90102
}

redisinsight/api/src/modules/certificate/repositories/local.client-certificate.repository.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ModelEncryptor } from 'src/modules/encryption/model.encryptor';
1313
import { ClientCertificateRepository } from 'src/modules/certificate/repositories/client-certificate.repository';
1414
import { ClientCertificateEntity } from 'src/modules/certificate/entities/client-certificate.entity';
1515
import { ClientCertificate } from 'src/modules/certificate/models/client-certificate';
16+
import { DatabaseEntity } from 'src/modules/database/entities/database.entity';
1617

1718
@Injectable()
1819
export class LocalClientCertificateRepository extends ClientCertificateRepository {
@@ -23,6 +24,8 @@ export class LocalClientCertificateRepository extends ClientCertificateRepositor
2324
constructor(
2425
@InjectRepository(ClientCertificateEntity)
2526
private readonly repository: Repository<ClientCertificateEntity>,
27+
@InjectRepository(DatabaseEntity)
28+
private readonly databaseRepository: Repository<DatabaseEntity>,
2629
private readonly encryptionService: EncryptionService,
2730
) {
2831
super();
@@ -71,7 +74,7 @@ export class LocalClientCertificateRepository extends ClientCertificateRepositor
7174
/**
7275
* @inheritDoc
7376
*/
74-
async delete(id: string): Promise<void> {
77+
async delete(id: string): Promise<{ affectedDatabases: string[] }> {
7578
this.logger.log(`Deleting certificate. id: ${id}`);
7679

7780
// todo: 1. why we need to check if entity exists?
@@ -83,7 +86,16 @@ export class LocalClientCertificateRepository extends ClientCertificateRepositor
8386
throw new NotFoundException();
8487
}
8588

89+
const affectedDatabases = (await this.databaseRepository
90+
.createQueryBuilder('d')
91+
.leftJoinAndSelect('d.clientCert', 'c')
92+
.where({ clientCert: id })
93+
.select(['d.id'])
94+
.getMany()).map((e) => e.id);
95+
8696
await this.repository.delete(id);
8797
this.logger.log(`Succeed to delete client certificate: ${id}`);
98+
99+
return { affectedDatabases };
88100
}
89101
}

0 commit comments

Comments
 (0)