diff --git a/backend/src/graphql/arg/AdminCreateContributionArgs.ts b/backend/src/graphql/arg/AdminCreateContributionArgs.ts index 1c6007c48..558821921 100644 --- a/backend/src/graphql/arg/AdminCreateContributionArgs.ts +++ b/backend/src/graphql/arg/AdminCreateContributionArgs.ts @@ -3,6 +3,7 @@ import { Decimal } from 'decimal.js-light' import { ArgsType, Field, InputType } from 'type-graphql' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @InputType() @ArgsType() @@ -11,6 +12,7 @@ export class AdminCreateContributionArgs { email: string @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/arg/AdminUpdateContributionArgs.ts b/backend/src/graphql/arg/AdminUpdateContributionArgs.ts index 4958b4346..c5f560c9a 100644 --- a/backend/src/graphql/arg/AdminUpdateContributionArgs.ts +++ b/backend/src/graphql/arg/AdminUpdateContributionArgs.ts @@ -3,6 +3,7 @@ import { Decimal } from 'decimal.js-light' import { ArgsType, Field, Int } from 'type-graphql' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @ArgsType() export class AdminUpdateContributionArgs { @@ -10,6 +11,7 @@ export class AdminUpdateContributionArgs { id: number @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/arg/ContributionArgs.ts b/backend/src/graphql/arg/ContributionArgs.ts index e2449ea95..d4c9e639b 100644 --- a/backend/src/graphql/arg/ContributionArgs.ts +++ b/backend/src/graphql/arg/ContributionArgs.ts @@ -3,11 +3,13 @@ import { Decimal } from 'decimal.js-light' import { ArgsType, Field, InputType } from 'type-graphql' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @InputType() @ArgsType() export class ContributionArgs { @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/arg/ContributionLinkArgs.ts b/backend/src/graphql/arg/ContributionLinkArgs.ts index 59688a969..4aa268d28 100644 --- a/backend/src/graphql/arg/ContributionLinkArgs.ts +++ b/backend/src/graphql/arg/ContributionLinkArgs.ts @@ -8,10 +8,12 @@ import { CONTRIBUTIONLINK_NAME_MIN_CHARS, CONTRIBUTIONLINK_NAME_MAX_CHARS, } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @ArgsType() export class ContributionLinkArgs { @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/arg/TransactionLinkArgs.ts b/backend/src/graphql/arg/TransactionLinkArgs.ts index 2ffd91d33..6dfdda15e 100644 --- a/backend/src/graphql/arg/TransactionLinkArgs.ts +++ b/backend/src/graphql/arg/TransactionLinkArgs.ts @@ -1,12 +1,14 @@ -import { MaxLength, MinLength } from 'class-validator' +import { IsAlpha, MaxLength, MinLength } from 'class-validator' import { Decimal } from 'decimal.js-light' import { ArgsType, Field } from 'type-graphql' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @ArgsType() export class TransactionLinkArgs { @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/arg/TransactionSendArgs.ts b/backend/src/graphql/arg/TransactionSendArgs.ts index 1279f2051..d8a556b99 100644 --- a/backend/src/graphql/arg/TransactionSendArgs.ts +++ b/backend/src/graphql/arg/TransactionSendArgs.ts @@ -3,6 +3,7 @@ import { Decimal } from 'decimal.js-light' import { ArgsType, Field } from 'type-graphql' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const' +import { IsPositiveDecimal } from '@/graphql/validator/Decimal' @ArgsType() export class TransactionSendArgs { @@ -10,6 +11,7 @@ export class TransactionSendArgs { identifier: string @Field(() => Decimal) + @IsPositiveDecimal() amount: Decimal @Field(() => String) diff --git a/backend/src/graphql/resolver/ContributionLinkResolver.ts b/backend/src/graphql/resolver/ContributionLinkResolver.ts index e8a694a55..1f9e5ce26 100644 --- a/backend/src/graphql/resolver/ContributionLinkResolver.ts +++ b/backend/src/graphql/resolver/ContributionLinkResolver.ts @@ -41,10 +41,6 @@ export class ContributionLinkResolver { ): Promise { isStartEndDateValid(validFrom, validTo) - if (!new Decimal(amount).isPositive()) { - throw new LogError('The amount must be a positiv value', amount) - } - const dbContributionLink = new DbContributionLink() dbContributionLink.amount = amount dbContributionLink.name = name diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 282e6662a..cc0484588 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -73,10 +73,6 @@ export class TransactionLinkResolver { const createdDate = new Date() const validUntil = transactionLinkExpireDate(createdDate) - if (amount.lessThanOrEqualTo(0)) { - throw new LogError('Amount must be a positive number', amount) - } - const holdAvailableAmount = amount.minus(calculateDecay(amount, createdDate, validUntil).decay) // validate amount diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 721cba8fa..525be81fa 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -308,9 +308,6 @@ export class TransactionResolver { @Ctx() context: Context, ): Promise { logger.info(`sendCoins(identifier=${identifier}, amount=${amount}, memo=${memo})`) - if (amount.lte(0)) { - throw new LogError('Amount to send must be positive', amount) - } const senderUser = getUser(context) diff --git a/backend/src/graphql/validator/Decimal.ts b/backend/src/graphql/validator/Decimal.ts new file mode 100644 index 000000000..caf13143d --- /dev/null +++ b/backend/src/graphql/validator/Decimal.ts @@ -0,0 +1,22 @@ +import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator' +import { Decimal } from 'decimal.js-light' + +export function IsPositiveDecimal(validationOptions?: ValidationOptions) { + return function (object: NonNullable, propertyName: string) { + registerDecorator({ + name: 'isPositiveDecimal', + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + target: object.constructor, + propertyName, + options: validationOptions, + validator: { + validate(value: Decimal) { + return value.greaterThan(0) + }, + defaultMessage(args: ValidationArguments) { + return `The ${propertyName} must be a positive value ${args.property}` + }, + }, + }) + } +}