From ed95df9cc73ba5db0337f1847881bf5e2d4f5c3a Mon Sep 17 00:00:00 2001 From: clauspeterhuebner Date: Wed, 10 Sep 2025 16:19:01 +0200 Subject: [PATCH] insert optional storeLinkAsRedeemed in processXComSendCoins --- .../src/graphql/logic/processXComSendCoins.ts | 32 +++++++++++++++---- core/src/graphql/logic/storeForeignUser.ts | 12 +++---- core/src/graphql/logic/storeLinkAsRedeemed.ts | 17 ++++++++++ 3 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 core/src/graphql/logic/storeLinkAsRedeemed.ts diff --git a/core/src/graphql/logic/processXComSendCoins.ts b/core/src/graphql/logic/processXComSendCoins.ts index 5b3d6584a..079ba76b7 100644 --- a/core/src/graphql/logic/processXComSendCoins.ts +++ b/core/src/graphql/logic/processXComSendCoins.ts @@ -4,6 +4,7 @@ import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity, PendingTransaction as DbPendingTransaction, + TransactionLink as DbTransactionLink, User as dbUser, findTransactionLinkByCode, findUserByIdentifier, @@ -16,21 +17,22 @@ import { Decimal } from 'decimal.js-light' import { CONFIG as CONFIG_CORE } from '../../config' import { LOG4JS_BASE_CATEGORY_NAME } from '../../config/const' +import { encryptAndSign, PendingTransactionState, SendCoinsJwtPayloadType, SendCoinsResponseJwtPayloadType, verifyAndDecrypt } from 'shared' import { SendCoinsClient as V1_0_SendCoinsClient } from '../../federation/client/1_0/SendCoinsClient' import { SendCoinsResult } from '../../federation/client/1_0/model/SendCoinsResult' import { SendCoinsClientFactory } from '../../federation/client/SendCoinsClientFactory' import { TransactionTypeId } from '../../graphql/enum/TransactionTypeId' -import { encryptAndSign, PendingTransactionState, SendCoinsJwtPayloadType, SendCoinsResponseJwtPayloadType, verifyAndDecrypt } from 'shared' // import { LogError } from '@server/LogError' +import { getLogger } from 'log4js' import { calculateSenderBalance } from '../../util/calculateSenderBalance' import { fullName } from '../../util/utilities' -import { getLogger } from 'log4js' +import { randombytes_random } from 'sodium-native' import { SendCoinsResultLoggingView } from '../../federation/client/1_0/logging/SendCoinsResultLogging.view' import { EncryptedTransferArgs } from '../../graphql/model/EncryptedTransferArgs' -import { randombytes_random } from 'sodium-native' import { settlePendingSenderTransaction } from './settlePendingSenderTransaction' import { storeForeignUser } from './storeForeignUser' +import { storeLinkAsRedeemed } from './storeLinkAsRedeemed' const createLogger = (method: string) => getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.util.processXComSendCoins.${method}`) @@ -79,9 +81,10 @@ export async function processXComCompleteTransaction( methodLogger.error(errmsg) throw new Error(errmsg) } + let dbTransactionLink: DbTransactionLink | null = null if(code !== undefined) { try { - const dbTransactionLink = await findTransactionLinkByCode(code) + dbTransactionLink = await findTransactionLinkByCode(code) if (dbTransactionLink && dbTransactionLink.validUntil < new Date()) { const errmsg = `TransactionLink ${code} is expired!` methodLogger.error(errmsg) @@ -134,14 +137,31 @@ export async function processXComCompleteTransaction( } // after successful x-com-tx store the recipient as foreign user methodLogger.debug('store recipient as foreign user...') - if (await storeForeignUser(recipientCom, committingResult)) { + const foreignUser = await storeForeignUser(recipientCom, committingResult) + if (foreignUser) { methodLogger.info( 'X-Com: new foreign user inserted successfully...', recipientCom.communityUuid, committingResult.recipGradidoID, ) + } else { + const errmsg = `X-Com: Error storing foreign user for ${recipientCom.communityUuid} ${committingResult.recipGradidoID}` + methodLogger.error(errmsg) + throw new Error(errmsg) } - } + if(dbTransactionLink !== null) { + // after successful x-com-tx per link store the link as redeemed + methodLogger.debug('store link as redeemed...') + if (await storeLinkAsRedeemed(dbTransactionLink, foreignUser!, creationDate)) { + methodLogger.info( + 'X-Com: store link as redeemed successfully...', + dbTransactionLink.code, + foreignUser!.id, + creationDate, + ) + } + } + } } catch (err) { const errmsg = `ERROR: on processXComCommittingSendCoins with ` + recipientCommunityUuid + diff --git a/core/src/graphql/logic/storeForeignUser.ts b/core/src/graphql/logic/storeForeignUser.ts index 1e6b8153f..95a1d106c 100644 --- a/core/src/graphql/logic/storeForeignUser.ts +++ b/core/src/graphql/logic/storeForeignUser.ts @@ -9,7 +9,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.logic.storeForeig export async function storeForeignUser( recipCom: DbCommunity, committingResult: SendCoinsResult, -): Promise { +): Promise { if (recipCom.communityUuid !== null && committingResult.recipGradidoID !== null) { try { const user = await findForeignUserByUuids(recipCom.communityUuid, committingResult.recipGradidoID) @@ -35,7 +35,7 @@ export async function storeForeignUser( foreignUser = await DbUser.save(foreignUser) logger.debug('new foreignUser inserted:', foreignUser) - return true + return foreignUser } else if ( user.firstName !== committingResult.recipFirstName || user.lastName !== committingResult.recipLastName || @@ -57,15 +57,15 @@ export async function storeForeignUser( } await DbUser.save(user) logger.debug('update recipient successful.', user) - return true + return user } else { logger.debug('foreignUser still exists...:', user) - return true + return user } } catch (err) { logger.error('error in storeForeignUser;', err) - return false + return null } } - return false + return null } diff --git a/core/src/graphql/logic/storeLinkAsRedeemed.ts b/core/src/graphql/logic/storeLinkAsRedeemed.ts new file mode 100644 index 000000000..cccc97d50 --- /dev/null +++ b/core/src/graphql/logic/storeLinkAsRedeemed.ts @@ -0,0 +1,17 @@ +import { TransactionLink as DbTransactionLink, User as DbUser } from "database"; + +export async function storeLinkAsRedeemed( + dbTransactionLink: DbTransactionLink, + foreignUser: DbUser, + creationDate: Date, +): Promise { + try { + dbTransactionLink.redeemedBy = foreignUser.id + dbTransactionLink.redeemedAt = creationDate + await DbTransactionLink.save(dbTransactionLink) + return true + } catch (err) { + console.error('error in storeLinkAsRedeemed;', err) + return false + } +} \ No newline at end of file