store foreign user after x-com-tx

This commit is contained in:
Claus-Peter Huebner 2023-10-06 17:56:01 +02:00
parent 235773c9b9
commit 6582cbcb39
6 changed files with 115 additions and 4 deletions

View File

@ -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(

View File

@ -171,6 +171,8 @@ describe('UserResolver', () => {
referrerId: null,
contributionLinkId: null,
passwordEncryptionType: PasswordEncryptionType.NO_PASSWORD,
communityUuid: null,
foreign: false,
},
])
const valUUID = validateUUID(user[0].gradidoID)

View File

@ -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<boolean> {
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
}

View File

@ -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)

View File

@ -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',

View File

@ -2,6 +2,10 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
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<Array<any>>) {
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`);')
}