import { ApiProperty } from '@nestjs/swagger'; import { Expose, Type } from 'class-transformer'; import { IsNumber, IsString, Min, ValidateNested } from 'class-validator'; export class CardAcceptorLocationDto { @Expose() @IsString() @ApiProperty() merchantId!: string; @Expose() @IsString() @ApiProperty() merchantName!: string; @Expose() @IsString() @ApiProperty() merchantCountry!: string; @Expose() @IsString() @ApiProperty() merchantCity!: string; @Expose() @IsString() @ApiProperty() mcc!: string; } export class CardTransactionWebhookRequest { @Expose({ name: 'InstId' }) @IsString() @ApiProperty({ name: 'InstId', example: '1100' }) instId!: string; @Expose() @IsString() @ApiProperty({ example: '30829' }) cardId!: string; @Expose() @IsString() @ApiProperty({ example: '1234567890123456' }) transactionId!: string; @Expose() @IsString() @ApiProperty({ example: '277012*****3456' }) cardMaskedNumber!: string; @Expose() @IsString() @ApiProperty({ example: '1234567890123456' }) accountNumber!: string; @Expose({ name: 'Date' }) @IsString() @ApiProperty({ name: 'Date', example: '20241112' }) date!: string; @Expose({ name: 'Time' }) @IsString() @ApiProperty({ name: 'Time', example: '125250' }) time!: string; @Expose() @Type(() => Number) @IsNumber() @ApiProperty({ example: '132' }) otb!: number; @Expose() @IsString() @ApiProperty({ example: '0' }) transactionCode!: string; @Expose() @IsString() @ApiProperty({ example: '1' }) messageClass!: string; @Expose({ name: 'RRN' }) @IsString() @ApiProperty({ name: 'RRN', example: '431712003306' }) rrn!: string; @Expose() @IsString() @ApiProperty({ example: '3306' }) stan!: string; @Expose() @ValidateNested() @Type(() => CardAcceptorLocationDto) @ApiProperty({ type: CardAcceptorLocationDto }) cardAcceptorLocation!: CardAcceptorLocationDto; @Type(() => Number) @IsNumber() @Min(0, { message: 'amount must be zero or a positive number' }) @ApiProperty({ example: '100.5' }) transactionAmount!: number; @IsString() @ApiProperty({ example: '682' }) transactionCurrency!: string; @Type(() => Number) @IsNumber() @Min(0, { message: 'amount must be zero or a positive number' }) @ApiProperty({ example: '100.5' }) billingAmount!: number; @IsString() @ApiProperty({ example: '682' }) billingCurrency!: string; @Type(() => Number) @IsNumber() @Min(0, { message: 'amount must be zero or a positive number' }) @ApiProperty({ example: '100.5' }) settlementAmount!: number; @IsString() @ApiProperty({ example: '682' }) settlementCurrency!: string; @Expose() @Type(() => Number) @IsNumber() @Min(0, { message: 'amount must be zero or a positive number' }) @ApiProperty({ example: '20' }) fees!: number; @Expose() @Type(() => Number) @IsNumber() @Min(0, { message: 'amount must be zero or a positive number' }) @ApiProperty({ example: '4.5' }) vatOnFees!: number; @Expose() @IsString() @ApiProperty({ example: '9' }) posEntryMode!: string; @Expose() @IsString() @ApiProperty({ example: '036657' }) authIdResponse!: string; @Expose({ name: 'POSCDIM' }) @IsString() @ApiProperty({ name: 'POSCDIM', example: '9' }) posCdim!: string; }