Skip to content

Commit cb30d5e

Browse files
author
Artem
committed
possible solution for editing databases
1 parent da974af commit cb30d5e

File tree

6 files changed

+929
-7
lines changed

6 files changed

+929
-7
lines changed

redisinsight/api/src/modules/database/database.controller.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
import { ApiTags } from '@nestjs/swagger';
22
import {
33
Body,
4-
ClassSerializerInterceptor, Controller, Delete, Get, Param, Post, Put, UseInterceptors, UsePipes, ValidationPipe,
4+
ClassSerializerInterceptor,
5+
Controller,
6+
Delete,
7+
Get,
8+
Param,
9+
Patch,
10+
Post,
11+
Put,
12+
UseInterceptors,
13+
UsePipes,
14+
ValidationPipe,
515
} from '@nestjs/common';
616
import { ApiEndpoint } from 'src/decorators/api-endpoint.decorator';
717
import { Database } from 'src/modules/database/models/database';
@@ -16,6 +26,7 @@ import { DeleteDatabasesDto } from 'src/modules/database/dto/delete.databases.dt
1626
import { DeleteDatabasesResponse } from 'src/modules/database/dto/delete.databases.response';
1727
import { ClientMetadataParam } from 'src/common/decorators';
1828
import { ClientMetadata } from 'src/common/models';
29+
import { ModifyDatabaseDto } from 'src/modules/database/dto/modify.database.dto';
1930

2031
@ApiTags('Database')
2132
@Controller('databases')
@@ -117,6 +128,34 @@ export class DatabaseController {
117128
return await this.service.update(id, database, true);
118129
}
119130

