From 06b5c7606c7b00c4654a5177dd0a869b1916fc77 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 16 Jun 2022 10:57:38 +0200 Subject: [PATCH] query for transaction link may find a contribution link --- .../resolver/TransactionLinkResolver.ts | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 733f1db28..f6e3c1c97 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -1,7 +1,19 @@ import { Context, getUser } from '@/server/context' -import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query, Int } from 'type-graphql' +import { + Resolver, + Args, + Arg, + Authorized, + Ctx, + Mutation, + Query, + Int, + createUnionType, +} from 'type-graphql' import { TransactionLink } from '@model/TransactionLink' +import { ContributionLink } from '@model/ContributionLink' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import { ContributionLink as dbContributionLink } from '@entity/ContributionLink' import { User as dbUser } from '@entity/User' import TransactionLinkArgs from '@arg/TransactionLinkArgs' import Paginated from '@arg/Paginated' @@ -13,6 +25,11 @@ import { calculateDecay } from '@/util/decay' import { executeTransaction } from './TransactionResolver' import { Order } from '@enum/Order' +const QueryLinkResult = createUnionType({ + name: 'QueryLinkResult', // the name of the GraphQL union + types: () => [TransactionLink, ContributionLink] as const, // function that returns tuple of object types classes +}) + // TODO: do not export, test it inside the resolver export const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -95,15 +112,23 @@ export class TransactionLinkResolver { } @Authorized([RIGHTS.QUERY_TRANSACTION_LINK]) - @Query(() => TransactionLink) - async queryTransactionLink(@Arg('code') code: string): Promise { - const transactionLink = await dbTransactionLink.findOneOrFail({ code }, { withDeleted: true }) - const user = await dbUser.findOneOrFail({ id: transactionLink.userId }) - let redeemedBy: User | null = null - if (transactionLink && transactionLink.redeemedBy) { - redeemedBy = new User(await dbUser.findOneOrFail({ id: transactionLink.redeemedBy })) + @Query(() => QueryLinkResult) + async queryTransactionLink(@Arg('code') code: string): Promise { + if (code.match(/^CL-/)) { + const contributionLink = await dbContributionLink.findOneOrFail( + { code: code.replace('CL-', '') }, + { withDeleted: true }, + ) + return new ContributionLink(contributionLink) + } else { + const transactionLink = await dbTransactionLink.findOneOrFail({ code }, { withDeleted: true }) + const user = await dbUser.findOneOrFail({ id: transactionLink.userId }) + let redeemedBy: User | null = null + if (transactionLink && transactionLink.redeemedBy) { + redeemedBy = new User(await dbUser.findOneOrFail({ id: transactionLink.redeemedBy })) + } + return new TransactionLink(transactionLink, new User(user), redeemedBy) } - return new TransactionLink(transactionLink, new User(user), redeemedBy) } @Authorized([RIGHTS.LIST_TRANSACTION_LINKS])