diff --git a/backend/src/auth/INALIENABLE_RIGHTS.ts b/backend/src/auth/INALIENABLE_RIGHTS.ts index 10d745806..fa9ea2224 100644 --- a/backend/src/auth/INALIENABLE_RIGHTS.ts +++ b/backend/src/auth/INALIENABLE_RIGHTS.ts @@ -7,4 +7,5 @@ export const INALIENABLE_RIGHTS = [ RIGHTS.CREATE_USER, RIGHTS.SEND_RESET_PASSWORD_EMAIL, RIGHTS.SET_PASSWORD, + RIGHTS.QUERY_TRANSACTION_LINK, ] diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index a18f0132a..df4d4a2c1 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -19,6 +19,8 @@ export enum RIGHTS { UPDATE_USER_INFOS = 'UPDATE_USER_INFOS', HAS_ELOPAGE = 'HAS_ELOPAGE', CREATE_TRANSACTION_LINK = 'CREATE_TRANSACTION_LINK', + QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', + // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', diff --git a/backend/src/graphql/arg/QueryTransactionLinkArgs.ts b/backend/src/graphql/arg/QueryTransactionLinkArgs.ts new file mode 100644 index 000000000..2dcd29572 --- /dev/null +++ b/backend/src/graphql/arg/QueryTransactionLinkArgs.ts @@ -0,0 +1,10 @@ +import { ArgsType, Field, Int } from 'type-graphql' + +@ArgsType() +export default class QueryTransactionLinkArgs { + @Field(() => String) + code: string + + @Field(() => Int, { nullable: true }) + redeemUserId?: number +} diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 8be9bfae0..b6edc271d 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Resolver, Args, Authorized, Ctx, Mutation } from 'type-graphql' +import { Resolver, Args, Authorized, Ctx, Mutation, Query } from 'type-graphql' import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLink } from '@model/TransactionLink' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import TransactionLinkArgs from '@arg/TransactionLinkArgs' +import QueryTransactionLinkArgs from '@arg/QueryTransactionLinkArgs' import { UserRepository } from '@repository/User' import { calculateBalance } from '@/util/validate' import { RIGHTS } from '@/auth/RIGHTS' @@ -66,4 +67,33 @@ export class TransactionLinkResolver { return new TransactionLink(transactionLink, new User(user)) } + + @Authorized([RIGHTS.QUERY_TRANSACTION_LINK]) + @Query(() => TransactionLink) + async queryTransactionLink( + @Args() { code, redeemUserId }: QueryTransactionLinkArgs, + ): Promise { + const transactionLink = await dbTransactionLink.findOneOrFail({ code }) + const userRepository = getCustomRepository(UserRepository) + const user = await userRepository.findOneOrFail({ id: transactionLink.userId }) + let userRedeem = null + if (redeemUserId && !transactionLink.redeemedBy) { + const redeemedByUser = await userRepository.findOne({ id: redeemUserId }) + if (!redeemedByUser) { + throw new Error('Unable to find user that redeem the link') + } + userRedeem = new User(redeemedByUser) + transactionLink.redeemedBy = userRedeem.id + await dbTransactionLink.save(transactionLink).catch(() => { + throw new Error('Unable to save transaction link') + }) + } else if (transactionLink.redeemedBy) { + const redeemedByUser = await userRepository.findOne({ id: redeemUserId }) + if (!redeemedByUser) { + throw new Error('Unable to find user that has redeemed the link') + } + userRedeem = new User(redeemedByUser) + } + return new TransactionLink(transactionLink, new User(user), userRedeem) + } }