diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 23ede1f27..959700814 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -12,7 +12,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0064-event_rename', + DB_VERSION: '0065-x-community-sendcoins-transactions_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 5969eaef2..7068fd4ab 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -501,6 +501,8 @@ export class ContributionResolver { transaction.typeId = TransactionTypeId.CREATION transaction.memo = contribution.memo transaction.userId = contribution.userId + transaction.userGradidoID = user.gradidoID + transaction.userName = user.firstName + ' ' + user.lastName transaction.previous = lastTransaction ? lastTransaction.id : null transaction.amount = contribution.amount transaction.creationDate = contribution.contributionDate diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 430cdb363..4706df794 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -87,7 +87,11 @@ export const executeTransaction = async ( transactionSend.typeId = TransactionTypeId.SEND transactionSend.memo = memo transactionSend.userId = sender.id + transactionSend.userGradidoID = sender.gradidoID + transactionSend.userName = sender.firstName + ' ' + sender.lastName transactionSend.linkedUserId = recipient.id + transactionSend.linkedUserGradidoID = recipient.gradidoID + transactionSend.linkedUserName = recipient.firstName + ' ' + recipient.lastName transactionSend.amount = amount.mul(-1) transactionSend.balance = sendBalance.balance transactionSend.balanceDate = receivedCallDate @@ -103,7 +107,11 @@ export const executeTransaction = async ( transactionReceive.typeId = TransactionTypeId.RECEIVE transactionReceive.memo = memo transactionReceive.userId = recipient.id + transactionReceive.userGradidoID = recipient.gradidoID + transactionReceive.userName = recipient.firstName + ' ' + recipient.lastName transactionReceive.linkedUserId = sender.id + transactionReceive.linkedUserGradidoID = sender.gradidoID + transactionReceive.linkedUserName = sender.firstName + ' ' + sender.lastName transactionReceive.amount = amount const receiveBalance = await calculateBalance(recipient.id, amount, receivedCallDate) transactionReceive.balance = receiveBalance ? receiveBalance.balance : amount diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts index 68a37746b..cd73f9feb 100644 --- a/backend/src/util/virtualTransactions.ts +++ b/backend/src/util/virtualTransactions.ts @@ -40,19 +40,25 @@ const virtualLinkTransaction = ( user: User, ): Transaction => { const linkDbTransaction: dbTransaction = { - id: -2, - userId: -1, - previous: -1, - typeId: TransactionTypeId.LINK_SUMMARY, - amount: amount.toDecimalPlaces(2, Decimal.ROUND_FLOOR), - balance: balance.toDecimalPlaces(2, Decimal.ROUND_DOWN), - balanceDate: validUntil, - decayStart: createdAt, - decay: decay.toDecimalPlaces(2, Decimal.ROUND_FLOOR), - memo: '', - creationDate: null, - contribution: null, - ...defaultModelFunctions, + id: -2, + userId: -1, + previous: -1, + typeId: TransactionTypeId.LINK_SUMMARY, + amount: amount.toDecimalPlaces(2, Decimal.ROUND_FLOOR), + balance: balance.toDecimalPlaces(2, Decimal.ROUND_DOWN), + balanceDate: validUntil, + decayStart: createdAt, + decay: decay.toDecimalPlaces(2, Decimal.ROUND_FLOOR), + memo: '', + creationDate: null, + contribution: null, + ...defaultModelFunctions, + userGradidoID: '', + userCommunityUuid: '', + userName: '', + linkedUserGradidoID: '', + linkedUserCommunityUuid: '', + linkedUserName: '' } return new Transaction(linkDbTransaction, user) } @@ -67,22 +73,28 @@ const virtualDecayTransaction = ( const decay = calculateDecay(balance, balanceDate, time) // const balance = decay.balance.minus(lastTransaction.balance) const decayDbTransaction: dbTransaction = { - id: -1, - userId: -1, - previous: -1, - typeId: TransactionTypeId.DECAY, - amount: decay.decay ? decay.roundedDecay : new Decimal(0), - balance: decay.balance - .toDecimalPlaces(2, Decimal.ROUND_DOWN) - .minus(holdAvailabeAmount.toString()) - .toDecimalPlaces(2, Decimal.ROUND_DOWN), - balanceDate: time, - decay: decay.decay ? decay.roundedDecay : new Decimal(0), - decayStart: decay.start, - memo: '', - creationDate: null, - contribution: null, - ...defaultModelFunctions, + id: -1, + userId: -1, + previous: -1, + typeId: TransactionTypeId.DECAY, + amount: decay.decay ? decay.roundedDecay : new Decimal(0), + balance: decay.balance + .toDecimalPlaces(2, Decimal.ROUND_DOWN) + .minus(holdAvailabeAmount.toString()) + .toDecimalPlaces(2, Decimal.ROUND_DOWN), + balanceDate: time, + decay: decay.decay ? decay.roundedDecay : new Decimal(0), + decayStart: decay.start, + memo: '', + creationDate: null, + contribution: null, + ...defaultModelFunctions, + userGradidoID: '', + userCommunityUuid: '', + userName: '', + linkedUserGradidoID: '', + linkedUserCommunityUuid: '', + linkedUserName: '' } return new Transaction(decayDbTransaction, user) } diff --git a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts new file mode 100644 index 000000000..b3f88f0d1 --- /dev/null +++ b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts @@ -0,0 +1,147 @@ +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({ type: 'int', unsigned: true, unique: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + name: 'transaction_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + transactionLinkId?: number | null + + @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: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ + name: 'user_gradido_id', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + userGradidoID: string + + @Column({ + name: 'user_community_uuid', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + userCommunityUuid: string + + @Column({ + name: 'user_name', + length: 512, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + userName: string + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_user_gradido_id', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserGradidoID: string + + @Column({ + name: 'linked_user_community_uuid', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserCommunityUuid: string + + @Column({ + name: 'linked_user_name', + length: 512, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserName: string + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: 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..3e3355b13 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 './0065-x-community-sendcoins-transactions_table/Transaction' diff --git a/database/migrations/0065-x-community-sendcoins-transactions_table.ts b/database/migrations/0065-x-community-sendcoins-transactions_table.ts index 73b854d70..d3228b8d9 100644 --- a/database/migrations/0065-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0065-x-community-sendcoins-transactions_table.ts @@ -62,6 +62,20 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 'ALTER TABLE `transactions` MODIFY COLUMN `linked_transaction_id` int(10) DEFAULT NULL NULL AFTER `linked_user_name`;', ) + await queryFn( + `UPDATE transactions t, users u SET t.user_gradido_id = u.gradido_id, t.user_name = concat(u.first_name, ' ', u.last_name) WHERE t.user_id = u.id and t.user_gradido_id is null;`, + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `user_gradido_id` char(36) NOT NULL AFTER `user_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `user_name` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL AFTER `user_community_uuid`;', + ) + + await queryFn( + `UPDATE transactions t, users u SET t.linked_user_gradido_id = u.gradido_id, t.linked_user_name = concat(u.first_name, ' ', u.last_name) WHERE t.linked_user_id = u.id and t.linked_user_id is null and t.linked_user_gradido_id is null;`, + ) + await queryFn(` CREATE TABLE IF NOT EXISTS \`pending_transactions\` ( \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -91,34 +105,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - /* - const userIds = await queryFn(` - SELECT user_id FROM transactions - WHERE NOT EXISTS (SELECT id FROM users WHERE id = user_id) GROUP BY user_id;`) - - for (let i = 0; i < missingUserIds.length; i++) { - let gradidoId = '' - let countIds: any[] = [] - do { - gradidoId = uuidv4() - countIds = await queryFn( - `SELECT COUNT(*) FROM \`users\` WHERE \`gradido_id\` = "${gradidoId}"`, - ) - } while (countIds[0] > 0) - - const userContact = (await queryFn(` - INSERT INTO user_contacts - (type, user_id, email, email_checked, created_at, deleted_at) - VALUES - ('EMAIL', ${missingUserIds[i].user_id}, 'deleted.user${missingUserIds[i].user_id}@gradido.net', 0, NOW(), NOW());`)) as unknown as OkPacket - - await queryFn(` - INSERT INTO users - (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) - VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) - } - */ } /* eslint-disable @typescript-eslint/no-empty-function */