Correct joins between contribution and transaction

This commit is contained in:
elweyn 2022-12-01 15:21:49 +01:00
parent ec396e8521
commit 0b2887b86f
3 changed files with 9 additions and 8 deletions

View File

@ -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

View File

@ -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<boolean> {
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)

View File

@ -15,7 +15,7 @@ export class TransactionRepository extends Repository<Transaction> {
): 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<Transaction> {
.getManyAndCount()
}
return this.createQueryBuilder('userTransaction')
.innerJoinAndSelect(
.leftJoinAndSelect(
'userTransaction.contribution',
'c',
'userTransaction.id = c.transactionId',
@ -44,7 +44,7 @@ export class TransactionRepository extends Repository<Transaction> {
findLastForUser(userId: number): Promise<Transaction | undefined> {
return this.createQueryBuilder('userTransaction')
.innerJoinAndMapOne(
.leftJoinAndMapOne(
'userTransaction.contribution',
Contribution,
'c',