diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 79bfd375e..f831b7ff1 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -265,6 +265,7 @@ export class TransactionLinkResolver { const creations = await getUserCreation(user.id, clientTimezoneOffset) logger.info('open creations', creations) validateContribution(creations, contributionLink.amount, now, clientTimezoneOffset) + const contribution = new DbContribution() contribution.userId = user.id contribution.createdAt = now @@ -274,19 +275,16 @@ export class TransactionLinkResolver { contribution.contributionLinkId = contributionLink.id contribution.contributionType = ContributionType.LINK contribution.contributionStatus = ContributionStatus.CONFIRMED - await queryRunner.manager.insert(DbContribution, contribution) const lastTransaction = await queryRunner.manager .createQueryBuilder() .select('transaction') .from(DbTransaction, 'transaction') - .innerJoinAndSelect('transaction.contribution', 'c') .where('transaction.userId = :id', { id: user.id }) .orderBy('transaction.balanceDate', 'DESC') .getOne() let newBalance = new Decimal(0) - let decay: Decay | null = null if (lastTransaction) { decay = calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now) @@ -305,7 +303,6 @@ export class TransactionLinkResolver { transaction.balanceDate = now transaction.decay = decay ? decay.decay : new Decimal(0) transaction.decayStart = decay ? decay.start : null - transaction.contribution = contribution await queryRunner.manager.insert(DbTransaction, transaction) contribution.confirmedAt = now diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 5fb13ba6b..7ec925181 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -206,7 +206,7 @@ export class TransactionResolver { // find current balance const lastTransaction = await dbTransaction.findOne( { userId: user.id }, - { order: { balanceDate: 'DESC' } }, + { order: { balanceDate: 'DESC' }, relations: ['contribution'] }, ) logger.debug(`lastTransaction=${lastTransaction}`) @@ -313,6 +313,10 @@ export class TransactionResolver { @Ctx() context: Context, ): Promise { logger.info(`sendCoins(email=${email}, amount=${amount}, memo=${memo})`) + if (amount.lte(0)) { + logger.error(`Amount to send must be positive`) + throw new Error('Amount to send must be positive') + } // TODO this is subject to replay attacks const senderUser = getUser(context) diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts index 7952be0fc..943ad1081 100644 --- a/backend/src/typeorm/repository/Transaction.ts +++ b/backend/src/typeorm/repository/Transaction.ts @@ -15,7 +15,7 @@ export class TransactionRepository extends Repository { ): Promise<[Transaction[], number]> { if (onlyCreation) { return this.createQueryBuilder('userTransaction') - .innerJoinAndSelect( + .leftJoinAndSelect( 'userTransaction.contribution', 'c', 'userTransaction.id = c.transactionId', @@ -30,7 +30,7 @@ export class TransactionRepository extends Repository { .getManyAndCount() } return this.createQueryBuilder('userTransaction') - .innerJoinAndSelect( + .leftJoinAndSelect( 'userTransaction.contribution', 'c', 'userTransaction.id = c.transactionId', @@ -44,7 +44,7 @@ export class TransactionRepository extends Repository { findLastForUser(userId: number): Promise { return this.createQueryBuilder('userTransaction') - .innerJoinAndMapOne( + .leftJoinAndMapOne( 'userTransaction.contribution', Contribution, 'c',