From bb88048a25c11960b40e411dd0bf402327c50907 Mon Sep 17 00:00:00 2001
From: clauspeterhuebner
Date: Fri, 5 Dec 2025 02:17:19 +0100
Subject: [PATCH] send emails after x-com-tx
---
.../client/1_0/model/SendCoinsResult.ts | 3 ++
.../src/graphql/logic/processXComSendCoins.ts | 30 +++++++++++++++++++
core/src/graphql/logic/storeForeignUser.ts | 26 ++++++++++++++--
.../api/1_0/resolver/SendCoinsResolver.ts | 1 +
.../SendCoinsResponseJwtPayloadType.ts | 3 ++
5 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/core/src/federation/client/1_0/model/SendCoinsResult.ts b/core/src/federation/client/1_0/model/SendCoinsResult.ts
index 8fc21305f..bef399b01 100644
--- a/core/src/federation/client/1_0/model/SendCoinsResult.ts
+++ b/core/src/federation/client/1_0/model/SendCoinsResult.ts
@@ -20,4 +20,7 @@ export class SendCoinsResult {
@Field(() => String, { nullable: true })
recipAlias: string | null
+
+ @Field(() => String, { nullable: true })
+ recipEmail: string | null
}
diff --git a/core/src/graphql/logic/processXComSendCoins.ts b/core/src/graphql/logic/processXComSendCoins.ts
index ceb33a378..c9db8b63d 100644
--- a/core/src/graphql/logic/processXComSendCoins.ts
+++ b/core/src/graphql/logic/processXComSendCoins.ts
@@ -36,6 +36,7 @@ import { fullName } from '../../util/utilities'
import { settlePendingSenderTransaction } from './settlePendingSenderTransaction'
import { storeForeignUser } from './storeForeignUser'
import { storeLinkAsRedeemed } from './storeLinkAsRedeemed'
+import { sendTransactionLinkRedeemedEmail, sendTransactionReceivedEmail } from '../../emails'
const createLogger = (method: string) =>
getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.util.processXComSendCoins.${method}`)
@@ -167,6 +168,34 @@ export async function processXComCompleteTransaction(
)
}
}
+
+
+ await sendTransactionReceivedEmail({
+ firstName: foreignUser.firstName,
+ lastName: foreignUser.lastName,
+ email: foreignUser.emailContact.email,
+ language: foreignUser.language,
+ memo,
+ senderFirstName: senderUser.firstName,
+ senderLastName: senderUser.lastName,
+ senderEmail: senderUser.emailContact.email,
+ transactionAmount: new Decimal(amount),
+ })
+ if (dbTransactionLink) {
+ await sendTransactionLinkRedeemedEmail({
+ firstName: senderUser.firstName,
+ lastName: senderUser.lastName,
+ email: senderUser.emailContact.email,
+ language: senderUser.language,
+ senderFirstName: foreignUser.firstName,
+ senderLastName: foreignUser.lastName,
+ senderEmail: foreignUser.emailContact.email,
+ transactionAmount: new Decimal(amount),
+ transactionMemo: memo,
+ })
+ }
+
+
}
} catch (err) {
const errmsg =
@@ -483,6 +512,7 @@ export async function processXComCommittingSendCoins(
}
sendCoinsResult.recipGradidoID = pendingTx.linkedUserGradidoID
sendCoinsResult.recipAlias = recipient.recipAlias
+ sendCoinsResult.recipEmail = recipient.recipEmail
}
} catch (err) {
methodLogger.error(
diff --git a/core/src/graphql/logic/storeForeignUser.ts b/core/src/graphql/logic/storeForeignUser.ts
index a367ee8e3..602070e05 100644
--- a/core/src/graphql/logic/storeForeignUser.ts
+++ b/core/src/graphql/logic/storeForeignUser.ts
@@ -1,4 +1,7 @@
-import { Community as DbCommunity, User as DbUser, findForeignUserByUuids } from 'database'
+import { Community as DbCommunity,
+ User as DbUser,
+ UserContact as DbUserContact,
+ findForeignUserByUuids } from 'database'
import { getLogger } from 'log4js'
import { LOG4JS_BASE_CATEGORY_NAME } from '../../config/const'
import { SendCoinsResult } from '../../federation/client/1_0/model/SendCoinsResult'
@@ -35,16 +38,28 @@ export async function storeForeignUser(
}
foreignUser.gradidoID = committingResult.recipGradidoID
foreignUser = await DbUser.save(foreignUser)
+
logger.debug('new foreignUser inserted:', foreignUser)
+ let foreignUserEmail = DbUserContact.create()
+ foreignUserEmail.email = committingResult.recipEmail!
+ foreignUserEmail.emailChecked = true
+ foreignUserEmail.user = foreignUser
+ foreignUserEmail = await DbUserContact.save(foreignUserEmail)
+ logger.debug('new foreignUserEmail inserted:', foreignUserEmail)
+
+ foreignUser.emailContact = foreignUserEmail
+ foreignUser.emailId = foreignUserEmail.id
+ foreignUser = await DbUser.save(foreignUser)
return foreignUser
} else if (
user.firstName !== committingResult.recipFirstName ||
user.lastName !== committingResult.recipLastName ||
- user.alias !== committingResult.recipAlias
+ user.alias !== committingResult.recipAlias ||
+ user.emailContact.email !== committingResult.recipEmail
) {
logger.warn(
- 'foreignUser still exists, but with different name or alias:',
+ 'foreignUser still exists, but with different name, alias or email:',
user,
committingResult,
)
@@ -57,6 +72,11 @@ export async function storeForeignUser(
if (committingResult.recipAlias !== null) {
user.alias = committingResult.recipAlias
}
+ if (committingResult.recipEmail != null) {
+ let userContact = user.emailContact
+ userContact.email = committingResult.recipEmail
+ user.emailContact = await DbUserContact.save(userContact)
+ }
await DbUser.save(user)
logger.debug('update recipient successful.', user)
return user
diff --git a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts
index 4e6dc71d2..10f8acae0 100644
--- a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts
+++ b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts
@@ -128,6 +128,7 @@ export class SendCoinsResolver {
receiverUser.firstName,
receiverUser.lastName,
receiverUser.alias,
+ receiverUser.emailContact.email
)
const responseJwt = await encryptAndSign(
responseArgs,
diff --git a/shared/src/jwt/payloadtypes/SendCoinsResponseJwtPayloadType.ts b/shared/src/jwt/payloadtypes/SendCoinsResponseJwtPayloadType.ts
index fb08d6a97..b6335b262 100644
--- a/shared/src/jwt/payloadtypes/SendCoinsResponseJwtPayloadType.ts
+++ b/shared/src/jwt/payloadtypes/SendCoinsResponseJwtPayloadType.ts
@@ -8,6 +8,7 @@ export class SendCoinsResponseJwtPayloadType extends JwtPayloadType {
recipFirstName: string | null
recipLastName: string | null
recipAlias: string | null
+ recipEmail: string | null
constructor(
handshakeID: string,
@@ -16,6 +17,7 @@ export class SendCoinsResponseJwtPayloadType extends JwtPayloadType {
recipFirstName: string | null,
recipLastName: string | null,
recipAlias: string | null,
+ recipEmail: string | null,
) {
super(handshakeID)
this.tokentype = SendCoinsResponseJwtPayloadType.SEND_COINS_RESPONSE_TYPE
@@ -24,5 +26,6 @@ export class SendCoinsResponseJwtPayloadType extends JwtPayloadType {
this.recipFirstName = recipFirstName
this.recipLastName = recipLastName
this.recipAlias = recipAlias
+ this.recipEmail = recipEmail
}
}