131+
@UseInterceptors(ClassSerializerInterceptor)
132+
@UseInterceptors(new TimeoutInterceptor(ERROR_MESSAGES.CONNECTION_TIMEOUT))
133+
@Patch(':id')
134+
@ApiEndpoint({
135+
description: 'Update database instance by id',
136+
statusCode: 200,
137+
responses: [
138+
{
139+
status: 200,
140+
description: 'Updated database instance\' response',
141+
type: Database,
142+
},
143+
],
144+
})
145+
@UsePipes(
146+
new ValidationPipe({
147+
transform: true,
148+
whitelist: true,
149+
forbidNonWhitelisted: true,
150+
}),
151+
)
152+
async modify(
153+
@Param('id') id: string,
154+
@Body() database: ModifyDatabaseDto,
155+
): Promise<Database> {
156+
return await this.service.update(id, database, true);
157+
}
158+
120159
@Delete('/:id')
121160
@ApiEndpoint({
122161
statusCode: 200,

redisinsight/api/src/modules/database/database.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { AppRedisInstanceEvents } from 'src/constants';
1818
import { EventEmitter2 } from '@nestjs/event-emitter';
1919
import { DeleteDatabasesResponse } from 'src/modules/database/dto/delete.databases.response';
2020
import { ClientContext } from 'src/common/models';
21+
import { ModifyDatabaseDto } from 'src/modules/database/dto/modify.database.dto';
2122

2223
@Injectable()
2324
export class DatabaseService {
@@ -118,7 +119,7 @@ export class DatabaseService {
118119
// todo: remove manualUpdate flag logic
119120
public async update(
120121
id: string,
121-
dto: UpdateDatabaseDto,
122+
dto: UpdateDatabaseDto | ModifyDatabaseDto,
122123
manualUpdate: boolean = true,
123124
): Promise<Database> {
124125
this.logger.log(`Updating database: ${id}`);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { CreateDatabaseDto } from 'src/modules/database/dto/create.database.dto';
2+
import { PartialType } from '@nestjs/swagger';
3+
import {
4+
IsInt, IsString, MaxLength, ValidateIf,
5+
} from 'class-validator';
6+
7+
export class ModifyDatabaseDto extends PartialType(CreateDatabaseDto) {
8+
@ValidateIf((object, value) => value !== undefined)
9+
@IsString({ always: true })
10+
@MaxLength(500)
11+
name: string;
12+
13+
@ValidateIf((object, value) => value !== undefined)
14+
@IsString({ always: true })
15+
host: string;
16+
17+
@ValidateIf((object, value) => value !== undefined)
18+
@IsInt({ always: true })
19+
port: number;
20+
}

redisinsight/api/src/modules/database/dto/update.database.dto.ts

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1-
import { CreateDatabaseDto } from 'src/modules/database/dto/create.database.dto';
2-
import { PartialType } from '@nestjs/swagger';
1+
import { ApiPropertyOptional, getSchemaPath } from '@nestjs/swagger';
32
import {
4-
IsInt, IsString, MaxLength, ValidateIf,
3+
IsBoolean,
4+
IsInt, IsNotEmpty, IsNotEmptyObject, IsOptional, IsString, MaxLength, Min, ValidateIf, ValidateNested,
55
} from 'class-validator';
6+
import { CreateCaCertificateDto } from 'src/modules/certificate/dto/create.ca-certificate.dto';
7+
import { UseCaCertificateDto } from 'src/modules/certificate/dto/use.ca-certificate.dto';
8+
import { Expose, Type } from 'class-transformer';
9+
import { caCertTransformer } from 'src/modules/certificate/transformers/ca-cert.transformer';
10+
import { Default } from 'src/common/decorators';
11+
import { CreateClientCertificateDto } from 'src/modules/certificate/dto/create.client-certificate.dto';
12+
import { clientCertTransformer } from 'src/modules/certificate/transformers/client-cert.transformer';
13+
import { UseClientCertificateDto } from 'src/modules/certificate/dto/use.client-certificate.dto';
14+
import { SentinelMaster } from 'src/modules/redis-sentinel/models/sentinel-master';
15+
import { CreateDatabaseDto } from 'src/modules/database/dto/create.database.dto';
616

7-
export class UpdateDatabaseDto extends PartialType(CreateDatabaseDto) {
17+
export class UpdateDatabaseDto extends CreateDatabaseDto {
818
@ValidateIf((object, value) => value !== undefined)
919
@IsString({ always: true })
1020
@MaxLength(500)
@@ -17,4 +27,82 @@ export class UpdateDatabaseDto extends PartialType(CreateDatabaseDto) {
1727
@ValidateIf((object, value) => value !== undefined)
1828
@IsInt({ always: true })
1929
port: number;
30+
31+
@ApiPropertyOptional({
32+
description: 'Logical database number.',
33+
type: Number,
34+
})
35+
@IsInt()
36+
@Min(0)
37+
@IsOptional()
38+
@Default(null)
39+
db?: number;
40+
41+
@ApiPropertyOptional({
42+
description: 'Use TLS to connect.',
43+
type: Boolean,
44+
})
45+
@IsBoolean()
46+
@IsOptional()
47+
@Default(false)
48+
tls?: boolean;
49+
50+
@ApiPropertyOptional({
51+
description: 'SNI servername',
52+
type: String,
53+
})
54+
@IsString()
55+
@IsNotEmpty()
56+
@IsOptional()
57+
@Default(null)
58+
tlsServername?: string;
59+
60+
@ApiPropertyOptional({
61+
description: 'The certificate returned by the server needs to be verified.',
62+
type: Boolean,
63+
default: false,
64+
})
65+
@IsOptional()
66+
@IsBoolean({ always: true })
67+
@Default(false)
68+
verifyServerCert?: boolean;
69+
70+
@ApiPropertyOptional({
71+
description: 'CA Certificate',
72+
oneOf: [
73+
{ $ref: getSchemaPath(CreateCaCertificateDto) },
74+
{ $ref: getSchemaPath(UseCaCertificateDto) },
75+
],
76+
})
77+
@IsOptional()
78+
@IsNotEmptyObject()
79+
@Type(caCertTransformer)
80+
@ValidateNested()
81+
@Default(null)
82+
caCert?: CreateCaCertificateDto | UseCaCertificateDto;
83+
84+
@ApiPropertyOptional({
85+
description: 'Client Certificate',
86+
oneOf: [
87+
{ $ref: getSchemaPath(CreateClientCertificateDto) },
88+
{ $ref: getSchemaPath(UseCaCertificateDto) },
89+
],
90+
})
91+
@IsOptional()
92+
@IsNotEmptyObject()
93+
@Type(clientCertTransformer)
94+
@ValidateNested()
95+
@Default(null)
96+
clientCert?: CreateClientCertificateDto | UseClientCertificateDto;
97+
98+
@ApiPropertyOptional({
99+
description: 'Redis OSS Sentinel master group.',
100+
type: SentinelMaster,
101+
})
102+
@IsOptional()
103+
@IsNotEmptyObject()
104+
@Type(() => SentinelMaster)
105+
@ValidateNested()
106+
@Default(null)
107+
sentinelMaster?: SentinelMaster;
20108
}

0 commit comments

Comments
 (0)