From 8caf482943ad3cdc9fa30a82ddda339597afb5f1 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 10 Nov 2022 10:52:36 +0100 Subject: [PATCH 1/8] Store transactionLinkId to the transaction --- backend/src/graphql/resolver/TransactionLinkResolver.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 74c531c54..a3156497a 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -300,6 +300,7 @@ export class TransactionLinkResolver { transaction.balanceDate = now transaction.decay = decay ? decay.decay : new Decimal(0) transaction.decayStart = decay ? decay.start : null + transaction.transactionLinkId = contributionLink.id await queryRunner.manager.insert(DbTransaction, transaction) contribution.confirmedAt = now From 69af52f21a0c4a3b1ed0e2201f55be63145efacd Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 10 Nov 2022 10:53:08 +0100 Subject: [PATCH 2/8] Show via link for creations. --- .../TransactionRows/AmountAndNameRow.vue | 22 +++++++++---------- .../Transactions/TransactionCreation.vue | 11 +++++++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/TransactionRows/AmountAndNameRow.vue b/frontend/src/components/TransactionRows/AmountAndNameRow.vue index 322ad7dfa..96a31dcf3 100644 --- a/frontend/src/components/TransactionRows/AmountAndNameRow.vue +++ b/frontend/src/components/TransactionRows/AmountAndNameRow.vue @@ -10,21 +10,21 @@
-
+ {{ itemText }} - - {{ $t('via_link') }} - - -
+ {{ itemText }} + + {{ $t('via_link') }} + +
diff --git a/frontend/src/components/Transactions/TransactionCreation.vue b/frontend/src/components/Transactions/TransactionCreation.vue index 694d907ed..a832b9b1a 100644 --- a/frontend/src/components/Transactions/TransactionCreation.vue +++ b/frontend/src/components/Transactions/TransactionCreation.vue @@ -12,7 +12,12 @@ - + @@ -77,6 +82,10 @@ export default { type: String, required: true, }, + transactionLinkId: { + type: Number, + required: false, + }, previousBookedBalance: { type: String, required: true, From 46014adc6d057496c4169d6591ccbfae01929fe3 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 1 Dec 2022 12:07:25 +0100 Subject: [PATCH 3/8] Database join contribution to transaction table, add new join to query. --- backend/src/graphql/model/Transaction.ts | 4 +- .../resolver/TransactionLinkResolver.ts | 3 +- .../graphql/resolver/TransactionResolver.ts | 3 +- backend/src/typeorm/repository/Transaction.ts | 17 ++++ backend/src/util/virtualTransactions.ts | 2 + .../Contribution.ts | 6 ++ .../Transaction.ts | 99 +++++++++++++++++++ database/entity/Transaction.ts | 2 +- 8 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 database/entity/0052-add_updated_at_to_contributions/Transaction.ts diff --git a/backend/src/graphql/model/Transaction.ts b/backend/src/graphql/model/Transaction.ts index 24c66ac67..09379e0eb 100644 --- a/backend/src/graphql/model/Transaction.ts +++ b/backend/src/graphql/model/Transaction.ts @@ -42,7 +42,9 @@ export class Transaction { this.creationDate = transaction.creationDate this.linkedUser = linkedUser this.linkedTransactionId = transaction.linkedTransactionId - this.transactionLinkId = transaction.transactionLinkId + this.transactionLinkId = transaction.contribution + ? transaction.contribution.contributionLinkId + : transaction.transactionLinkId } @Field(() => Number) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 8d648bc65..a3c170999 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -278,6 +278,7 @@ export class TransactionLinkResolver { .createQueryBuilder() .select('transaction') .from(DbTransaction, 'transaction') + .innerJoinAndSelect('transaction.contribution', 'c') .where('transaction.userId = :id', { id: user.id }) .orderBy('transaction.balanceDate', 'DESC') .getOne() @@ -301,7 +302,7 @@ export class TransactionLinkResolver { transaction.balanceDate = now transaction.decay = decay ? decay.decay : new Decimal(0) transaction.decayStart = decay ? decay.start : null - transaction.transactionLinkId = contributionLink.id + 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 f0fb2f452..e89870558 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -215,7 +215,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}`) @@ -238,7 +238,6 @@ export class TransactionResolver { order, ) context.transactionCount = userTransactionsCount - // find involved users; I am involved const involvedUserIds: number[] = [user.id] userTransactions.forEach((transaction: dbTransaction) => { diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts index f84b57626..7952be0fc 100644 --- a/backend/src/typeorm/repository/Transaction.ts +++ b/backend/src/typeorm/repository/Transaction.ts @@ -1,4 +1,5 @@ import { EntityRepository, Repository } from '@dbTools/typeorm' +import { Contribution } from '@entity/Contribution' import { Transaction } from '@entity/Transaction' import { Order } from '@enum/Order' import { TransactionTypeId } from '@enum/TransactionTypeId' @@ -14,6 +15,11 @@ export class TransactionRepository extends Repository { ): Promise<[Transaction[], number]> { if (onlyCreation) { return this.createQueryBuilder('userTransaction') + .innerJoinAndSelect( + 'userTransaction.contribution', + 'c', + 'userTransaction.id = c.transactionId', + ) .where('userTransaction.userId = :userId', { userId }) .andWhere('userTransaction.typeId = :typeId', { typeId: TransactionTypeId.CREATION, @@ -24,6 +30,11 @@ export class TransactionRepository extends Repository { .getManyAndCount() } return this.createQueryBuilder('userTransaction') + .innerJoinAndSelect( + 'userTransaction.contribution', + 'c', + 'userTransaction.id = c.transactionId', + ) .where('userTransaction.userId = :userId', { userId }) .orderBy('userTransaction.balanceDate', order) .limit(limit) @@ -33,6 +44,12 @@ export class TransactionRepository extends Repository { findLastForUser(userId: number): Promise { return this.createQueryBuilder('userTransaction') + .innerJoinAndMapOne( + 'userTransaction.contribution', + Contribution, + 'c', + 'userTransaction.id = c.transactionId', + ) .where('userTransaction.userId = :userId', { userId }) .orderBy('userTransaction.balanceDate', 'DESC') .getOne() diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts index 08d44b48d..b02f87ee5 100644 --- a/backend/src/util/virtualTransactions.ts +++ b/backend/src/util/virtualTransactions.ts @@ -49,6 +49,7 @@ const virtualLinkTransaction = ( decay: decay.toDecimalPlaces(2, Decimal.ROUND_FLOOR), memo: '', creationDate: null, + contribution: null, ...defaultModelFunctions, } return new Transaction(linkDbTransaction, user) @@ -78,6 +79,7 @@ const virtualDecayTransaction = ( decayStart: decay.start, memo: '', creationDate: null, + contribution: null, ...defaultModelFunctions, } return new Transaction(decayDbTransaction, user) diff --git a/database/entity/0052-add_updated_at_to_contributions/Contribution.ts b/database/entity/0052-add_updated_at_to_contributions/Contribution.ts index 2242a753f..4676c14af 100644 --- a/database/entity/0052-add_updated_at_to_contributions/Contribution.ts +++ b/database/entity/0052-add_updated_at_to_contributions/Contribution.ts @@ -8,10 +8,12 @@ import { JoinColumn, ManyToOne, OneToMany, + OneToOne, } from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' import { User } from '../User' import { ContributionMessage } from '../ContributionMessage' +import { Transaction } from '../Transaction' @Entity('contributions') export class Contribution extends BaseEntity { @@ -92,4 +94,8 @@ export class Contribution extends BaseEntity { @OneToMany(() => ContributionMessage, (message) => message.contribution) @JoinColumn({ name: 'contribution_id' }) messages?: ContributionMessage[] + + @OneToOne(() => Transaction, (transaction) => transaction.contribution) + @JoinColumn({ name: 'transaction_id' }) + transaction?: Transaction | null } diff --git a/database/entity/0052-add_updated_at_to_contributions/Transaction.ts b/database/entity/0052-add_updated_at_to_contributions/Transaction.ts new file mode 100644 index 000000000..ef8d0abdc --- /dev/null +++ b/database/entity/0052-add_updated_at_to_contributions/Transaction.ts @@ -0,0 +1,99 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' +import { Contribution } from '../Contribution' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'int', unsigned: true, unique: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + balance: Decimal + + @Column({ + name: 'balance_date', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decay: Decimal + + @Column({ + name: 'decay_start', + type: 'datetime', + nullable: true, + default: null, + }) + decayStart: Date | null + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) + creationDate: Date | null + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null + + @Column({ + name: 'transaction_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + transactionLinkId?: number | null + + @OneToOne(() => Contribution, (contribution) => contribution.transaction) + @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) + contribution?: Contribution | null +} diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index 5365b0f70..b67dfaa97 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0036-unique_previous_in_transactions/Transaction' +export { Transaction } from './0052-add_updated_at_to_contributions/Transaction' From ec396e85219889322bfbd7800e28cb3330b350c3 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 1 Dec 2022 12:45:15 +0100 Subject: [PATCH 4/8] Merge master. --- backend/src/graphql/resolver/TransactionResolver.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 25260e963..5fb13ba6b 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' }, relations: ['contribution'] }, + { order: { balanceDate: 'DESC' } }, ) logger.debug(`lastTransaction=${lastTransaction}`) @@ -313,10 +313,6 @@ 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) @@ -327,7 +323,6 @@ export class TransactionResolver { // validate recipient user const recipientUser = await findUserByEmail(email) - if (recipientUser.deletedAt) { logger.error(`The recipient account was deleted: recipientUser=${recipientUser}`) throw new Error('The recipient account was deleted') From 0b2887b86fb90ddff3ebb9177d1413f544d59c02 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 1 Dec 2022 15:21:49 +0100 Subject: [PATCH 5/8] Correct joins between contribution and transaction --- backend/src/graphql/resolver/TransactionLinkResolver.ts | 5 +---- backend/src/graphql/resolver/TransactionResolver.ts | 6 +++++- backend/src/typeorm/repository/Transaction.ts | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) 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', From 3ba591637cd883ad186c49661b718d7a6f6d9c45 Mon Sep 17 00:00:00 2001 From: elweyn Date: Fri, 2 Dec 2022 07:32:08 +0100 Subject: [PATCH 6/8] Remove unused method. --- backend/src/typeorm/repository/Transaction.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts index 943ad1081..affed5f42 100644 --- a/backend/src/typeorm/repository/Transaction.ts +++ b/backend/src/typeorm/repository/Transaction.ts @@ -1,5 +1,4 @@ import { EntityRepository, Repository } from '@dbTools/typeorm' -import { Contribution } from '@entity/Contribution' import { Transaction } from '@entity/Transaction' import { Order } from '@enum/Order' import { TransactionTypeId } from '@enum/TransactionTypeId' @@ -41,17 +40,4 @@ export class TransactionRepository extends Repository { .offset(offset) .getManyAndCount() } - - findLastForUser(userId: number): Promise { - return this.createQueryBuilder('userTransaction') - .leftJoinAndMapOne( - 'userTransaction.contribution', - Contribution, - 'c', - 'userTransaction.id = c.transactionId', - ) - .where('userTransaction.userId = :userId', { userId }) - .orderBy('userTransaction.balanceDate', 'DESC') - .getOne() - } } From ffb5988760108f9df39eb1f8bb804d011890fab4 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 6 Dec 2022 11:58:17 +0100 Subject: [PATCH 7/8] Refactoring of some small smelling code. --- .../resolver/TransactionLinkResolver.ts | 3 +- .../graphql/resolver/TransactionResolver.ts | 1 + backend/src/typeorm/repository/Transaction.ts | 30 +++--- .../Transaction.ts | 7 +- .../Transaction.ts | 99 ------------------- database/entity/Transaction.ts | 2 +- 6 files changed, 21 insertions(+), 121 deletions(-) delete mode 100644 database/entity/0052-add_updated_at_to_contributions/Transaction.ts diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index f831b7ff1..1b3558bb2 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -265,7 +265,6 @@ 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 @@ -275,6 +274,7 @@ 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 @@ -285,6 +285,7 @@ export class TransactionLinkResolver { .orderBy('transaction.balanceDate', 'DESC') .getOne() let newBalance = new Decimal(0) + let decay: Decay | null = null if (lastTransaction) { decay = calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 7ec925181..f2edda2c1 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -229,6 +229,7 @@ export class TransactionResolver { order, ) context.transactionCount = userTransactionsCount + // find involved users; I am involved const involvedUserIds: number[] = [user.id] userTransactions.forEach((transaction: dbTransaction) => { diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts index affed5f42..58e9ca30b 100644 --- a/backend/src/typeorm/repository/Transaction.ts +++ b/backend/src/typeorm/repository/Transaction.ts @@ -12,29 +12,21 @@ export class TransactionRepository extends Repository { order: Order, onlyCreation?: boolean, ): Promise<[Transaction[], number]> { - if (onlyCreation) { - return this.createQueryBuilder('userTransaction') - .leftJoinAndSelect( - 'userTransaction.contribution', - 'c', - 'userTransaction.id = c.transactionId', - ) - .where('userTransaction.userId = :userId', { userId }) - .andWhere('userTransaction.typeId = :typeId', { - typeId: TransactionTypeId.CREATION, - }) - .orderBy('userTransaction.balanceDate', order) - .limit(limit) - .offset(offset) - .getManyAndCount() - } - return this.createQueryBuilder('userTransaction') + const query = this.createQueryBuilder('userTransaction') .leftJoinAndSelect( 'userTransaction.contribution', - 'c', - 'userTransaction.id = c.transactionId', + 'contribution', + 'userTransaction.id = contribution.transactionId', ) .where('userTransaction.userId = :userId', { userId }) + + if (onlyCreation) { + query.andWhere('userTransaction.typeId = :typeId', { + typeId: TransactionTypeId.CREATION, + }) + } + + return query .orderBy('userTransaction.balanceDate', order) .limit(limit) .offset(offset) diff --git a/database/entity/0036-unique_previous_in_transactions/Transaction.ts b/database/entity/0036-unique_previous_in_transactions/Transaction.ts index 99202eee4..ef8d0abdc 100644 --- a/database/entity/0036-unique_previous_in_transactions/Transaction.ts +++ b/database/entity/0036-unique_previous_in_transactions/Transaction.ts @@ -1,6 +1,7 @@ import Decimal from 'decimal.js-light' -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' +import { Contribution } from '../Contribution' @Entity('transactions') export class Transaction extends BaseEntity { @@ -91,4 +92,8 @@ export class Transaction extends BaseEntity { default: null, }) transactionLinkId?: number | null + + @OneToOne(() => Contribution, (contribution) => contribution.transaction) + @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) + contribution?: Contribution | null } diff --git a/database/entity/0052-add_updated_at_to_contributions/Transaction.ts b/database/entity/0052-add_updated_at_to_contributions/Transaction.ts deleted file mode 100644 index ef8d0abdc..000000000 --- a/database/entity/0052-add_updated_at_to_contributions/Transaction.ts +++ /dev/null @@ -1,99 +0,0 @@ -import Decimal from 'decimal.js-light' -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Contribution } from '../Contribution' - -@Entity('transactions') -export class Transaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ name: 'user_id', unsigned: true, nullable: false }) - userId: number - - @Column({ type: 'int', unsigned: true, unique: true, nullable: true, default: null }) - previous: number | null - - @Column({ name: 'type_id', unsigned: true, nullable: false }) - typeId: number - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: false, - transformer: DecimalTransformer, - }) - amount: Decimal - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: false, - transformer: DecimalTransformer, - }) - balance: Decimal - - @Column({ - name: 'balance_date', - type: 'datetime', - default: () => 'CURRENT_TIMESTAMP', - nullable: false, - }) - balanceDate: Date - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: false, - transformer: DecimalTransformer, - }) - decay: Decimal - - @Column({ - name: 'decay_start', - type: 'datetime', - nullable: true, - default: null, - }) - decayStart: Date | null - - @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) - memo: string - - @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) - creationDate: Date | null - - @Column({ - name: 'linked_user_id', - type: 'int', - unsigned: true, - nullable: true, - default: null, - }) - linkedUserId?: number | null - - @Column({ - name: 'linked_transaction_id', - type: 'int', - unsigned: true, - nullable: true, - default: null, - }) - linkedTransactionId?: number | null - - @Column({ - name: 'transaction_link_id', - type: 'int', - unsigned: true, - nullable: true, - default: null, - }) - transactionLinkId?: number | null - - @OneToOne(() => Contribution, (contribution) => contribution.transaction) - @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) - contribution?: Contribution | null -} diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index b67dfaa97..5365b0f70 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0052-add_updated_at_to_contributions/Transaction' +export { Transaction } from './0036-unique_previous_in_transactions/Transaction' From d52f7f9590dc9c1a7b842abdab31936ecfe67828 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 6 Dec 2022 12:20:21 +0100 Subject: [PATCH 8/8] change transactionLinkId to linkId. --- backend/src/graphql/model/Transaction.ts | 6 +++--- .../src/components/TransactionRows/AmountAndNameRow.vue | 4 ++-- .../src/components/Transactions/TransactionCreation.vue | 4 ++-- frontend/src/components/Transactions/TransactionReceive.vue | 4 ++-- frontend/src/components/Transactions/TransactionSend.vue | 4 ++-- frontend/src/graphql/queries.js | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/src/graphql/model/Transaction.ts b/backend/src/graphql/model/Transaction.ts index 09379e0eb..a7329bcef 100644 --- a/backend/src/graphql/model/Transaction.ts +++ b/backend/src/graphql/model/Transaction.ts @@ -42,7 +42,7 @@ export class Transaction { this.creationDate = transaction.creationDate this.linkedUser = linkedUser this.linkedTransactionId = transaction.linkedTransactionId - this.transactionLinkId = transaction.contribution + this.linkId = transaction.contribution ? transaction.contribution.contributionLinkId : transaction.transactionLinkId } @@ -83,7 +83,7 @@ export class Transaction { @Field(() => Number, { nullable: true }) linkedTransactionId?: number | null - // Links to the TransactionLink when transaction was created by a link + // Links to the TransactionLink/ContributionLink when transaction was created by a link @Field(() => Number, { nullable: true }) - transactionLinkId?: number | null + linkId?: number | null } diff --git a/frontend/src/components/TransactionRows/AmountAndNameRow.vue b/frontend/src/components/TransactionRows/AmountAndNameRow.vue index 96a31dcf3..eb68d9f37 100644 --- a/frontend/src/components/TransactionRows/AmountAndNameRow.vue +++ b/frontend/src/components/TransactionRows/AmountAndNameRow.vue @@ -16,7 +16,7 @@ {{ itemText }} - + {{ $t('via_link') }} @@ -82,7 +82,7 @@ export default { type: String, required: true, }, - transactionLinkId: { + linkId: { type: Number, required: false, }, diff --git a/frontend/src/components/Transactions/TransactionReceive.vue b/frontend/src/components/Transactions/TransactionReceive.vue index 8899b3807..389ac9d5d 100644 --- a/frontend/src/components/Transactions/TransactionReceive.vue +++ b/frontend/src/components/Transactions/TransactionReceive.vue @@ -17,7 +17,7 @@ v-on="$listeners" :amount="amount" :linkedUser="linkedUser" - :transactionLinkId="transactionLinkId" + :linkId="linkId" /> @@ -82,7 +82,7 @@ export default { typeId: { type: String, }, - transactionLinkId: { + linkId: { type: Number, required: false, }, diff --git a/frontend/src/components/Transactions/TransactionSend.vue b/frontend/src/components/Transactions/TransactionSend.vue index f9125b89c..c02f230e7 100644 --- a/frontend/src/components/Transactions/TransactionSend.vue +++ b/frontend/src/components/Transactions/TransactionSend.vue @@ -17,7 +17,7 @@ v-on="$listeners" :amount="amount" :linkedUser="linkedUser" - :transactionLinkId="transactionLinkId" + :linkId="linkId" /> @@ -83,7 +83,7 @@ export default { type: String, required: true, }, - transactionLinkId: { + linkId: { type: Number, required: false, }, diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index 1c910a23e..d261797c2 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -45,7 +45,7 @@ export const transactionsQuery = gql` end duration } - transactionLinkId + linkId } } }