From 0c72fae9a23d86ec5bf5bd4de42f48f72221b188 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Thu, 17 Aug 2023 14:09:15 +0200 Subject: [PATCH] first steps of starting X-sendCoins --- .../src/graphql/arg/TransactionSendArgs.ts | 3 ++ .../graphql/resolver/TransactionResolver.ts | 39 ++++++++++++------- .../src/graphql/resolver/util/communities.ts | 19 +++++++++ frontend/src/graphql/mutations.js | 2 +- 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 backend/src/graphql/resolver/util/communities.ts diff --git a/backend/src/graphql/arg/TransactionSendArgs.ts b/backend/src/graphql/arg/TransactionSendArgs.ts index ecda848d1..010c71183 100644 --- a/backend/src/graphql/arg/TransactionSendArgs.ts +++ b/backend/src/graphql/arg/TransactionSendArgs.ts @@ -3,6 +3,9 @@ import { ArgsType, Field } from 'type-graphql' @ArgsType() export class TransactionSendArgs { + @Field(() => String) + communityIdentifier: string + @Field(() => String) identifier: string diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index ba5d6e155..2cf6abb0d 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -34,6 +34,7 @@ import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualT import { BalanceResolver } from './BalanceResolver' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' +import { isHomeCommunity } from './util/communities' import { findUserByIdentifier } from './util/findUserByIdentifier' import { getLastTransaction } from './util/getLastTransaction' import { getTransactionList } from './util/getTransactionList' @@ -317,24 +318,32 @@ export class TransactionResolver { @Authorized([RIGHTS.SEND_COINS]) @Mutation(() => Boolean) async sendCoins( - @Args() { identifier, amount, memo }: TransactionSendArgs, + @Args() { communityIdentifier, identifier, amount, memo }: TransactionSendArgs, @Ctx() context: Context, ): Promise { - logger.info(`sendCoins(identifier=${identifier}, amount=${amount}, memo=${memo})`) - if (amount.lte(0)) { - throw new LogError('Amount to send must be positive', amount) + logger.info( + `sendCoins(communityIdentifier=${communityIdentifier}, identifier=${identifier}, amount=${amount}, memo=${memo})`, + ) + if (!communityIdentifier || (await isHomeCommunity(communityIdentifier))) { + // processing a local sendCoins + if (amount.lte(0)) { + throw new LogError('Amount to send must be positive', amount) + } + + const senderUser = getUser(context) + + // validate recipient user + const recipientUser = await findUserByIdentifier(identifier) + if (!recipientUser) { + throw new LogError('The recipient user was not found', recipientUser) + } + + await executeTransaction(amount, memo, senderUser, recipientUser) + logger.info('successful executeTransaction', amount, memo, senderUser, recipientUser) + } else { + // processing a x-community sendCoins + logger.debug('processing a x-community transaction...') } - - const senderUser = getUser(context) - - // validate recipient user - const recipientUser = await findUserByIdentifier(identifier) - if (!recipientUser) { - throw new LogError('The recipient user was not found', recipientUser) - } - - await executeTransaction(amount, memo, senderUser, recipientUser) - logger.info('successful executeTransaction', amount, memo, senderUser, recipientUser) return true } } diff --git a/backend/src/graphql/resolver/util/communities.ts b/backend/src/graphql/resolver/util/communities.ts new file mode 100644 index 000000000..49a3f7744 --- /dev/null +++ b/backend/src/graphql/resolver/util/communities.ts @@ -0,0 +1,19 @@ +import { Community as DbCommunity } from '@entity/Community' + +export async function isHomeCommunity(communityIdentifier: string): Promise { + const homeCommunity = await DbCommunity.findOneByOrFail({ foreign: false }) + if (communityIdentifier === homeCommunity.name) { + return true + } else if (communityIdentifier === homeCommunity.communityUuid) { + return true + } else if (communityIdentifier === homeCommunity.url) { + return true + } else { + return false + } +} + +export async function getCommunityUrl(communityIdentifier: string): Promise { + const community = await DbCommunity.findOneByOrFail({ name: communityIdentifier }) + return community.url +} diff --git a/frontend/src/graphql/mutations.js b/frontend/src/graphql/mutations.js index 2f6b53ac9..2065d92a8 100644 --- a/frontend/src/graphql/mutations.js +++ b/frontend/src/graphql/mutations.js @@ -72,7 +72,7 @@ export const createUser = gql` export const sendCoins = gql` mutation($identifier: String!, $amount: Decimal!, $memo: String!) { - sendCoins(identifier: $identifier, amount: $amount, memo: $memo) + sendCoins(communityIdentifier: $communityIdentifier, identifier: $identifier, amount: $amount, memo: $memo) } `