Skip to content

Commit 66e26aa

Browse files
move to newest class-transformer and class-validator
1 parent 0ae35b0 commit 66e26aa

File tree

80 files changed

+357
-369
lines changed

Some content is hidden

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

80 files changed

+357
-369
lines changed

redisinsight/api/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@
6363
"axios": "^1.7.4",
6464
"body-parser": "^1.20.3",
6565
"busboy": "^1.6.0",
66-
"class-transformer": "^0.2.3",
67-
"class-validator": "^0.14.0",
66+
"class-transformer": "^0.5.1",
67+
"class-validator": "^0.14.1",
6868
"combined-stream": "^1.0.8",
6969
"connect-timeout": "^1.9.0",
7070
"date-fns": "^2.29.3",

redisinsight/api/src/__mocks__/browser-history.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { plainToClass } from 'class-transformer';
1+
import { plainToInstance } from 'class-transformer';
22
import { v4 as uuidv4 } from 'uuid';
33
import {
44
mockDatabase,
@@ -26,7 +26,7 @@ export const mockBrowserHistoryRepository = jest.fn(() => ({
2626

2727
export const mockCreateBrowserHistoryDto: CreateBrowserHistoryDto = {
2828
mode: BrowserHistoryMode.Pattern,
29-
filter: plainToClass(ScanFilter, {
29+
filter: plainToInstance(ScanFilter, {
3030
type: RedisDataType.String,
3131
match: 'key*',
3232
}),

redisinsight/api/src/__mocks__/cloud-user.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ICloudCapiAccount,
88
} from 'src/modules/cloud/user/models';
99
import config, { Config } from 'src/utils/config';
10-
import { classToPlain } from 'class-transformer';
10+
import { instanceToPlain } from 'class-transformer';
1111
import { mockCloudApiCapiAccessKey, mockCloudCapiAuthDto, mockCloudCapiKey } from 'src/__mocks__/cloud-capi-key';
1212
import { mockCloudApiAuthDto, mockCloudSession } from 'src/__mocks__/cloud-session';
1313

@@ -102,7 +102,7 @@ export const mockCloudUser = Object.assign(new CloudUser(), {
102102
capiKey: mockCloudCapiKey,
103103
});
104104

105-
export const mockCloudUserSafe = classToPlain(mockCloudUser); // omits all data in the "security" group
105+
export const mockCloudUserSafe = instanceToPlain(mockCloudUser); // omits all data in the "security" group
106106

107107
export const mockCloudApiAccount: ICloudApiAccount = {
108108
id: mockCloudCapiAccount.id,

redisinsight/api/src/common/decorators/client-metadata/client-metadata.decorator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common';
2-
import { plainToClass } from 'class-transformer';
2+
import { plainToInstance } from 'class-transformer';
33
import { ClientContext, ClientMetadata } from 'src/common/models';
44
import { Validator } from 'class-validator';
55
import { API_HEADER_DATABASE_INDEX, API_PARAM_DATABASE_ID } from 'src/common/constants';
@@ -31,7 +31,7 @@ export const clientMetadataParamFactory = (
3131
uniqueId = req.params?.[options.uniqueIdParam];
3232
}
3333

34-
const clientMetadata = plainToClass(ClientMetadata, {
34+
const clientMetadata = plainToInstance(ClientMetadata, {
3535
sessionMetadata: sessionMetadataFromRequestExecutionContext(undefined, ctx),
3636
databaseId,
3737
uniqueId,

redisinsight/api/src/common/decorators/data-as-json-string.decorator.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import { Transform } from 'class-transformer';
33

44
export function DataAsJsonString() {
55
return applyDecorators(
6-
Transform((object) => JSON.stringify(object), { toClassOnly: true }),
7-
Transform((string) => {
8-
try {
9-
return JSON.parse(string);
10-
} catch (e) {
11-
return undefined;
12-
}
13-
}, { toPlainOnly: true }),
6+
Transform(({ value }) => JSON.stringify(value), { toClassOnly: true }),
7+
Transform(
8+
({ value }) => {
9+
try {
10+
return JSON.parse(value);
11+
} catch (e) {
12+
return undefined;
13+
}
14+
},
15+
{ toPlainOnly: true },
16+
),
1417
);
1518
}

redisinsight/api/src/common/decorators/default.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import { Transform } from 'class-transformer';
22
import { cloneDeep } from 'lodash';
33

44
export function Default(defaultValue: unknown): PropertyDecorator {
5-
return Transform((value: unknown) => value ?? cloneDeep(defaultValue));
5+
return Transform(({ value }) => value ?? cloneDeep(defaultValue));
66
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Transform } from 'class-transformer';
22

33
export function HiddenField(field: any): PropertyDecorator {
4-
return Transform((value: string) => (value ? field : undefined), {
4+
return Transform(({ value }) => (value ? field : undefined), {
55
toPlainOnly: true,
66
});
77
}
Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
11
import { forEach } from 'lodash';
22
import { applyDecorators } from '@nestjs/common';
3-
import { classToPlain, plainToClass, Transform } from 'class-transformer';
4-
import { ClassType } from 'class-transformer/ClassTransformer';
3+
import { instanceToPlain, plainToInstance, Transform } from 'class-transformer';
4+
import { ClassConstructor } from 'class-transformer/types/interfaces';
55

6-
export function ObjectAsMap<T>(targetClass: ClassType<T>) {
6+
export function ObjectAsMap<T>(targetClass: ClassConstructor<T>) {
77
return applyDecorators(
8-
Transform((object = {}): Map<string, T> => {
9-
const result = new Map();
8+
Transform(
9+
({ value: object }): Map<string, T> => {
10+
const result = new Map();
1011

11-
try {
12-
forEach(object, (value, key) => {
13-
result.set(key, plainToClass(targetClass, value));
14-
});
12+
try {
13+
forEach(object, (value, key) => {
14+
result.set(key, plainToInstance(targetClass, value));
15+
});
1516

16-
return result;
17-
} catch (e) {
18-
return result;
19-
}
20-
}, { toClassOnly: true }),
21-
Transform((map): object => {
22-
try {
23-
const result = {};
17+
return result;
18+
} catch (e) {
19+
return result;
20+
}
21+
},
22+
{ toClassOnly: true },
23+
),
24+
Transform(
25+
({ value: map }): object => {
26+
try {
27+
const result = {};
2428

25-
forEach(Array.from(map), ([key, value]) => {
26-
result[key] = classToPlain(value);
27-
});
29+
forEach(Array.from(map), ([key, value]) => {
30+
result[key] = instanceToPlain(value);
31+
});
2832

29-
return result;
30-
} catch (e) {
31-
return undefined;
32-
}
33-
}, { toPlainOnly: true }),
33+
return result;
34+
} catch (e) {
35+
return undefined;
36+
}
37+
},
38+
{ toPlainOnly: true },
39+
),
3440
);
3541
}

redisinsight/api/src/common/decorators/session/session-metadata.decorator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common';
2-
import { plainToClass } from 'class-transformer';
2+
import { plainToInstance } from 'class-transformer';
33
import { Validator } from 'class-validator';
44
import { Request } from 'express';
55
import { SessionMetadata } from 'src/common/models';
@@ -16,7 +16,7 @@ export const sessionMetadataFromRequest = (request: Request): SessionMetadata =>
1616
};
1717

1818
// todo: do not forget to deal with session vs sessionMetadata property
19-
const session = plainToClass(SessionMetadata, requestSession);
19+
const session = plainToInstance(SessionMetadata, requestSession);
2020

2121
const errors = validator.validateSync(session, {
2222
whitelist: false, // we need this to allow additional fields if needed for flexibility

redisinsight/api/src/common/middlewares/single-user-auth.middleware.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { NextFunction, Request, Response } from 'express';
66
import { ISessionMetadata, Session, SessionMetadata } from 'src/common/models/session';
77
import { DEFAULT_SESSION_ID, DEFAULT_USER_ID } from 'src/common/constants';
88
import { SessionService } from 'src/modules/session/session.service';
9-
import { plainToClass } from 'class-transformer';
9+
import { plainToInstance } from 'class-transformer';
1010

1111
@Injectable()
1212
export class SingleUserAuthMiddleware implements NestMiddleware {
@@ -16,7 +16,7 @@ export class SingleUserAuthMiddleware implements NestMiddleware {
1616

1717
async use(req: Request, res: Response, next: NextFunction): Promise<any> {
1818
if (!await this.sessionService.getSession(DEFAULT_SESSION_ID)) {
19-
await this.sessionService.createSession(plainToClass(Session, {
19+
await this.sessionService.createSession(plainToInstance(Session, {
2020
id: DEFAULT_SESSION_ID,
2121
userId: DEFAULT_USER_ID,
2222
data: {
@@ -30,7 +30,7 @@ export class SingleUserAuthMiddleware implements NestMiddleware {
3030
}
3131

3232
res.locals.session = {
33-
data: <ISessionMetadata>Object.freeze(plainToClass(SessionMetadata, {
33+
data: <ISessionMetadata>Object.freeze(plainToInstance(SessionMetadata, {
3434
userId: DEFAULT_USER_ID,
3535
sessionId: DEFAULT_SESSION_ID,
3636
})),

0 commit comments

Comments
 (0)