Skip to content

Commit 3ac0069

Browse files
committed
feat: add CsvItemDto for validation
1 parent 44fadf4 commit 3ac0069

File tree

5 files changed

+102
-46
lines changed

5 files changed

+102
-46
lines changed

src/modules/wallet/__tests__/wallet.controller.spec.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,15 @@ describe('WalletController', () => {
201201
batchCreateWalletDto = {
202202
sender_wallet: 'sender_wallet_name',
203203
token_transfer_amount_default: 100,
204-
wallet_id: 'parent_wallet_id',
204+
wallet_id: 'sender_wallet_id',
205+
csvJson: [
206+
{
207+
wallet_name: 'wallet1',
208+
token_transfer_amount_overwrite: 50,
209+
},
210+
{ wallet_name: 'wallet2' },
211+
],
212+
filePath: testFilePath,
205213
};
206214

207215
// Ensure the uploads directory exists and create the mock file

src/modules/wallet/dto/batch-create-wallet.dto.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { IsNumber, IsOptional, IsString } from 'class-validator';
1+
import {
2+
IsString,
3+
IsArray,
4+
IsOptional,
5+
ValidateNested,
6+
IsNumber,
7+
Validate,
8+
} from 'class-validator';
9+
import { Type } from 'class-transformer';
10+
import { UniqueWalletNameConstraint, CsvItemDto } from './csv-item.dto';
211

312
export class BatchCreateWalletDto {
413
@IsString()
@@ -12,4 +21,14 @@ export class BatchCreateWalletDto {
1221
@IsString()
1322
@IsOptional()
1423
wallet_id: string;
24+
25+
@IsArray()
26+
@Validate(UniqueWalletNameConstraint)
27+
@ValidateNested({ each: true })
28+
@Type(() => CsvItemDto)
29+
csvJson: CsvItemDto[];
30+
31+
@IsString()
32+
@IsOptional()
33+
filePath: string;
1534
}

src/modules/wallet/dto/batch-transfer-wallet.dto.ts

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,9 @@ import {
66
IsNotEmpty,
77
IsNumber,
88
Validate,
9-
ValidatorConstraint,
10-
ValidatorConstraintInterface,
119
} from 'class-validator';
12-
1310
import { Type } from 'class-transformer';
14-
15-
// Custom validator to check for unique `wallet_name` values in the csvJson array
16-
@ValidatorConstraint({ async: false })
17-
class UniqueWalletNameConstraint implements ValidatorConstraintInterface {
18-
validate(csvJson: CsvJsonDto[]): boolean {
19-
const walletNames = csvJson.map((item) => item.wallet_name);
20-
return walletNames.length === new Set(walletNames).size;
21-
}
22-
23-
defaultMessage(): string {
24-
return 'Each wallet_name in csvJson must be unique.';
25-
}
26-
}
27-
28-
class CsvJsonDto {
29-
@IsString()
30-
@IsNotEmpty()
31-
wallet_name: string;
32-
33-
@IsOptional()
34-
@IsNumber()
35-
token_transfer_amount_overwrite?: number;
36-
37-
@IsOptional()
38-
@IsString()
39-
extra_wallet_data_about?: string;
40-
}
11+
import { UniqueWalletNameConstraint, CsvItemDto } from './csv-item.dto';
4112

4213
export class BatchTransferWalletDto {
4314
@IsString()
@@ -55,8 +26,8 @@ export class BatchTransferWalletDto {
5526
@IsArray()
5627
@Validate(UniqueWalletNameConstraint)
5728
@ValidateNested({ each: true })
58-
@Type(() => CsvJsonDto)
59-
csvJson: CsvJsonDto[];
29+
@Type(() => CsvItemDto)
30+
csvJson: CsvItemDto[];
6031

6132
@IsString()
6233
@IsOptional()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {
2+
IsString,
3+
IsOptional,
4+
IsNotEmpty,
5+
IsNumber,
6+
ValidatorConstraint,
7+
ValidatorConstraintInterface,
8+
} from 'class-validator';
9+
10+
// Custom validator to check for unique `wallet_name` values in the csvJson array
11+
@ValidatorConstraint({ async: false })
12+
export class UniqueWalletNameConstraint
13+
implements ValidatorConstraintInterface
14+
{
15+
validate(csvJson: CsvItemDto[]): boolean {
16+
const walletNames = csvJson.map((item) => item.wallet_name);
17+
return walletNames.length === new Set(walletNames).size;
18+
}
19+
20+
defaultMessage(): string {
21+
return 'Each wallet_name in csvJson must be unique.';
22+
}
23+
}
24+
25+
export class CsvItemDto {
26+
@IsString()
27+
@IsNotEmpty()
28+
wallet_name: string;
29+
30+
@IsOptional()
31+
@IsNumber()
32+
token_transfer_amount_overwrite?: number;
33+
34+
@IsOptional()
35+
@IsString()
36+
extra_wallet_data_about?: string;
37+
}

src/modules/wallet/wallet.controller.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
UploadedFile,
1111
UploadedFiles,
1212
UseInterceptors,
13+
UsePipes,
14+
ValidationPipe,
1315
} from '@nestjs/common';
1416
import { WalletService } from './wallet.service';
1517
import { TrustService } from '../trust/trust.service';
@@ -87,20 +89,30 @@ export class WalletController {
8789

8890
@Post('batch-create-wallet')
8991
@UseInterceptors(CsvFileUploadInterceptor())
92+
@UsePipes(new ValidationPipe({ transform: true }))
9093
async batchCreateWallet(
9194
@Body() batchCreateWalletDto: BatchCreateWalletDto,
9295
@UploadedFile() file: Express.Multer.File,
9396
) {
94-
const { sender_wallet, token_transfer_amount_default, wallet_id } =
95-
batchCreateWalletDto;
97+
const { path } = file;
98+
const csvJson = await csvtojson().fromFile(path);
99+
batchCreateWalletDto.csvJson = csvJson;
100+
batchCreateWalletDto.filePath = path;
96101

97-
const csvJson = await csvtojson().fromFile(file.path);
98-
return this.walletService.batchCreateWallet(
102+
const {
99103
sender_wallet,
100104
token_transfer_amount_default,
101105
wallet_id,
102-
csvJson,
103-
file.path,
106+
csvJson: validatedCsvJson,
107+
filePath,
108+
} = batchCreateWalletDto;
109+
110+
return await this.walletService.batchCreateWallet(
111+
sender_wallet,
112+
token_transfer_amount_default,
113+
wallet_id,
114+
validatedCsvJson,
115+
filePath,
104116
);
105117
}
106118

@@ -110,16 +122,25 @@ export class WalletController {
110122
@Body() batchTransferWalletDto: BatchTransferWalletDto,
111123
@UploadedFile() file: Express.Multer.File,
112124
) {
113-
const { sender_wallet, token_transfer_amount_default, wallet_id } =
114-
batchTransferWalletDto;
125+
const { path } = file;
126+
const csvJson = await csvtojson().fromFile(path);
127+
batchTransferWalletDto.csvJson = csvJson;
128+
batchTransferWalletDto.filePath = path;
129+
130+
const {
131+
sender_wallet,
132+
token_transfer_amount_default,
133+
wallet_id,
134+
csvJson: validatedCsvJson,
135+
filePath,
136+
} = batchTransferWalletDto;
115137

116-
const csvJson = await csvtojson().fromFile(file.path);
117-
return this.walletService.batchTransferWallet(
138+
return await this.walletService.batchTransferWallet(
118139
sender_wallet,
119140
token_transfer_amount_default,
120141
wallet_id,
121-
csvJson,
122-
file.path,
142+
validatedCsvJson,
143+
filePath,
123144
);
124145
}
125146
}

0 commit comments

Comments
 (0)