diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 835b84cbf..9e2af6111 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -156,14 +156,13 @@ export class TransactionLinkResolver { throw new Error('Transaction Link already redeemed.') } - await executeTransaction(transactionLink.amount, transactionLink.memo, linkedUser, user) - - // TODO: Rollback transaction when updating links fails - transactionLink.redeemedAt = now - transactionLink.redeemedBy = user.id - transactionLink.save().catch(() => { - throw new Error('Could not update transaction link.') - }) + await executeTransaction( + transactionLink.amount, + transactionLink.memo, + linkedUser, + user, + transactionLink, + ) return true } diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 20b56af7e..d2bfd7f28 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -23,6 +23,7 @@ import { TransactionLinkRepository } from '@repository/TransactionLink' import { User as dbUser } from '@entity/User' import { Transaction as dbTransaction } from '@entity/Transaction' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { apiPost } from '@/apis/HttpRequest' import { TransactionTypeId } from '@enum/TransactionTypeId' @@ -39,6 +40,7 @@ export const executeTransaction = async ( memo: string, sender: dbUser, recipient: dbUser, + transactionLink?: dbTransactionLink | null, ): Promise => { if (sender.id === recipient.id) { throw new Error('Sender and Recipient are the same.') @@ -67,6 +69,7 @@ export const executeTransaction = async ( transactionSend.decay = sendBalance.decay.decay transactionSend.decayStart = sendBalance.decay.start transactionSend.previous = sendBalance.lastTransactionId + transactionSend.transactionLinkId = transactionLink ? transactionLink.id : null await queryRunner.manager.insert(dbTransaction, transactionSend) const transactionReceive = new dbTransaction() @@ -82,12 +85,23 @@ export const executeTransaction = async ( transactionReceive.decayStart = receiveBalance ? receiveBalance.decay.start : null transactionReceive.previous = receiveBalance ? receiveBalance.lastTransactionId : null transactionReceive.linkedTransactionId = transactionSend.id + transactionReceive.transactionLinkId = transactionLink ? transactionLink.id : null await queryRunner.manager.insert(dbTransaction, transactionReceive) // Save linked transaction id for send transactionSend.linkedTransactionId = transactionReceive.id await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend) + if (transactionLink) { + transactionLink.redeemedAt = receivedCallDate + transactionLink.redeemedBy = recipient.id + await queryRunner.manager.update( + dbTransactionLink, + { id: transactionLink.id }, + transactionLink, + ) + } + await queryRunner.commitTransaction() } catch (e) { await queryRunner.rollbackTransaction()