From dc9efdae6713f14ae4d91d657c8babf40cc00e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Fri, 31 Mar 2023 20:12:59 +0200 Subject: [PATCH 01/40] first migration step --- ...-community-sendcoins-transactions_table.ts | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 database/migrations/0065-x-community-sendcoins-transactions_table.ts diff --git a/database/migrations/0065-x-community-sendcoins-transactions_table.ts b/database/migrations/0065-x-community-sendcoins-transactions_table.ts new file mode 100644 index 000000000..73b854d70 --- /dev/null +++ b/database/migrations/0065-x-community-sendcoins-transactions_table.ts @@ -0,0 +1,134 @@ +/* MIGRATION TO add users that have a transaction but do not exist */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `previous` int(10) unsigned DEFAULT NULL NULL AFTER `id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `type_id` int(10) DEFAULT NULL NULL AFTER `previous`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `transaction_link_id` int(10) unsigned DEFAULT NULL NULL AFTER `type_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `amount` decimal(40,20) DEFAULT NULL NULL AFTER `transaction_link_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `balance` decimal(40,20) DEFAULT NULL NULL AFTER `amount`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `balance_date` datetime(3) DEFAULT current_timestamp(3) NOT NULL AFTER `balance`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `decay` decimal(40,20) DEFAULT NULL NULL AFTER `balance_date`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `decay_start` datetime(3) DEFAULT NULL NULL AFTER `decay`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL AFTER `decay_start`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `creation_date` datetime(3) DEFAULT NULL NULL AFTER `memo`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `user_id` int(10) unsigned NOT NULL AFTER `creation_date`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `user_gradido_id` char(36) DEFAULT NULL NULL AFTER `user_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `user_community_uuid` char(36) DEFAULT NULL NULL AFTER `user_gradido_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `user_community_uuid`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `linked_user_id` int(10) unsigned DEFAULT NULL NULL AFTER `user_name`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `linked_user_gradido_id` char(36) DEFAULT NULL NULL AFTER `linked_user_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `linked_user_community_uuid` char(36) DEFAULT NULL NULL AFTER `linked_user_gradido_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `linked_user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `linked_user_community_uuid`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `linked_transaction_id` int(10) DEFAULT NULL NULL AFTER `linked_user_name`;', + ) + + await queryFn(` + CREATE TABLE IF NOT EXISTS \`pending_transactions\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`previous\` int(10) unsigned DEFAULT NULL NULL, + \`type_id\` int(10) DEFAULT NULL NULL, + \`transaction_link_id\` int(10) unsigned DEFAULT NULL NULL, + \`amount\` decimal(40,20) DEFAULT NULL NULL, + \`balance\` decimal(40,20) DEFAULT NULL NULL, + \`balance_date\` datetime(3) DEFAULT current_timestamp(3) NOT NULL, + \`decay\` decimal(40,20) DEFAULT NULL NULL, + \`decay_start\` datetime(3) DEFAULT NULL NULL, + \`memo\` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + \`creation_date\` datetime(3) DEFAULT NULL NULL, + \`user_id\` int(10) unsigned NOT NULL, + \`user_gradido_id\` char(36) NOT NULL, + \`user_community_uuid\` char(36) NOT NULL, + \`user_name\` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL, + \`linked_user_id\` int(10) unsigned DEFAULT NULL NULL, + \`linked_user_gradido_id\` char(36) NOT NULL, + \`linked_user_community_uuid\` char(36) NOT NULL, + \`linked_user_name\` varchar(512) NULL, + \`linked_transaction_id\` int(10) DEFAULT NULL NULL, + \`x_transaction_state\` varchar(100) NOT NULL COMMENT 'States to handle 2-Phase-Commit handshake', + \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + \`updated_at\` datetime(3) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3), + \`deleted_at\` datetime(3) NULL DEFAULT NULL, + 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 */ +/* eslint-disable-next-line @typescript-eslint/no-unused-vars */ +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_gradido_id`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_community_uuid`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_name`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_gradido_id`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_community_uuid`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_name`;') + await queryFn(`DROP TABLE IF EXISTS pending_transactions;`) +} From 588afdb8d7e122930f0f5f67b6b8a30d76d2af70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 4 Apr 2023 01:56:34 +0200 Subject: [PATCH 02/40] add new attributes for x-community-sendCoins --- backend/src/config/index.ts | 2 +- .../graphql/resolver/ContributionResolver.ts | 2 + .../graphql/resolver/TransactionResolver.ts | 8 + backend/src/util/virtualTransactions.ts | 70 +++++---- .../Transaction.ts | 147 ++++++++++++++++++ database/entity/Transaction.ts | 2 +- ...-community-sendcoins-transactions_table.ts | 42 ++--- 7 files changed, 214 insertions(+), 59 deletions(-) create mode 100644 database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts 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 */ From a900c163e3a62d2028fed9825f5d5d77402ccd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 4 Apr 2023 01:58:29 +0200 Subject: [PATCH 03/40] update cypress --- e2e-tests/yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index c0f623e47..20956c5d0 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -2193,10 +2193,10 @@ crypto-browserify@^3.0.0: randombytes "^2.0.0" randomfill "^1.0.3" -cypress@^10.4.0: - version "10.8.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.8.0.tgz#12a681f2642b6f13d636bab65d5b71abdb1497a5" - integrity sha512-QVse0dnLm018hgti2enKMVZR9qbIO488YGX06nH5j3Dg1isL38DwrBtyrax02CANU6y8F4EJUuyW6HJKw1jsFA== +cypress@^12.7.0: + version "12.9.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.9.0.tgz#e6ab43cf329fd7c821ef7645517649d72ccf0a12" + integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -2215,7 +2215,7 @@ cypress@^10.4.0: commander "^5.1.0" common-tags "^1.8.0" dayjs "^1.10.4" - debug "^4.3.2" + debug "^4.3.4" enquirer "^2.3.6" eventemitter2 "6.4.7" execa "4.1.0" From c9631f0028dfa38daa063b377a8bf02dc7c86870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 4 Apr 2023 02:20:59 +0200 Subject: [PATCH 04/40] init new tx-attributes --- backend/src/graphql/resolver/TransactionLinkResolver.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index a5f8c0ee6..d10a81c51 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -266,6 +266,8 @@ export class TransactionLinkResolver { 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 From 6bedba53c48d1c7ef0ab2b5919b0b13fe07af279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 4 Apr 2023 23:12:05 +0200 Subject: [PATCH 05/40] linting --- backend/src/util/virtualTransactions.ts | 82 ++++++++++++------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts index cd73f9feb..d06d85908 100644 --- a/backend/src/util/virtualTransactions.ts +++ b/backend/src/util/virtualTransactions.ts @@ -40,25 +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, - userGradidoID: '', - userCommunityUuid: '', - userName: '', - linkedUserGradidoID: '', - linkedUserCommunityUuid: '', - linkedUserName: '' + 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) } @@ -73,28 +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, - userGradidoID: '', - userCommunityUuid: '', - userName: '', - linkedUserGradidoID: '', - linkedUserCommunityUuid: '', - linkedUserName: '' + 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) } From 71f0f6c7f99cca6106c02a8825f76f2f56c1785f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 6 Apr 2023 15:59:59 +0200 Subject: [PATCH 06/40] rework PR-comments --- .../graphql/resolver/ContributionResolver.ts | 3 ++- .../resolver/TransactionLinkResolver.ts | 3 ++- .../graphql/resolver/TransactionResolver.ts | 9 +++++---- backend/src/util/utilities.ts | 19 ++++++++++++++++++ backend/src/util/virtualTransactions.ts | 20 +++++++++---------- .../Transaction.ts | 20 +++++++++---------- ...-community-sendcoins-transactions_table.ts | 3 ++- 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 741ed2a83..2bb2e0faf 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -55,6 +55,7 @@ import { } from './util/creations' import { findContributions } from './util/findContributions' import { getLastTransaction } from './util/getLastTransaction' +import { fullName } from '@/util/utilities' @Resolver() export class ContributionResolver { @@ -502,7 +503,7 @@ export class ContributionResolver { transaction.memo = contribution.memo transaction.userId = contribution.userId transaction.userGradidoID = user.gradidoID - transaction.userName = user.firstName + ' ' + user.lastName + transaction.userName = fullName(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/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 856fc5c28..6490b8c9d 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -40,6 +40,7 @@ import { executeTransaction } from './TransactionResolver' import { getUserCreation, validateContribution } from './util/creations' import { getLastTransaction } from './util/getLastTransaction' import transactionLinkList from './util/transactionLinkList' +import { fullName } from '@/util/utilities' // TODO: do not export, test it inside the resolver export const transactionLinkCode = (date: Date): string => { @@ -267,7 +268,7 @@ export class TransactionLinkResolver { transaction.memo = contribution.memo transaction.userId = contribution.userId transaction.userGradidoID = user.gradidoID - transaction.userName = user.firstName + ' ' + user.lastName + transaction.userName = fullName(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 5414de413..44cf35f7d 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -37,6 +37,7 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' import { findUserByIdentifier } from './util/findUserByIdentifier' import { getLastTransaction } from './util/getLastTransaction' import { getTransactionList } from './util/getTransactionList' +import { fullName } from '@/util/utilities' export const executeTransaction = async ( amount: Decimal, @@ -88,10 +89,10 @@ export const executeTransaction = async ( transactionSend.memo = memo transactionSend.userId = sender.id transactionSend.userGradidoID = sender.gradidoID - transactionSend.userName = sender.firstName + ' ' + sender.lastName + transactionSend.userName = fullName(sender.firstName, sender.lastName) transactionSend.linkedUserId = recipient.id transactionSend.linkedUserGradidoID = recipient.gradidoID - transactionSend.linkedUserName = recipient.firstName + ' ' + recipient.lastName + transactionSend.linkedUserName = fullName(recipient.firstName, recipient.lastName) transactionSend.amount = amount.mul(-1) transactionSend.balance = sendBalance.balance transactionSend.balanceDate = receivedCallDate @@ -108,10 +109,10 @@ export const executeTransaction = async ( transactionReceive.memo = memo transactionReceive.userId = recipient.id transactionReceive.userGradidoID = recipient.gradidoID - transactionReceive.userName = recipient.firstName + ' ' + recipient.lastName + transactionReceive.userName = fullName(recipient.firstName, recipient.lastName) transactionReceive.linkedUserId = sender.id transactionReceive.linkedUserGradidoID = sender.gradidoID - transactionReceive.linkedUserName = sender.firstName + ' ' + sender.lastName + transactionReceive.linkedUserName = fullName(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/utilities.ts b/backend/src/util/utilities.ts index 2cf53f1e4..9a318f576 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -14,3 +14,22 @@ export const decimalSeparatorByLanguage = (a: Decimal, language: string): string i18n.setLocale(rememberLocaleToRestore) return result } + +export const fullName = (firstName: string, lastName: string): string => { + return [firstName, lastName].filter(Boolean).join(' ') +} + +export const userName = (f?: string, l?: string): string | null => { + let name: string | null + if(f && l) { + name = f + ' ' + l + } else if (f && !l) { + name = f + } else if (!f && l) { + name = l + } else { + name = null + } + + return name +} \ No newline at end of file diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts index a953552b2..2bc2a591e 100644 --- a/backend/src/util/virtualTransactions.ts +++ b/backend/src/util/virtualTransactions.ts @@ -55,11 +55,11 @@ const virtualLinkTransaction = ( contribution: null, ...defaultModelFunctions, userGradidoID: '', - userCommunityUuid: '', - userName: '', - linkedUserGradidoID: '', - linkedUserCommunityUuid: '', - linkedUserName: '', + userCommunityUuid: null, + userName: null, + linkedUserGradidoID: null, + linkedUserCommunityUuid: null, + linkedUserName: null, } return new Transaction(linkDbTransaction, user) } @@ -91,11 +91,11 @@ const virtualDecayTransaction = ( contribution: null, ...defaultModelFunctions, userGradidoID: '', - userCommunityUuid: '', - userName: '', - linkedUserGradidoID: '', - linkedUserCommunityUuid: '', - linkedUserName: '', + userCommunityUuid: null, + userName: null, + linkedUserGradidoID: null, + linkedUserCommunityUuid: null, + linkedUserName: null, } 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 index b3f88f0d1..050661824 100644 --- a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts +++ b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts @@ -86,18 +86,18 @@ export class Transaction extends BaseEntity { @Column({ name: 'user_community_uuid', length: 36, - nullable: false, + nullable: true, collation: 'utf8mb4_unicode_ci', }) - userCommunityUuid: string + userCommunityUuid: string | null @Column({ name: 'user_name', length: 512, - nullable: false, + nullable: true, collation: 'utf8mb4_unicode_ci', }) - userName: string + userName: string | null @Column({ name: 'linked_user_id', @@ -111,26 +111,26 @@ export class Transaction extends BaseEntity { @Column({ name: 'linked_user_gradido_id', length: 36, - nullable: false, + nullable: true, collation: 'utf8mb4_unicode_ci', }) - linkedUserGradidoID: string + linkedUserGradidoID: string | null @Column({ name: 'linked_user_community_uuid', length: 36, - nullable: false, + nullable: true, collation: 'utf8mb4_unicode_ci', }) - linkedUserCommunityUuid: string + linkedUserCommunityUuid: string | null @Column({ name: 'linked_user_name', length: 512, - nullable: false, + nullable: true, collation: 'utf8mb4_unicode_ci', }) - linkedUserName: string + linkedUserName: string | null @Column({ name: 'linked_transaction_id', diff --git a/database/migrations/0065-x-community-sendcoins-transactions_table.ts b/database/migrations/0065-x-community-sendcoins-transactions_table.ts index d3228b8d9..a09d416a7 100644 --- a/database/migrations/0065-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0065-x-community-sendcoins-transactions_table.ts @@ -68,10 +68,11 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 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;`, ) From c62532c89ae2acf7beef94c4127e2ca6bc8884b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 17 Apr 2023 12:45:20 +0200 Subject: [PATCH 07/40] linting --- backend/src/graphql/resolver/ContributionResolver.ts | 2 +- backend/src/graphql/resolver/TransactionLinkResolver.ts | 2 +- backend/src/graphql/resolver/TransactionResolver.ts | 2 +- backend/src/util/utilities.ts | 8 ++++---- .../Transaction.ts | 4 ++++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 357908bdc..696ed9ea7 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -44,6 +44,7 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { calculateDecay } from '@/util/decay' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' +import { fullName } from '@/util/utilities' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' import { @@ -55,7 +56,6 @@ import { } from './util/creations' import { findContributions } from './util/findContributions' import { getLastTransaction } from './util/getLastTransaction' -import { fullName } from '@/util/utilities' @Resolver() export class ContributionResolver { diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 914b2c081..a97078f66 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -34,13 +34,13 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { calculateDecay } from '@/util/decay' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' +import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' import { executeTransaction } from './TransactionResolver' import { getUserCreation, validateContribution } from './util/creations' import { getLastTransaction } from './util/getLastTransaction' import { transactionLinkList } from './util/transactionLinkList' -import { fullName } from '@/util/utilities' // TODO: do not export, test it inside the resolver export const transactionLinkCode = (date: Date): string => { diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 65aa29435..7e2a10404 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -29,6 +29,7 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { communityUser } from '@/util/communityUser' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' +import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions' @@ -37,7 +38,6 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' import { findUserByIdentifier } from './util/findUserByIdentifier' import { getLastTransaction } from './util/getLastTransaction' import { getTransactionList } from './util/getTransactionList' -import { fullName } from '@/util/utilities' export const executeTransaction = async ( amount: Decimal, diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index 9a318f576..4dc71ff7f 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -16,12 +16,12 @@ export const decimalSeparatorByLanguage = (a: Decimal, language: string): string } export const fullName = (firstName: string, lastName: string): string => { - return [firstName, lastName].filter(Boolean).join(' ') + return [firstName, lastName].filter(Boolean).join(' ') } export const userName = (f?: string, l?: string): string | null => { let name: string | null - if(f && l) { + if (f && l) { name = f + ' ' + l } else if (f && !l) { name = f @@ -30,6 +30,6 @@ export const userName = (f?: string, l?: string): string | null => { } else { name = null } - + return name -} \ No newline at end of file +} diff --git a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts index 050661824..0da9a2265 100644 --- a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts +++ b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts @@ -144,4 +144,8 @@ export class Transaction extends BaseEntity { @OneToOne(() => Contribution, (contribution) => contribution.transaction) @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) contribution?: Contribution | null + + @OneToOne(() => Transaction) + @JoinColumn({ name: 'previous' }) + previousTransaction?: Transaction | null } From 4a33703f054853d6cf8d410d3f5d5afd6d050714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 19 Apr 2023 01:50:53 +0200 Subject: [PATCH 08/40] linting --- .../migrations/0065-x-community-sendcoins-transactions_table.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/database/migrations/0065-x-community-sendcoins-transactions_table.ts b/database/migrations/0065-x-community-sendcoins-transactions_table.ts index a09d416a7..9f80460ed 100644 --- a/database/migrations/0065-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0065-x-community-sendcoins-transactions_table.ts @@ -105,7 +105,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`deleted_at\` datetime(3) NULL DEFAULT NULL, PRIMARY KEY (\`id\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - } /* eslint-disable @typescript-eslint/no-empty-function */ From 9c6296610963623f8c5bf122e2b481848fb47688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Wed, 19 Apr 2023 23:03:27 +0200 Subject: [PATCH 09/40] add explicit type: 'varchar' for string columns in transaction entity --- .../Transaction.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts index 0da9a2265..9202f9fd3 100644 --- a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts +++ b/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts @@ -77,6 +77,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'user_gradido_id', + type: 'varchar', length: 36, nullable: false, collation: 'utf8mb4_unicode_ci', @@ -85,6 +86,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'user_community_uuid', + type: 'varchar', length: 36, nullable: true, collation: 'utf8mb4_unicode_ci', @@ -93,6 +95,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'user_name', + type: 'varchar', length: 512, nullable: true, collation: 'utf8mb4_unicode_ci', @@ -110,6 +113,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'linked_user_gradido_id', + type: 'varchar', length: 36, nullable: true, collation: 'utf8mb4_unicode_ci', @@ -118,6 +122,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'linked_user_community_uuid', + type: 'varchar', length: 36, nullable: true, collation: 'utf8mb4_unicode_ci', @@ -126,6 +131,7 @@ export class Transaction extends BaseEntity { @Column({ name: 'linked_user_name', + type: 'varchar', length: 512, nullable: true, collation: 'utf8mb4_unicode_ci', From 870c97ce71231febd4ab4781eb51c8b6271a6f90 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 3 May 2023 13:02:32 +0200 Subject: [PATCH 10/40] rfactor federation clients --- .../federation/client/1_0/FederationClient.ts | 42 -------------- .../federation/client/1_1/FederationClient.ts | 42 -------------- backend/src/federation/client/Client.ts | 57 +++++++++++++++++++ backend/src/federation/client/Client_1_0.ts | 54 ++++++++++++++++++ backend/src/federation/client/Client_1_1.ts | 5 ++ .../src/federation/client/GraphQLGetClient.ts | 43 -------------- backend/src/federation/validateCommunities.ts | 18 +----- 7 files changed, 118 insertions(+), 143 deletions(-) delete mode 100644 backend/src/federation/client/1_0/FederationClient.ts delete mode 100644 backend/src/federation/client/1_1/FederationClient.ts create mode 100644 backend/src/federation/client/Client.ts create mode 100644 backend/src/federation/client/Client_1_0.ts create mode 100644 backend/src/federation/client/Client_1_1.ts delete mode 100644 backend/src/federation/client/GraphQLGetClient.ts diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts deleted file mode 100644 index 13f05e761..000000000 --- a/backend/src/federation/client/1_0/FederationClient.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { Community as DbCommunity } from '@entity/Community' -import { gql } from 'graphql-request' - -import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient' -import { LogError } from '@/server/LogError' -import { backendLogger as logger } from '@/server/logger' - -export async function requestGetPublicKey(dbCom: DbCommunity): Promise { - let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/' - endpoint = `${endpoint}${dbCom.apiVersion}/` - logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`) - - const graphQLClient = GraphQLGetClient.getInstance(endpoint) - logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`) - const query = gql` - query { - getPublicKey { - publicKey - } - } - ` - const variables = {} - - try { - const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest( - query, - variables, - ) - logger.debug(`Response-Data:`, data, errors, extensions, headers, status) - if (data) { - logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) - logger.info(`requestGetPublicKey processed successfully`) - return data.getPublicKey.publicKey - } - logger.warn(`requestGetPublicKey processed without response data`) - } catch (err) { - throw new LogError(`Request-Error:`, err) - } -} diff --git a/backend/src/federation/client/1_1/FederationClient.ts b/backend/src/federation/client/1_1/FederationClient.ts deleted file mode 100644 index bda185fba..000000000 --- a/backend/src/federation/client/1_1/FederationClient.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import { Community as DbCommunity } from '@entity/Community' -import { gql } from 'graphql-request' - -import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient' -import { LogError } from '@/server/LogError' -import { backendLogger as logger } from '@/server/logger' - -export async function requestGetPublicKey(dbCom: DbCommunity): Promise { - let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/' - endpoint = `${endpoint}${dbCom.apiVersion}/` - logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`) - - const graphQLClient = GraphQLGetClient.getInstance(endpoint) - logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`) - const query = gql` - query { - getPublicKey { - publicKey - } - } - ` - const variables = {} - - try { - const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest( - query, - variables, - ) - logger.debug(`Response-Data:`, data, errors, extensions, headers, status) - if (data) { - logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) - logger.info(`requestGetPublicKey processed successfully`) - return data.getPublicKey.publicKey - } - logger.warn(`requestGetPublicKey processed without response data`) - } catch (err) { - throw new LogError(`Request-Error:`, err) - } -} diff --git a/backend/src/federation/client/Client.ts b/backend/src/federation/client/Client.ts new file mode 100644 index 000000000..e285b591c --- /dev/null +++ b/backend/src/federation/client/Client.ts @@ -0,0 +1,57 @@ +import { Community as DbCommunity } from '@entity/Community' + +import { ApiVersionType } from '@/federation/enum/apiVersionType' + +// eslint-disable-next-line camelcase +import { Client_1_0 } from './Client_1_0' +// eslint-disable-next-line camelcase +import { Client_1_1 } from './Client_1_1' + +// eslint-disable-next-line camelcase +type FederationClient = Client_1_0 | Client_1_1 + +type ClientInstance = { + dbCom: DbCommunity + // eslint-disable-next-line no-use-before-define + client: FederationClient +} + +export class Client { + private static instanceArray: ClientInstance[] = [] + + /** + * The Singleton's constructor should always be private to prevent direct + * construction calls with the `new` operator. + */ + // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function + private constructor() {} + + private static createFederationClient = (dbCom: DbCommunity) => { + switch (dbCom.apiVersion) { + case ApiVersionType.V1_0: + return new Client_1_0(dbCom) + case ApiVersionType.V1_1: + return new Client_1_1(dbCom) + default: + return null + } + } + + /** + * The static method that controls the access to the singleton instance. + * + * This implementation let you subclass the Singleton class while keeping + * just one instance of each subclass around. + */ + public static getInstance(dbCom: DbCommunity): FederationClient | null { + const instance = Client.instanceArray.find((instance) => instance.dbCom === dbCom) + if (instance) { + return instance.client + } + const client = Client.createFederationClient(dbCom) + if (client) { + Client.instanceArray.push({ dbCom, client } as ClientInstance) + } + return client + } +} diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts new file mode 100644 index 000000000..6adfaa48c --- /dev/null +++ b/backend/src/federation/client/Client_1_0.ts @@ -0,0 +1,54 @@ +import { Community as DbCommunity } from '@entity/Community' +import { GraphQLClient, gql } from 'graphql-request' + +import { LogError } from '@/server/LogError' +import { backendLogger as logger } from '@/server/logger' + +// eslint-disable-next-line camelcase +export class Client_1_0 { + dbCom: DbCommunity + endpoint: string + client: GraphQLClient + + constructor(dbCom: DbCommunity) { + this.dbCom = dbCom + this.endpoint = `${dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'}${ + dbCom.apiVersion + }/` + this.client = new GraphQLClient(this.endpoint, { + method: 'GET', + jsonSerializer: { + parse: JSON.parse, + stringify: JSON.stringify, + }, + }) + } + + requestGetPublicKey = async (): Promise => { + logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) + + const query = gql` + query { + getPublicKey { + publicKey + } + } + ` + + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { data, errors, headers, status } = await this.client.rawRequest(query) + logger.debug(`Response-Data:`, data, errors, headers, status) + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) + logger.info(`requestGetPublicKey processed successfully`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access + return data.getPublicKey.publicKey + } + logger.warn(`requestGetPublicKey processed without response data`) + } catch (err) { + throw new LogError(`Request-Error:`, err) + } + } +} diff --git a/backend/src/federation/client/Client_1_1.ts b/backend/src/federation/client/Client_1_1.ts new file mode 100644 index 000000000..8525acc5d --- /dev/null +++ b/backend/src/federation/client/Client_1_1.ts @@ -0,0 +1,5 @@ +// eslint-disable-next-line camelcase +import { Client_1_0 } from './Client_1_0' + +// eslint-disable-next-line camelcase +export class Client_1_1 extends Client_1_0 {} diff --git a/backend/src/federation/client/GraphQLGetClient.ts b/backend/src/federation/client/GraphQLGetClient.ts deleted file mode 100644 index 2f5281532..000000000 --- a/backend/src/federation/client/GraphQLGetClient.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { GraphQLClient } from 'graphql-request' -import { PatchedRequestInit } from 'graphql-request/dist/types' - -type ClientInstance = { - url: string - // eslint-disable-next-line no-use-before-define - client: GraphQLGetClient -} - -export class GraphQLGetClient extends GraphQLClient { - private static instanceArray: ClientInstance[] = [] - - /** - * The Singleton's constructor should always be private to prevent direct - * construction calls with the `new` operator. - */ - // eslint-disable-next-line no-useless-constructor - private constructor(url: string, options?: PatchedRequestInit) { - super(url, options) - } - - /** - * The static method that controls the access to the singleton instance. - * - * This implementation let you subclass the Singleton class while keeping - * just one instance of each subclass around. - */ - public static getInstance(url: string): GraphQLGetClient { - const instance = GraphQLGetClient.instanceArray.find((instance) => instance.url === url) - if (instance) { - return instance.client - } - const client = new GraphQLGetClient(url, { - method: 'GET', - jsonSerializer: { - parse: JSON.parse, - stringify: JSON.stringify, - }, - }) - GraphQLGetClient.instanceArray.push({ url, client } as ClientInstance) - return client - } -} diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 0e8c7cb12..11406199d 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -4,10 +4,7 @@ import { Community as DbCommunity } from '@entity/Community' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' -// eslint-disable-next-line camelcase -import { requestGetPublicKey as v1_0_requestGetPublicKey } from './client/1_0/FederationClient' -// eslint-disable-next-line camelcase -import { requestGetPublicKey as v1_1_requestGetPublicKey } from './client/1_1/FederationClient' +import { Client } from './client/Client' import { ApiVersionType } from './enum/apiVersionType' export function startValidateCommunities(timerInterval: number): void { @@ -38,7 +35,7 @@ export async function validateCommunities(): Promise { `Federation: validate publicKey for dbCom: ${dbCom.id} with apiVersion=${dbCom.apiVersion}`, ) try { - const pubKey = await invokeVersionedRequestGetPublicKey(dbCom) + const pubKey = await Client.getInstance(dbCom)?.requestGetPublicKey() logger.info( 'Federation: received publicKey from endpoint', pubKey, @@ -73,14 +70,3 @@ export async function validateCommunities(): Promise { function isLogError(err: unknown) { return err instanceof LogError } - -async function invokeVersionedRequestGetPublicKey(dbCom: DbCommunity): Promise { - switch (dbCom.apiVersion) { - case ApiVersionType.V1_0: - return v1_0_requestGetPublicKey(dbCom) - case ApiVersionType.V1_1: - return v1_1_requestGetPublicKey(dbCom) - default: - return undefined - } -} From d3a2df2878d9f2ebdcce8c8018672f08a76ac133 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 3 May 2023 13:03:27 +0200 Subject: [PATCH 11/40] remove obsolete function --- backend/src/federation/validateCommunities.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 11406199d..dfd14bdac 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -54,7 +54,7 @@ export async function validateCommunities(): Promise { // DbCommunity.delete({ id: dbCom.id }) } } catch (err) { - if (!isLogError(err)) { + if (!(err instanceof LogError)) { logger.error(`Error:`, err) } } @@ -66,7 +66,3 @@ export async function validateCommunities(): Promise { } } } - -function isLogError(err: unknown) { - return err instanceof LogError -} From 4850923f17078a81d31ffee2b35dfda14e706751 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 3 May 2023 13:29:56 +0200 Subject: [PATCH 12/40] variables must be defined --- backend/src/federation/client/Client_1_0.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 6adfaa48c..efbe497c8 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -35,9 +35,11 @@ export class Client_1_0 { } ` + const variables = {} + try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data, errors, headers, status } = await this.client.rawRequest(query) + const { data, errors, headers, status } = await this.client.rawRequest(query, variables) logger.debug(`Response-Data:`, data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access From 1c6142220f5b86a23fc35cbee2631f9855e07730 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 01:40:50 +0200 Subject: [PATCH 13/40] rename getPublicKey function --- backend/src/federation/client/Client_1_0.ts | 2 +- backend/src/federation/validateCommunities.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index efbe497c8..9ce3b6b12 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -24,7 +24,7 @@ export class Client_1_0 { }) } - requestGetPublicKey = async (): Promise => { + getPublicKey = async (): Promise => { logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) const query = gql` diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index dfd14bdac..14bf4dd3d 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -35,7 +35,7 @@ export async function validateCommunities(): Promise { `Federation: validate publicKey for dbCom: ${dbCom.id} with apiVersion=${dbCom.apiVersion}`, ) try { - const pubKey = await Client.getInstance(dbCom)?.requestGetPublicKey() + const pubKey = await Client.getInstance(dbCom)?.getPublicKey() logger.info( 'Federation: received publicKey from endpoint', pubKey, From 81552e51ddd50949ffa26efb7470e721a9d93c26 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 01:51:36 +0200 Subject: [PATCH 14/40] properly reuse graphql client --- backend/src/federation/client/Client.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/federation/client/Client.ts b/backend/src/federation/client/Client.ts index e285b591c..a33cb4832 100644 --- a/backend/src/federation/client/Client.ts +++ b/backend/src/federation/client/Client.ts @@ -11,7 +11,7 @@ import { Client_1_1 } from './Client_1_1' type FederationClient = Client_1_0 | Client_1_1 type ClientInstance = { - dbCom: DbCommunity + id: number // eslint-disable-next-line no-use-before-define client: FederationClient } @@ -44,13 +44,13 @@ export class Client { * just one instance of each subclass around. */ public static getInstance(dbCom: DbCommunity): FederationClient | null { - const instance = Client.instanceArray.find((instance) => instance.dbCom === dbCom) + const instance = Client.instanceArray.find((instance) => instance.id === dbCom.id) if (instance) { return instance.client } const client = Client.createFederationClient(dbCom) if (client) { - Client.instanceArray.push({ dbCom, client } as ClientInstance) + Client.instanceArray.push({ id: dbCom.id, client } as ClientInstance) } return client } From 1fa33963966fbb0185e5e530242d544ac883410c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 01:55:14 +0200 Subject: [PATCH 15/40] externalize the graphql query --- backend/src/federation/client/Client_1_0.ts | 16 ++++++---------- backend/src/federation/query/getPublicKey.ts | 9 +++++++++ 2 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 backend/src/federation/query/getPublicKey.ts diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 9ce3b6b12..b0fb825ee 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -1,6 +1,7 @@ import { Community as DbCommunity } from '@entity/Community' -import { GraphQLClient, gql } from 'graphql-request' +import { GraphQLClient } from 'graphql-request' +import { getPublicKey } from '@/federation/query/getPublicKey' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' @@ -27,19 +28,14 @@ export class Client_1_0 { getPublicKey = async (): Promise => { logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) - const query = gql` - query { - getPublicKey { - publicKey - } - } - ` - const variables = {} try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data, errors, headers, status } = await this.client.rawRequest(query, variables) + const { data, errors, headers, status } = await this.client.rawRequest( + getPublicKey, + variables, + ) logger.debug(`Response-Data:`, data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access diff --git a/backend/src/federation/query/getPublicKey.ts b/backend/src/federation/query/getPublicKey.ts new file mode 100644 index 000000000..a772a0cf1 --- /dev/null +++ b/backend/src/federation/query/getPublicKey.ts @@ -0,0 +1,9 @@ +import { gql } from 'graphql-request' + +export const getPublicKey = gql` + query { + getPublicKey { + publicKey + } + } +` From d636f922618b62bc352806a08cbbc1153566a164 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 01:57:43 +0200 Subject: [PATCH 16/40] fix problem in federation when variables are not defined --- backend/src/federation/client/Client_1_0.ts | 6 +----- federation/src/server/plugins.ts | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index b0fb825ee..df239db92 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -27,14 +27,10 @@ export class Client_1_0 { getPublicKey = async (): Promise => { logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) - - const variables = {} - try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const { data, errors, headers, status } = await this.client.rawRequest( - getPublicKey, - variables, + getPublicKey ) logger.debug(`Response-Data:`, data, errors, headers, status) if (data) { diff --git a/federation/src/server/plugins.ts b/federation/src/server/plugins.ts index 541c68ca2..38fdfbe9f 100644 --- a/federation/src/server/plugins.ts +++ b/federation/src/server/plugins.ts @@ -23,8 +23,8 @@ const setHeadersPlugin = { const filterVariables = (variables: any) => { const vars = clonedeep(variables) - if (vars.password) vars.password = '***' - if (vars.passwordNew) vars.passwordNew = '***' + if (vars && vars.password) vars.password = '***' + if (vars && vars.passwordNew) vars.passwordNew = '***' return vars } From 950ff2f9b680e29e79c5d4a8e415e2e212f3be23 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 02:01:45 +0200 Subject: [PATCH 17/40] lint --- backend/src/federation/client/Client_1_0.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index df239db92..317306048 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -29,9 +29,7 @@ export class Client_1_0 { logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data, errors, headers, status } = await this.client.rawRequest( - getPublicKey - ) + const { data, errors, headers, status } = await this.client.rawRequest(getPublicKey) logger.debug(`Response-Data:`, data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access From 0a6c29bca3012f5e763cd69bd24fb2b67db64e8e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 11:28:53 +0200 Subject: [PATCH 18/40] variables must be transmitted due to backward compatibility --- backend/src/federation/client/Client_1_0.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 317306048..d425ccea1 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -29,7 +29,7 @@ export class Client_1_0 { logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data, errors, headers, status } = await this.client.rawRequest(getPublicKey) + const { data, errors, headers, status } = await this.client.rawRequest(getPublicKey, {}) logger.debug(`Response-Data:`, data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access From 6a63e5956d3641a0bd3ea17cc903a1392a209757 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Thu, 4 May 2023 20:48:43 +0200 Subject: [PATCH 19/40] adaptions after master-merge --- .../Transaction.ts | 0 database/entity/Transaction.ts | 2 +- ...able.ts => 0066-x-community-sendcoins-transactions_table.ts} | 0 dht-node/src/config/index.ts | 2 +- federation/src/config/index.ts | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename database/entity/{0065-x-community-sendcoins-transactions_table => 0066-x-community-sendcoins-transactions_table}/Transaction.ts (100%) rename database/migrations/{0065-x-community-sendcoins-transactions_table.ts => 0066-x-community-sendcoins-transactions_table.ts} (100%) diff --git a/database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts b/database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts similarity index 100% rename from database/entity/0065-x-community-sendcoins-transactions_table/Transaction.ts rename to database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index 3e3355b13..4000e3c85 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0065-x-community-sendcoins-transactions_table/Transaction' +export { Transaction } from './0066-x-community-sendcoins-transactions_table/Transaction' diff --git a/database/migrations/0065-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts similarity index 100% rename from database/migrations/0065-x-community-sendcoins-transactions_table.ts rename to database/migrations/0066-x-community-sendcoins-transactions_table.ts diff --git a/dht-node/src/config/index.ts b/dht-node/src/config/index.ts index 5c4676337..eca5dbbb5 100644 --- a/dht-node/src/config/index.ts +++ b/dht-node/src/config/index.ts @@ -3,7 +3,7 @@ import dotenv from 'dotenv' dotenv.config() const constants = { - DB_VERSION: '0065-refactor_communities_table', + DB_VERSION: '0066-x-community-sendcoins-transactions_table', LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL || 'info', diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 70a155d63..66d8a056c 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -11,7 +11,7 @@ Decimal.set({ */ const constants = { - DB_VERSION: '0065-refactor_communities_table', + DB_VERSION: '0066-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 From 2d03ae938ab7d05dfa449b09f0cd376481a08ad5 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 22:50:06 +0200 Subject: [PATCH 20/40] merge conflict --- backend/src/federation/client/Client.ts | 6 +++--- backend/src/federation/client/Client_1_0.ts | 6 +++--- backend/src/federation/validateCommunities.ts | 13 ------------- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/backend/src/federation/client/Client.ts b/backend/src/federation/client/Client.ts index a33cb4832..515945eb5 100644 --- a/backend/src/federation/client/Client.ts +++ b/backend/src/federation/client/Client.ts @@ -1,4 +1,4 @@ -import { Community as DbCommunity } from '@entity/Community' +import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity' import { ApiVersionType } from '@/federation/enum/apiVersionType' @@ -26,7 +26,7 @@ export class Client { // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function private constructor() {} - private static createFederationClient = (dbCom: DbCommunity) => { + private static createFederationClient = (dbCom: DbFederatedCommunity) => { switch (dbCom.apiVersion) { case ApiVersionType.V1_0: return new Client_1_0(dbCom) @@ -43,7 +43,7 @@ export class Client { * This implementation let you subclass the Singleton class while keeping * just one instance of each subclass around. */ - public static getInstance(dbCom: DbCommunity): FederationClient | null { + public static getInstance(dbCom: DbFederatedCommunity): FederationClient | null { const instance = Client.instanceArray.find((instance) => instance.id === dbCom.id) if (instance) { return instance.client diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index d425ccea1..456196bcb 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -1,4 +1,4 @@ -import { Community as DbCommunity } from '@entity/Community' +import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity' import { GraphQLClient } from 'graphql-request' import { getPublicKey } from '@/federation/query/getPublicKey' @@ -7,11 +7,11 @@ import { backendLogger as logger } from '@/server/logger' // eslint-disable-next-line camelcase export class Client_1_0 { - dbCom: DbCommunity + dbCom: DbFederatedCommunity endpoint: string client: GraphQLClient - constructor(dbCom: DbCommunity) { + constructor(dbCom: DbFederatedCommunity) { this.dbCom = dbCom this.endpoint = `${dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'}${ dbCom.apiVersion diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 2bc531eaf..6879f98e7 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -69,16 +69,3 @@ export async function validateCommunities(): Promise { } } } - -async function invokeVersionedRequestGetPublicKey( - dbCom: DbFederatedCommunity, -): Promise { - switch (dbCom.apiVersion) { - case ApiVersionType.V1_0: - return v1_0_requestGetPublicKey(dbCom) - case ApiVersionType.V1_1: - return v1_1_requestGetPublicKey(dbCom) - default: - return undefined - } -} From 2abf228ca9f943f9f3e73c748f9526ffe7d651a3 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 22:53:55 +0200 Subject: [PATCH 21/40] merge --- backend/src/federation/client/Client_1_0.ts | 26 ++++++----- backend/src/federation/validateCommunities.ts | 46 ++++++------------- 2 files changed, 30 insertions(+), 42 deletions(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 456196bcb..77a72cce8 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -26,21 +26,25 @@ export class Client_1_0 { } getPublicKey = async (): Promise => { - logger.info(`requestGetPublicKey with endpoint='${this.endpoint}'...`) + logger.info('Federation: getPublicKey from endpoint', this.endpoint) try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data, errors, headers, status } = await this.client.rawRequest(getPublicKey, {}) - logger.debug(`Response-Data:`, data, errors, headers, status) - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) - logger.info(`requestGetPublicKey processed successfully`) - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access - return data.getPublicKey.publicKey + const { data } = await this.client.rawRequest(getPublicKey, {}) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (!data?.getPublicKey?.publicKey) { + logger.warn('Federation: getPublicKey without response data from endpoint', this.endpoint) + return } - logger.warn(`requestGetPublicKey processed without response data`) + logger.info( + 'Federation: getPublicKey successfull from endpoint', + this.endpoint, + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + data.getPublicKey.publicKey, + ) + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access + return data.getPublicKey.publicKey } catch (err) { - throw new LogError(`Request-Error:`, err) + logger.warn('Federation: getPublicKey failed for endpoint', this.endpoint) } } } diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 6879f98e7..fcce9d0d8 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -3,7 +3,6 @@ import { IsNull } from '@dbTools/typeorm' import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity' -import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { Client } from './client/Client' @@ -33,39 +32,24 @@ export async function validateCommunities(): Promise { logger.debug('Federation: dbCom', dbCom) const apiValueStrings: string[] = Object.values(ApiVersionType) logger.debug(`suppported ApiVersions=`, apiValueStrings) - if (apiValueStrings.includes(dbCom.apiVersion)) { - logger.debug( - `Federation: validate publicKey for dbCom: ${dbCom.id} with apiVersion=${dbCom.apiVersion}`, - ) - try { - const pubKey = await Client.getInstance(dbCom)?.getPublicKey() - logger.info( - 'Federation: received publicKey from endpoint', + if (!apiValueStrings.includes(dbCom.apiVersion)) { + logger.warn('Federation: dbCom with unsupported apiVersion', dbCom.endPoint, dbCom.apiVersion) + continue + } + try { + const client = Client.getInstance(dbCom) + const pubKey = await client?.getPublicKey() + if (pubKey && pubKey === dbCom.publicKey.toString()) { + await DbFederatedCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) + } else { + logger.warn( + 'Federation: received not matching publicKey:', pubKey, - `${dbCom.endPoint}/${dbCom.apiVersion}`, + dbCom.publicKey.toString(), ) - if (pubKey && pubKey === dbCom.publicKey.toString()) { - logger.info(`Federation: matching publicKey: ${pubKey}`) - await DbFederatedCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) - logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`) - } else { - logger.warn( - `Federation: received not matching publicKey -> received: ${ - pubKey || 'null' - }, expected: ${dbCom.publicKey.toString()} `, - ) - // DbCommunity.delete({ id: dbCom.id }) - } - } catch (err) { - if (!(err instanceof LogError)) { - logger.error(`Error:`, err) - } } - } else { - logger.warn( - `Federation: dbCom: ${dbCom.id} with unsupported apiVersion=${dbCom.apiVersion}; supported versions`, - apiValueStrings, - ) + } catch (err) { + logger.error(`Error:`, err) } } } From cd7cef4fbf0f022db1d7e7ac11099ddc176dc6a5 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 12:09:12 +0200 Subject: [PATCH 22/40] typo --- backend/src/federation/client/Client_1_0.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 77a72cce8..ad6641f1c 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -36,7 +36,7 @@ export class Client_1_0 { return } logger.info( - 'Federation: getPublicKey successfull from endpoint', + 'Federation: getPublicKey successful from endpoint', this.endpoint, // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access data.getPublicKey.publicKey, From 6c7243758f885282be5786ea851dfbedb9d64832 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 12:26:11 +0200 Subject: [PATCH 23/40] fix tests --- .../federation/validateCommunities.test.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/src/federation/validateCommunities.test.ts b/backend/src/federation/validateCommunities.test.ts index ed4897e09..77d0cc2ad 100644 --- a/backend/src/federation/validateCommunities.test.ts +++ b/backend/src/federation/validateCommunities.test.ts @@ -84,7 +84,8 @@ describe('validate Communities', () => { }) it('logs requestGetPublicKey for community api 1_0 ', () => { expect(logger.info).toBeCalledWith( - `requestGetPublicKey with endpoint='http//localhost:5001/api/1_0/'...`, + 'Federation: getPublicKey from endpoint', + 'http//localhost:5001/api/1_0/', ) }) }) @@ -114,12 +115,14 @@ describe('validate Communities', () => { }) it('logs requestGetPublicKey for community api 1_0 ', () => { expect(logger.info).toBeCalledWith( - `requestGetPublicKey with endpoint='http//localhost:5001/api/1_0/'...`, + 'Federation: getPublicKey from endpoint', + 'http//localhost:5001/api/1_0/', ) }) it('logs requestGetPublicKey for community api 1_1 ', () => { expect(logger.info).toBeCalledWith( - `requestGetPublicKey with endpoint='http//localhost:5001/api/1_1/'...`, + 'Federation: getPublicKey from endpoint', + 'http//localhost:5001/api/1_1/', ) }) }) @@ -152,18 +155,21 @@ describe('validate Communities', () => { }) it('logs requestGetPublicKey for community api 1_0 ', () => { expect(logger.info).toBeCalledWith( - `requestGetPublicKey with endpoint='http//localhost:5001/api/1_0/'...`, + 'Federation: getPublicKey from endpoint', + 'http//localhost:5001/api/1_0/', ) }) it('logs requestGetPublicKey for community api 1_1 ', () => { expect(logger.info).toBeCalledWith( - `requestGetPublicKey with endpoint='http//localhost:5001/api/1_1/'...`, + 'Federation: getPublicKey from endpoint', + 'http//localhost:5001/api/1_1/', ) }) it('logs unsupported api for community with api 2_0 ', () => { expect(logger.warn).toBeCalledWith( - `Federation: dbCom: ${dbCom.id} with unsupported apiVersion=2_0; supported versions`, - ['1_0', '1_1'], + 'Federation: dbCom with unsupported apiVersion', + dbCom.endPoint, + '2_0', ) }) }) From 97b3a88065c6f7d899e745b309d991e664451eaa Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 12:27:41 +0200 Subject: [PATCH 24/40] 86% line coverage --- backend/jest.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/jest.config.js b/backend/jest.config.js index ca12668fa..3b251916a 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -7,7 +7,7 @@ module.exports = { collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], coverageThreshold: { global: { - lines: 85, + lines: 86, }, }, setupFiles: ['/test/testSetup.ts'], From d3ba23e1e4c5da32cde11a39bea2070ffaf20f4a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 12:56:46 +0200 Subject: [PATCH 25/40] fix lint --- backend/src/federation/client/Client_1_0.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index ad6641f1c..0c0d458c8 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -2,7 +2,6 @@ import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCom import { GraphQLClient } from 'graphql-request' import { getPublicKey } from '@/federation/query/getPublicKey' -import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' // eslint-disable-next-line camelcase From 2bf839f36212216dc970f32381247c890b09e082 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 4 May 2023 13:51:08 +0200 Subject: [PATCH 26/40] lint fixes From 0cd2b7646d1190825612f5637db1abe78ea5e354 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Mon, 8 May 2023 11:03:01 +0200 Subject: [PATCH 27/40] rework PR-comments --- backend/src/util/utilities.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index 4dc71ff7f..30c1effdb 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -19,14 +19,14 @@ export const fullName = (firstName: string, lastName: string): string => { return [firstName, lastName].filter(Boolean).join(' ') } -export const userName = (f?: string, l?: string): string | null => { +export const userName = (firstName?: string, lastName?: string): string | null => { let name: string | null - if (f && l) { - name = f + ' ' + l - } else if (f && !l) { - name = f - } else if (!f && l) { - name = l + if (firstName && lastName) { + name = firstName + ' ' + lastName + } else if (firstName && !lastName) { + name = firstName + } else if (!firstName && lastName) { + name = lastName } else { name = null } From 03246bb54a4f7169fd86a162b8572202e14390a7 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Mon, 8 May 2023 17:03:37 +0200 Subject: [PATCH 28/40] Update backend/src/util/utilities.ts Co-authored-by: Hannes Heine --- backend/src/util/utilities.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index 30c1effdb..df2166cfd 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -19,17 +19,3 @@ export const fullName = (firstName: string, lastName: string): string => { return [firstName, lastName].filter(Boolean).join(' ') } -export const userName = (firstName?: string, lastName?: string): string | null => { - let name: string | null - if (firstName && lastName) { - name = firstName + ' ' + lastName - } else if (firstName && !lastName) { - name = firstName - } else if (!firstName && lastName) { - name = lastName - } else { - name = null - } - - return name -} From 20daf80c44d5694d5d7c71fd1f508911114385d6 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Mon, 8 May 2023 17:14:55 +0200 Subject: [PATCH 29/40] Update database/migrations/0066-x-community-sendcoins-transactions_table.ts Co-authored-by: Hannes Heine --- ...-community-sendcoins-transactions_table.ts | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index 9f80460ed..a56c6df00 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -77,34 +77,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis `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, - \`previous\` int(10) unsigned DEFAULT NULL NULL, - \`type_id\` int(10) DEFAULT NULL NULL, - \`transaction_link_id\` int(10) unsigned DEFAULT NULL NULL, - \`amount\` decimal(40,20) DEFAULT NULL NULL, - \`balance\` decimal(40,20) DEFAULT NULL NULL, - \`balance_date\` datetime(3) DEFAULT current_timestamp(3) NOT NULL, - \`decay\` decimal(40,20) DEFAULT NULL NULL, - \`decay_start\` datetime(3) DEFAULT NULL NULL, - \`memo\` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - \`creation_date\` datetime(3) DEFAULT NULL NULL, - \`user_id\` int(10) unsigned NOT NULL, - \`user_gradido_id\` char(36) NOT NULL, - \`user_community_uuid\` char(36) NOT NULL, - \`user_name\` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL, - \`linked_user_id\` int(10) unsigned DEFAULT NULL NULL, - \`linked_user_gradido_id\` char(36) NOT NULL, - \`linked_user_community_uuid\` char(36) NOT NULL, - \`linked_user_name\` varchar(512) NULL, - \`linked_transaction_id\` int(10) DEFAULT NULL NULL, - \`x_transaction_state\` varchar(100) NOT NULL COMMENT 'States to handle 2-Phase-Commit handshake', - \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - \`updated_at\` datetime(3) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(3), - \`deleted_at\` datetime(3) NULL DEFAULT NULL, - PRIMARY KEY (\`id\`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) } /* eslint-disable @typescript-eslint/no-empty-function */ From 920b0f6d027a5fb362765a3044327741d1b80ed3 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Mon, 8 May 2023 17:15:06 +0200 Subject: [PATCH 30/40] Update database/migrations/0066-x-community-sendcoins-transactions_table.ts Co-authored-by: Hannes Heine --- .../migrations/0066-x-community-sendcoins-transactions_table.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index a56c6df00..10693bdba 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -88,5 +88,4 @@ export async function downgrade(queryFn: (query: string, values?: any[]) => Prom await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_gradido_id`;') await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_community_uuid`;') await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_name`;') - await queryFn(`DROP TABLE IF EXISTS pending_transactions;`) } From b87373947adbd7b047afbc9a80fc8a12e5770457 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 9 May 2023 01:27:13 +0200 Subject: [PATCH 31/40] linting --- backend/src/util/utilities.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index df2166cfd..6bd70b941 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -18,4 +18,3 @@ export const decimalSeparatorByLanguage = (a: Decimal, language: string): string export const fullName = (firstName: string, lastName: string): string => { return [firstName, lastName].filter(Boolean).join(' ') } - From 6519b4b75e9c9f37eab79e26b44655e54c8a6c1f Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 9 May 2023 10:18:01 +0200 Subject: [PATCH 32/40] Update backend/src/federation/client/Client_1_0.ts Co-authored-by: Hannes Heine --- backend/src/federation/client/Client_1_0.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 456196bcb..19d58de89 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -30,7 +30,7 @@ export class Client_1_0 { try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const { data, errors, headers, status } = await this.client.rawRequest(getPublicKey, {}) - logger.debug(`Response-Data:`, data, errors, headers, status) + logger.debug('Response-Data:', data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) From f8a63f9b71c2830d7d09905d634adb7c6aa898bf Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 9 May 2023 10:18:43 +0200 Subject: [PATCH 33/40] Update backend/src/federation/client/Client_1_0.ts Co-authored-by: Hannes Heine --- backend/src/federation/client/Client_1_0.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client_1_0.ts b/backend/src/federation/client/Client_1_0.ts index 19d58de89..fd2f941a3 100644 --- a/backend/src/federation/client/Client_1_0.ts +++ b/backend/src/federation/client/Client_1_0.ts @@ -33,7 +33,7 @@ export class Client_1_0 { logger.debug('Response-Data:', data, errors, headers, status) if (data) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey) + logger.debug('Response-PublicKey:', data.getPublicKey.publicKey) logger.info(`requestGetPublicKey processed successfully`) // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access return data.getPublicKey.publicKey From 864beb7914b7ab93fb0aa6aa6be89f60a7667b2e Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 9 May 2023 18:23:21 +0200 Subject: [PATCH 34/40] linting --- .../migrations/0066-x-community-sendcoins-transactions_table.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index 10693bdba..62dd95f62 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -76,7 +76,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 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;`, ) - } /* eslint-disable @typescript-eslint/no-empty-function */ From bcb08fc0fb222b38e59964f4014e79cb0be26a43 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 9 May 2023 20:06:50 +0200 Subject: [PATCH 35/40] correct migration after test with production data --- .../migrations/0066-x-community-sendcoins-transactions_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index 62dd95f62..65c21e0b5 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -74,7 +74,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ) */ 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;`, + `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_gradido_id is null;`, ) } From 15f0d062ee45a2d96c0e0135cde2083a1a2f383d Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Wed, 10 May 2023 00:29:33 +0200 Subject: [PATCH 36/40] remove commented code --- .../0066-x-community-sendcoins-transactions_table.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index 65c21e0b5..2a3b3973a 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -68,11 +68,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 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_gradido_id is null;`, ) From 8c62dd1a4f2883a44d640320e379d8e8a0c23389 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 11 May 2023 10:27:43 +0200 Subject: [PATCH 37/40] lint fixes --- backend/src/federation/client/Client.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/federation/client/Client.ts b/backend/src/federation/client/Client.ts index 515945eb5..98f63c127 100644 --- a/backend/src/federation/client/Client.ts +++ b/backend/src/federation/client/Client.ts @@ -10,12 +10,13 @@ import { Client_1_1 } from './Client_1_1' // eslint-disable-next-line camelcase type FederationClient = Client_1_0 | Client_1_1 -type ClientInstance = { +interface ClientInstance { id: number // eslint-disable-next-line no-use-before-define client: FederationClient } +// eslint-disable-next-line @typescript-eslint/no-extraneous-class export class Client { private static instanceArray: ClientInstance[] = [] From 3c0dbe02f60860d0a240c83d4b4c9a984cea9392 Mon Sep 17 00:00:00 2001 From: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> Date: Thu, 11 May 2023 22:21:24 +0200 Subject: [PATCH 38/40] Update backend/src/util/utilities.ts Co-authored-by: Ulf Gebhardt --- backend/src/util/utilities.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index 6bd70b941..64d92e981 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -15,6 +15,5 @@ export const decimalSeparatorByLanguage = (a: Decimal, language: string): string return result } -export const fullName = (firstName: string, lastName: string): string => { - return [firstName, lastName].filter(Boolean).join(' ') -} +export const fullName = (firstName: string, lastName: string): string => + [firstName, lastName].filter(Boolean).join(' ') From a380f385bdcefe22540a02e2caf15fff0f5c1592 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Thu, 11 May 2023 22:52:21 +0200 Subject: [PATCH 39/40] remove community_uuids --- backend/src/util/virtualTransactions.ts | 4 ---- .../Transaction.ts | 18 ------------------ ...x-community-sendcoins-transactions_table.ts | 13 ++----------- 3 files changed, 2 insertions(+), 33 deletions(-) diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts index 2bc2a591e..a10e566d1 100644 --- a/backend/src/util/virtualTransactions.ts +++ b/backend/src/util/virtualTransactions.ts @@ -55,10 +55,8 @@ const virtualLinkTransaction = ( contribution: null, ...defaultModelFunctions, userGradidoID: '', - userCommunityUuid: null, userName: null, linkedUserGradidoID: null, - linkedUserCommunityUuid: null, linkedUserName: null, } return new Transaction(linkDbTransaction, user) @@ -91,10 +89,8 @@ const virtualDecayTransaction = ( contribution: null, ...defaultModelFunctions, userGradidoID: '', - userCommunityUuid: null, userName: null, linkedUserGradidoID: null, - linkedUserCommunityUuid: null, linkedUserName: null, } return new Transaction(decayDbTransaction, user) diff --git a/database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts b/database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts index 9202f9fd3..4220cfadc 100644 --- a/database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts +++ b/database/entity/0066-x-community-sendcoins-transactions_table/Transaction.ts @@ -84,15 +84,6 @@ export class Transaction extends BaseEntity { }) userGradidoID: string - @Column({ - name: 'user_community_uuid', - type: 'varchar', - length: 36, - nullable: true, - collation: 'utf8mb4_unicode_ci', - }) - userCommunityUuid: string | null - @Column({ name: 'user_name', type: 'varchar', @@ -120,15 +111,6 @@ export class Transaction extends BaseEntity { }) linkedUserGradidoID: string | null - @Column({ - name: 'linked_user_community_uuid', - type: 'varchar', - length: 36, - nullable: true, - collation: 'utf8mb4_unicode_ci', - }) - linkedUserCommunityUuid: string | null - @Column({ name: 'linked_user_name', type: 'varchar', diff --git a/database/migrations/0066-x-community-sendcoins-transactions_table.ts b/database/migrations/0066-x-community-sendcoins-transactions_table.ts index 2a3b3973a..2a90f297a 100644 --- a/database/migrations/0066-x-community-sendcoins-transactions_table.ts +++ b/database/migrations/0066-x-community-sendcoins-transactions_table.ts @@ -41,10 +41,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 'ALTER TABLE `transactions` ADD COLUMN `user_gradido_id` char(36) DEFAULT NULL NULL AFTER `user_id`;', ) await queryFn( - 'ALTER TABLE `transactions` ADD COLUMN `user_community_uuid` char(36) DEFAULT NULL NULL AFTER `user_gradido_id`;', - ) - await queryFn( - 'ALTER TABLE `transactions` ADD COLUMN `user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `user_community_uuid`;', + 'ALTER TABLE `transactions` ADD COLUMN `user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `user_gradido_id`;', ) await queryFn( 'ALTER TABLE `transactions` MODIFY COLUMN `linked_user_id` int(10) unsigned DEFAULT NULL NULL AFTER `user_name`;', @@ -53,15 +50,11 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 'ALTER TABLE `transactions` ADD COLUMN `linked_user_gradido_id` char(36) DEFAULT NULL NULL AFTER `linked_user_id`;', ) await queryFn( - 'ALTER TABLE `transactions` ADD COLUMN `linked_user_community_uuid` char(36) DEFAULT NULL NULL AFTER `linked_user_gradido_id`;', - ) - await queryFn( - 'ALTER TABLE `transactions` ADD COLUMN `linked_user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `linked_user_community_uuid`;', + 'ALTER TABLE `transactions` ADD COLUMN `linked_user_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL NULL AFTER `linked_user_gradido_id`;', ) await queryFn( '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;`, ) @@ -77,9 +70,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_gradido_id`;') - await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_community_uuid`;') await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_name`;') await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_gradido_id`;') - await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_community_uuid`;') await queryFn('ALTER TABLE `transactions` DROP COLUMN `linked_user_name`;') } From e924d0bb97c67ae5b1e3192192149319aca11f7e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 12 May 2023 15:35:22 +0200 Subject: [PATCH 40/40] log when a community is verified successfully --- backend/src/federation/validateCommunities.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index fcce9d0d8..4b337eda9 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -41,6 +41,7 @@ export async function validateCommunities(): Promise { const pubKey = await client?.getPublicKey() if (pubKey && pubKey === dbCom.publicKey.toString()) { await DbFederatedCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) + logger.info('Federation: verified community', dbCom) } else { logger.warn( 'Federation: received not matching publicKey:',