From 6582cbcb39175b0e62890a21fb68367673153a41 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Fri, 6 Oct 2023 17:56:01 +0200 Subject: [PATCH] store foreign user after x-com-tx --- .../graphql/resolver/TransactionResolver.ts | 21 +++++ .../src/graphql/resolver/UserResolver.test.ts | 2 + .../graphql/resolver/util/storeForeignUser.ts | 77 +++++++++++++++++++ backend/src/util/communityUser.ts | 2 +- .../User.ts | 3 +- ...3-introduce_foreign_user_in_users_table.ts | 14 +++- 6 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 backend/src/graphql/resolver/util/storeForeignUser.ts diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 66a889798..8f78d1d94 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -47,6 +47,7 @@ import { processXComPendingSendCoins, } from './util/processXComSendCoins' import { sendTransactionsToDltConnector } from './util/sendTransactionsToDltConnector' +import { storeForeignUser } from './util/storeForeignUser' import { transactionLinkSummary } from './util/transactionLinkSummary' export const executeTransaction = async ( @@ -404,6 +405,7 @@ export class TransactionResolver { } else { // processing a x-community sendCoins logger.debug('X-Com: processing a x-community transaction...') + console.log('X-Com: processing a x-community transaction...') if (!CONFIG.FEDERATION_XCOM_SENDCOINS_ENABLED) { throw new LogError('X-Community sendCoins disabled per configuration!') } @@ -414,6 +416,7 @@ export class TransactionResolver { where: { communityUuid: recipientCommunityIdentifier }, }) logger.debug('recipient commuity: ', recipCom) + console.log('recipient commuity: ', recipCom) let pendingResult: SendCoinsResult let committingResult: SendCoinsResult const creationDate = new Date() @@ -429,8 +432,10 @@ export class TransactionResolver { recipientIdentifier, ) logger.debug('processXComPendingSendCoins result: ', pendingResult) + console.log('processXComPendingSendCoins result: ', pendingResult) if (pendingResult.vote && pendingResult.recipGradidoID) { logger.debug('vor processXComCommittingSendCoins... ') + console.log('vor processXComCommittingSendCoins... ') committingResult = await processXComCommittingSendCoins( recipCom, homeCom, @@ -441,6 +446,7 @@ export class TransactionResolver { pendingResult.recipGradidoID, ) logger.debug('processXComCommittingSendCoins result: ', committingResult) + console.log('processXComCommittingSendCoins result: ', committingResult) if (!committingResult.vote) { logger.fatal('FATAL ERROR: on processXComCommittingSendCoins for', committingResult) throw new LogError( @@ -451,6 +457,21 @@ export class TransactionResolver { memo, ) } + // after successful x-com-tx store the recipient as foreign user + logger.debug('store recipient as foreign user...') + console.log('store recipient as foreign user...') + if (await storeForeignUser(recipCom, committingResult)) { + logger.info( + 'X-Com: new foreign user inserted successfully...', + recipCom.communityUuid, + committingResult.recipGradidoID, + ) + console.log( + 'X-Com: new foreign user inserted successfully...', + recipCom.communityUuid, + committingResult.recipGradidoID, + ) + } } } catch (err) { throw new LogError( diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 171af7cf5..5ad05fc05 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -171,6 +171,8 @@ describe('UserResolver', () => { referrerId: null, contributionLinkId: null, passwordEncryptionType: PasswordEncryptionType.NO_PASSWORD, + communityUuid: null, + foreign: false, }, ]) const valUUID = validateUUID(user[0].gradidoID) diff --git a/backend/src/graphql/resolver/util/storeForeignUser.ts b/backend/src/graphql/resolver/util/storeForeignUser.ts new file mode 100644 index 000000000..7be58376b --- /dev/null +++ b/backend/src/graphql/resolver/util/storeForeignUser.ts @@ -0,0 +1,77 @@ +import { Community as DbCommunity } from '@entity/Community' +import { User as DbUser } from '@entity/User' + +import { SendCoinsResult } from '@/federation/client/1_0/model/SendCoinsResult' +import { backendLogger as logger } from '@/server/logger' + +export async function storeForeignUser( + recipCom: DbCommunity, + committingResult: SendCoinsResult, +): Promise { + if (recipCom.communityUuid !== null && committingResult.recipGradidoID !== null) { + try { + const user = await DbUser.findOne({ + where: { + foreign: true, + communityUuid: recipCom.communityUuid, + gradidoID: committingResult.recipGradidoID, + }, + }) + if (!user) { + logger.debug( + 'X-Com: no foreignUser found for:', + recipCom.communityUuid, + committingResult.recipGradidoID, + ) + console.log( + 'X-Com: no foreignUser found for:', + recipCom.communityUuid, + committingResult.recipGradidoID, + ) + let foreignUser = DbUser.create() + foreignUser.foreign = true + if (committingResult.recipAlias !== null) { + foreignUser.alias = committingResult.recipAlias + } + foreignUser.communityUuid = recipCom.communityUuid + if (committingResult.recipFirstName !== null) { + foreignUser.firstName = committingResult.recipFirstName + } + if (committingResult.recipLastName !== null) { + foreignUser.lastName = committingResult.recipLastName + } + foreignUser.gradidoID = committingResult.recipGradidoID + foreignUser = await DbUser.save(foreignUser) + logger.debug('X-Com: new foreignUser inserted:', foreignUser) + console.log('X-Com: new foreignUser inserted:', foreignUser) + + return true + } else if ( + user.firstName !== committingResult.recipFirstName || + user.lastName !== committingResult.recipLastName || + user.alias !== committingResult.recipAlias + ) { + logger.warn( + 'X-Com: foreignUser still exists, but with different name or alias:', + user, + committingResult, + ) + console.log( + 'X-Com: foreignUser still exists, but with different name or alias:', + user, + committingResult, + ) + return false + } else { + logger.debug('X-Com: foreignUser still exists...:', user) + console.log('X-Com: foreignUser still exists...:', user) + return true + } + } catch (err) { + logger.error('X-Com: error in storeForeignUser;', err) + console.log('X-Com: error in storeForeignUser;', err) + return false + } + } + return false +} diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts index de41ea310..bad06f201 100644 --- a/backend/src/util/communityUser.ts +++ b/backend/src/util/communityUser.ts @@ -49,7 +49,7 @@ const communityDbUser: dbUser = { throw new Error('Function not implemented.') }, foreign: false, - communityUuid: null, + communityUuid: '55555555-4444-4333-2222-11111111', } const communityUser = new User(communityDbUser) diff --git a/database/entity/0073-introduce_foreign_user_in_users_table/User.ts b/database/entity/0073-introduce_foreign_user_in_users_table/User.ts index 423039679..e842d8092 100644 --- a/database/entity/0073-introduce_foreign_user_in_users_table/User.ts +++ b/database/entity/0073-introduce_foreign_user_in_users_table/User.ts @@ -8,7 +8,6 @@ import { JoinColumn, OneToOne, } from 'typeorm' -import { Community } from '../Community' import { Contribution } from '../Contribution' import { ContributionMessage } from '../ContributionMessage' import { UserContact } from '../UserContact' @@ -37,7 +36,7 @@ export class User extends BaseEntity { nullable: true, collation: 'utf8mb4_unicode_ci', }) - communityUuid: string | null + communityUuid: string @Column({ name: 'alias', diff --git a/database/migrations/0073-introduce_foreign_user_in_users_table.ts b/database/migrations/0073-introduce_foreign_user_in_users_table.ts index f04c2f004..462dedebc 100644 --- a/database/migrations/0073-introduce_foreign_user_in_users_table.ts +++ b/database/migrations/0073-introduce_foreign_user_in_users_table.ts @@ -2,6 +2,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `users` DROP KEY IF EXISTS `gradido_id`;') + await queryFn('ALTER TABLE `users` DROP INDEX IF EXISTS `gradido_id`;') + await queryFn('ALTER TABLE `users` DROP KEY IF EXISTS `alias`;') + await queryFn('ALTER TABLE `users` DROP INDEX IF EXISTS `alias`;') await queryFn( 'ALTER TABLE `users` ADD COLUMN IF NOT EXISTS `foreign` tinyint(4) NOT NULL DEFAULT 0 AFTER `id`;', ) @@ -12,10 +16,18 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis await queryFn( 'ALTER TABLE `users` ADD CONSTRAINT uuid_key UNIQUE KEY (`gradido_id`, `community_uuid`);', ) + await queryFn( + 'ALTER TABLE `users` ADD CONSTRAINT alias_key UNIQUE KEY (`alias`, `community_uuid`);', + ) } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn('ALTER TABLE `users` DROP CONSTRAINT IF EXISTS `uuid_key`;') + await queryFn('ALTER TABLE `users` DROP KEY IF EXISTS `uuid_key`;') + await queryFn('ALTER TABLE `users` DROP KEY IF EXISTS `alias_key`;') + await queryFn('ALTER TABLE `users` DROP COLUMN IF EXISTS `foreign`;') await queryFn('ALTER TABLE `users` DROP COLUMN IF EXISTS `community_uuid`;') + + await queryFn('ALTER TABLE `users` ADD CONSTRAINT gradido_id UNIQUE KEY (`gradido_id`);') + await queryFn('ALTER TABLE `users` ADD CONSTRAINT alias UNIQUE KEY (`alias`);') }