diff --git a/core/src/graphql/logic/processXComSendCoins.ts b/core/src/graphql/logic/processXComSendCoins.ts index 5b3d6584a..bdbf24928 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) @@ -108,6 +111,7 @@ export async function processXComCompleteTransaction( memo, senderUser, recipientGradidoId, + dbTransactionLink?.id, ) methodLogger.debug('processXComPendingSendCoins result: ', pendingResult) if (pendingResult && pendingResult.vote && pendingResult.recipGradidoID) { @@ -120,6 +124,7 @@ export async function processXComCompleteTransaction( memo, senderUser, pendingResult, + dbTransactionLink?.id, ) methodLogger.debug('processXComCommittingSendCoins result: ', committingResult) if (!committingResult.vote) { @@ -134,14 +139,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 + @@ -163,6 +185,7 @@ export async function processXComPendingSendCoins( memo: string, sender: dbUser, recipientIdentifier: string, + transactionLinkId?: number, ): Promise { let voteResult: SendCoinsResponseJwtPayloadType const methodLogger = createLogger(`processXComPendingSendCoins`) @@ -176,7 +199,8 @@ export async function processXComPendingSendCoins( amount: amount.toString(), memo: memo.substring(0, 5), sender: new UserLoggingView(sender), - recipientIdentifier + recipientIdentifier, + transactionLinkId } ) } @@ -216,7 +240,8 @@ export async function processXComPendingSendCoins( senderCom.communityUuid!, sender.gradidoID, fullName(sender.firstName, sender.lastName), - sender.alias + sender.alias, + transactionLinkId ) if(methodLogger.isDebugEnabled()) { methodLogger.debug(`ready for voteForSendCoins with payload=${payload}`) @@ -277,6 +302,7 @@ export async function processXComPendingSendCoins( pendingTx.userId = sender.id pendingTx.userGradidoID = sender.gradidoID pendingTx.userName = fullName(sender.firstName, sender.lastName) + pendingTx.transactionLinkId = transactionLinkId if(methodLogger.isDebugEnabled()) { methodLogger.debug(`initialized sender pendingTX=${new PendingTransactionLoggingView(pendingTx)}`) } @@ -326,6 +352,7 @@ export async function processXComCommittingSendCoins( memo: string, sender: dbUser, recipient: SendCoinsResult, + transactionLinkId?: number, ): Promise { const methodLogger = createLogger(`processXComCommittingSendCoins`) const handshakeID = randombytes_random().toString() @@ -342,6 +369,7 @@ export async function processXComCommittingSendCoins( memo: memo.substring(0, 5), sender: new UserLoggingView(sender), recipient: new SendCoinsResultLoggingView(recipient), + transactionLinkId, } ) } @@ -384,6 +412,7 @@ export async function processXComCommittingSendCoins( pendingTx.userGradidoID!, pendingTx.userName!, sender.alias, + pendingTx.transactionLinkId, ) payload.recipientCommunityUuid = pendingTx.linkedUserCommunityUuid ? pendingTx.linkedUserCommunityUuid diff --git a/core/src/graphql/logic/settlePendingSenderTransaction.ts b/core/src/graphql/logic/settlePendingSenderTransaction.ts index 87ab8116c..7e8aa9055 100644 --- a/core/src/graphql/logic/settlePendingSenderTransaction.ts +++ b/core/src/graphql/logic/settlePendingSenderTransaction.ts @@ -92,7 +92,7 @@ export async function settlePendingSenderTransaction( transactionSend.decay = sendBalance.decay.decay // pendingTx.decay transactionSend.decayStart = sendBalance.decay.start // pendingTx.decayStart transactionSend.previous = pendingTx.previous - transactionSend.linkedTransactionId = pendingTx.linkedTransactionId + transactionSend.transactionLinkId = pendingTx.transactionLinkId await queryRunner.manager.insert(dbTransaction, transactionSend) logger.debug(`send Transaction inserted: ${transactionSend}`) 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 diff --git a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts index 938dca47c..baaa376c5 100644 --- a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts +++ b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts @@ -104,6 +104,7 @@ export class SendCoinsResolver { pendingTx.userCommunityUuid = authArgs.recipientCommunityUuid pendingTx.userGradidoID = receiverUser.gradidoID pendingTx.userName = fullName(receiverUser.firstName, receiverUser.lastName) + pendingTx.transactionLinkId = authArgs.transactionLinkId await DbPendingTransaction.insert(pendingTx) const responseArgs = new SendCoinsResponseJwtPayloadType( diff --git a/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts b/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts index 6396174bc..6035aa442 100644 --- a/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts +++ b/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts @@ -92,6 +92,7 @@ export async function settlePendingReceiveTransaction( transactionReceive.decayStart = receiveBalance ? receiveBalance.decay.start : null transactionReceive.previous = receiveBalance ? receiveBalance.lastTransactionId : null transactionReceive.linkedTransactionId = pendingTx.linkedTransactionId + transactionReceive.transactionLinkId = pendingTx.transactionLinkId await queryRunner.manager.insert(dbTransaction, transactionReceive) logger.debug(`receive Transaction inserted: ${new TransactionLoggingView(transactionReceive)}`) diff --git a/frontend/src/components/LinkInformations/RedeemCommunitySelection.vue b/frontend/src/components/LinkInformations/RedeemCommunitySelection.vue index 46e9eb81f..7a524f65d 100644 --- a/frontend/src/components/LinkInformations/RedeemCommunitySelection.vue +++ b/frontend/src/components/LinkInformations/RedeemCommunitySelection.vue @@ -6,15 +6,30 @@ :is-redeem-jwt-link="isRedeemJwtLink" class="redeem-community-selection" > - +

{{ $t('gdd_per_link.redeemlink-error') }}

+ +

+ + + {{ linkData.memo }} + + + - - {{ $t('gdd_per_link.recipientCommunitySelection') }} + +
+ {{ $t('gdd_per_link.recipientCommunityRedirection') }} +
+
+ {{ $t('gdd_per_link.recipientCommunitySelection') }} +
- {{ $t('gdd_per_link.recipientCommunityFix') }}

@@ -25,11 +40,7 @@ @update:model-value="setRecipientCommunity" /> - - {{ currentRecipientCommunity.name }} - -

{{ $t('gdd_per_link.switchCommunity') }}

{{ $t('gdd_per_link.to-switch') }} @@ -37,13 +48,8 @@

- - - {{ linkData.memo }} -
+ +