From 437da5eedaaa9ad13dc9a6c08b44e859217d8645 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 11:05:01 +0100 Subject: [PATCH 01/13] feat: Transaction Link Model --- backend/src/graphql/model/TransactionLink.ts | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backend/src/graphql/model/TransactionLink.ts diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts new file mode 100644 index 000000000..4511c5cdd --- /dev/null +++ b/backend/src/graphql/model/TransactionLink.ts @@ -0,0 +1,33 @@ +import { ObjectType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' +import { User } from './User' + +@ObjectType() +export class TransactionLink { + @Field(() => Number) + id: number + + @Field(() => User) + user: User + + @Field(() => Decimal) + amount: Decimal + + @Field(() => String) + memo: string + + @Field(() => Date) + createdAt: Date + + @Field(() => Date) + validUntil: Date + + @Field(() => Boolean) + showEmail: boolean + + @Field(() => Date, { nullable: true }) + redeemedAt: Date | null + + @Field(() => User, { nullable: true }) + redeemedBy: User | null +} From 5f5bde2f0f336cc43fef7da40b31861583e4bfd1 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 11:38:24 +0100 Subject: [PATCH 02/13] migration to create transaction_links table --- database/migrations/0030-transaction_link.ts | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 database/migrations/0030-transaction_link.ts diff --git a/database/migrations/0030-transaction_link.ts b/database/migrations/0030-transaction_link.ts new file mode 100644 index 000000000..ca0f0cfa5 --- /dev/null +++ b/database/migrations/0030-transaction_link.ts @@ -0,0 +1,25 @@ +/* MIGRATION TO CREATE TRANSACTION_LINK TABLE */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`transaction_links\` ( + \`id\` int UNSIGNED NOT NULL AUTO_INCREMENT, + \`userId\` int UNSIGNED NOT NULL, + \`amount\` DECIMAL(40,20) NOT NULL, + \`memo\` varchar(255) NOT NULL, + \`createdAt\` datetime NOT NULL, + \`validUntil\` datetime NOT NULL, + \`showEmail\` boolean NOT NULL DEFAULT false, + \`redeemedAt\` datetime, + \`redeemedBy\` int UNSIGNED, + PRIMARY KEY (\`id\`) + ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE \`transaction_links\`;`) +} From 19084d75140f0bff041a91441dd51a11a2365e9f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 11:55:36 +0100 Subject: [PATCH 03/13] entity transaction link --- .../0030-transaction_link/TransactionLink.ts | 55 +++++++++++++++++++ database/entity/TransactionLink.ts | 1 + database/entity/index.ts | 2 + 3 files changed, 58 insertions(+) create mode 100644 database/entity/0030-transaction_link/TransactionLink.ts create mode 100644 database/entity/TransactionLink.ts diff --git a/database/entity/0030-transaction_link/TransactionLink.ts b/database/entity/0030-transaction_link/TransactionLink.ts new file mode 100644 index 000000000..11f1be6a3 --- /dev/null +++ b/database/entity/0030-transaction_link/TransactionLink.ts @@ -0,0 +1,55 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transaction_links') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ unsigned: true, nullable: false }) + userId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + createdAt: Date + + @Column({ + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + validUntil: Date + + @Column({ + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: true, + }) + redeemedAt: Date + + @Column({ + type: 'boolean', + default: () => false, + nullable: false, + }) + showEmail: boolean + + @Column({ unsigned: true, nullable: true }) + redeemedBy: number +} diff --git a/database/entity/TransactionLink.ts b/database/entity/TransactionLink.ts new file mode 100644 index 000000000..fde2ba9e0 --- /dev/null +++ b/database/entity/TransactionLink.ts @@ -0,0 +1 @@ +export { TransactionLink } from './0030-transaction_link/TransactionLink' diff --git a/database/entity/index.ts b/database/entity/index.ts index bee4e2b77..cb6f56ab0 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -3,6 +3,7 @@ import { LoginEmailOptIn } from './LoginEmailOptIn' import { Migration } from './Migration' import { ServerUser } from './ServerUser' import { Transaction } from './Transaction' +import { TransactionLink } from './TransactionLink' import { User } from './User' import { UserSetting } from './UserSetting' import { AdminPendingCreation } from './AdminPendingCreation' @@ -14,6 +15,7 @@ export const entities = [ Migration, ServerUser, Transaction, + TransactionLink, User, UserSetting, ] From eb5b19e6d6e01babe373fc8309621b7996d566f4 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 12:02:10 +0100 Subject: [PATCH 04/13] add code column to model and entity --- backend/src/graphql/model/TransactionLink.ts | 3 +++ database/entity/0030-transaction_link/TransactionLink.ts | 5 ++++- database/migrations/0030-transaction_link.ts | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index 4511c5cdd..c46728407 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -16,6 +16,9 @@ export class TransactionLink { @Field(() => String) memo: string + @Field(() => String) + code: string + @Field(() => Date) createdAt: Date diff --git a/database/entity/0030-transaction_link/TransactionLink.ts b/database/entity/0030-transaction_link/TransactionLink.ts index 11f1be6a3..d04c00d7b 100644 --- a/database/entity/0030-transaction_link/TransactionLink.ts +++ b/database/entity/0030-transaction_link/TransactionLink.ts @@ -3,7 +3,7 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' @Entity('transaction_links') -export class Transaction extends BaseEntity { +export class TransactionLink extends BaseEntity { @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number @@ -22,6 +22,9 @@ export class Transaction extends BaseEntity { @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) memo: string + @Column({ length: 96, nullable: false, collation: 'utf8mb4_unicode_ci' }) + code: string + @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', diff --git a/database/migrations/0030-transaction_link.ts b/database/migrations/0030-transaction_link.ts index ca0f0cfa5..59eba1090 100644 --- a/database/migrations/0030-transaction_link.ts +++ b/database/migrations/0030-transaction_link.ts @@ -10,6 +10,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`userId\` int UNSIGNED NOT NULL, \`amount\` DECIMAL(40,20) NOT NULL, \`memo\` varchar(255) NOT NULL, + \`code\` varchar(96) NOT NULL, \`createdAt\` datetime NOT NULL, \`validUntil\` datetime NOT NULL, \`showEmail\` boolean NOT NULL DEFAULT false, From 75b91a2db3c18c8a81ff82d0db5194fc25f5d20f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 14:27:53 +0100 Subject: [PATCH 05/13] set type for redeemed by, change order --- .../0030-transaction_link/TransactionLink.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/database/entity/0030-transaction_link/TransactionLink.ts b/database/entity/0030-transaction_link/TransactionLink.ts index d04c00d7b..a3ab5cd1a 100644 --- a/database/entity/0030-transaction_link/TransactionLink.ts +++ b/database/entity/0030-transaction_link/TransactionLink.ts @@ -39,13 +39,6 @@ export class TransactionLink extends BaseEntity { }) validUntil: Date - @Column({ - type: 'datetime', - default: () => 'CURRENT_TIMESTAMP', - nullable: true, - }) - redeemedAt: Date - @Column({ type: 'boolean', default: () => false, @@ -53,6 +46,13 @@ export class TransactionLink extends BaseEntity { }) showEmail: boolean - @Column({ unsigned: true, nullable: true }) - redeemedBy: number + @Column({ + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: true, + }) + redeemedAt?: Date | null + + @Column({ type: 'int', unsigned: true, nullable: true }) + redeemedBy?: number | null } From e8e86d6351c42553d967782e722fcba33854764e Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 14:28:28 +0100 Subject: [PATCH 06/13] set DB version --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 82fb9ff2b..4cd428153 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0029-clean_transaction_table', + DB_VERSION: '0030-transaction_link', DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0 } From c9d24c3b61d5a9436d93ee86c432f607cb00d185 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 14:29:20 +0100 Subject: [PATCH 07/13] add constructor --- backend/src/graphql/model/TransactionLink.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index c46728407..98f86a772 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -1,9 +1,23 @@ import { ObjectType, Field } from 'type-graphql' import Decimal from 'decimal.js-light' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { User } from './User' @ObjectType() export class TransactionLink { + constructor(transactionLink: dbTransactionLink, user: User) { + this.id = transactionLink.id + this.user = user + this.amount = transactionLink.amount + this.memo = transactionLink.memo + this.code = transactionLink.code + this.createdAt = transactionLink.createdAt + this.validUntil = transactionLink.validUntil + this.showEmail = transactionLink.showEmail + this.redeemedAt = null + this.redeemedBy = null + } + @Field(() => Number) id: number From e88f5610030e7568c2d49dd8f841b49513e46b9f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 14:29:57 +0100 Subject: [PATCH 08/13] rights for createTransactionLink --- backend/src/auth/RIGHTS.ts | 1 + backend/src/auth/ROLES.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 3b3f7580c..a18f0132a 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -18,6 +18,7 @@ export enum RIGHTS { SET_PASSWORD = 'SET_PASSWORD', UPDATE_USER_INFOS = 'UPDATE_USER_INFOS', HAS_ELOPAGE = 'HAS_ELOPAGE', + CREATE_TRANSACTION_LINK = 'CREATE_TRANSACTION_LINK', // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index ada6a2cef..37a4e3a67 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -18,6 +18,7 @@ export const ROLE_USER = new Role('user', [ RIGHTS.LOGOUT, RIGHTS.UPDATE_USER_INFOS, RIGHTS.HAS_ELOPAGE, + RIGHTS.CREATE_TRANSACTION_LINK, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights From 1a715f8b7108fce62605404a307d429982f1a5e6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 9 Mar 2022 14:30:25 +0100 Subject: [PATCH 09/13] simple resolver for createTransactionLink --- .../src/graphql/arg/TransactionLinkArgs.ts | 14 ++++ .../resolver/TransactionLinkResolver.test.ts | 14 ++++ .../resolver/TransactionLinkResolver.ts | 65 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 backend/src/graphql/arg/TransactionLinkArgs.ts create mode 100644 backend/src/graphql/resolver/TransactionLinkResolver.test.ts create mode 100644 backend/src/graphql/resolver/TransactionLinkResolver.ts diff --git a/backend/src/graphql/arg/TransactionLinkArgs.ts b/backend/src/graphql/arg/TransactionLinkArgs.ts new file mode 100644 index 000000000..5ccb967d3 --- /dev/null +++ b/backend/src/graphql/arg/TransactionLinkArgs.ts @@ -0,0 +1,14 @@ +import { ArgsType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' + +@ArgsType() +export default class TransactionLinkArgs { + @Field(() => Decimal) + amount: Decimal + + @Field(() => String) + memo: string + + @Field(() => Boolean, { nullable: true }) + showEmail?: boolean +} diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts new file mode 100644 index 000000000..51790502d --- /dev/null +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -0,0 +1,14 @@ +import { transactionLinkCode } from './TransactionLinkResolver' + +describe('transactionLinkCode', () => { + const date = new Date() + + it('returns a string of length 96', () => { + expect(transactionLinkCode(date)).toHaveLength(96) + }) + + it('returns a string that ends with the hex value of date', () => { + const regexp = new RegExp(date.getTime().toString(16) + '$') + expect(transactionLinkCode(date)).toEqual(expect.stringMatching(regexp)) + }) +}) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts new file mode 100644 index 000000000..920e18569 --- /dev/null +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -0,0 +1,65 @@ +/* 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 { getCustomRepository } from '@dbTools/typeorm' +import { TransactionLink } from '@model/TransactionLink' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import TransactionLinkArgs from '@arg/TransactionLinkArgs' +import { UserRepository } from '@repository/User' +import { calculateBalance } from '@/util/validate' +import { RIGHTS } from '@/auth/RIGHTS' +import { randomBytes } from 'crypto' +import { User } from '@model/User' + +// TODO: do not export, test it inside the resolver +export const transactionLinkCode = (date: Date): string => { + const time = date.getTime().toString(16) + return ( + randomBytes(48) + .toString('hex') + .substring(0, 96 - time.length) + time + ) +} + +const transactionLinkExpireDate = (date: Date): Date => { + // valid for 14 days + return new Date(date.setDate(date.getDate() + 14)) +} + +@Resolver() +export class TransactionLinkResolver { + @Authorized([RIGHTS.CREATE_TRANSACTION_LINK]) + @Mutation(() => TransactionLink) + async createTransactionLink( + @Args() { amount, memo, showEmail = false }: TransactionLinkArgs, + @Ctx() context: any, + ): Promise { + const userRepository = getCustomRepository(UserRepository) + const user = await userRepository.findByPubkeyHex(context.pubKey) + + // validate amount + // TODO taken from transaction resolver, duplicate code + const createdDate = new Date() + const sendBalance = await calculateBalance(user.id, amount.mul(-1), createdDate) + if (!sendBalance) { + throw new Error("user hasn't enough GDD or amount is < 0") + } + + // TODO!!!! Test balance for pending transaction links + + const transactionLink = dbTransactionLink.create() + transactionLink.userId = user.id + transactionLink.amount = amount + transactionLink.memo = memo + transactionLink.code = transactionLinkCode(createdDate) + transactionLink.createdAt = createdDate + transactionLink.validUntil = transactionLinkExpireDate(createdDate) + transactionLink.showEmail = showEmail + await dbTransactionLink.save(transactionLink).catch((error) => { + throw error + }) + + return new TransactionLink(transactionLink, new User(user)) + } +} From a0e241e6b08a31e9394432d97662bbd98b53d338 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 9 Mar 2022 15:16:13 +0100 Subject: [PATCH 10/13] Created Query that search for an TransactionLink with a given code --- backend/src/auth/RIGHTS.ts | 1 + .../src/graphql/resolver/TransactionLinkResolver.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index a18f0132a..6bcd3fa43 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -19,6 +19,7 @@ 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/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 920e18569..3091465d5 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -1,7 +1,7 @@ /* 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, Arg } from 'type-graphql' import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLink } from '@model/TransactionLink' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' @@ -62,4 +62,13 @@ export class TransactionLinkResolver { return new TransactionLink(transactionLink, new User(user)) } + + @Authorized([RIGHTS.QUERY_TRANSACTION_LINK]) + @Query(() => TransactionLink) + async queryTransactionLink(@Arg('code') code: string): Promise { + const transactionLink = await dbTransactionLink.findOneOrFail({ code }) + const userRepository = getCustomRepository(UserRepository) + const user = await userRepository.findOneOrFail({ id: transactionLink.userId }) + return new TransactionLink(transactionLink, new User(user)) + } } From 3c9b5ea63cb4dfa348b00027e4acf64ee068f69b Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 9 Mar 2022 17:15:04 +0100 Subject: [PATCH 11/13] Create query to getTransactionLinkInformation. --- backend/src/graphql/resolver/TransactionLinkResolver.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 3091465d5..2ed19fd5f 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -66,7 +66,8 @@ export class TransactionLinkResolver { @Authorized([RIGHTS.QUERY_TRANSACTION_LINK]) @Query(() => TransactionLink) async queryTransactionLink(@Arg('code') code: string): Promise { - const transactionLink = await dbTransactionLink.findOneOrFail({ code }) + console.log(code) + const transactionLink = await dbTransactionLink.findOneOrFail({ code: code }) const userRepository = getCustomRepository(UserRepository) const user = await userRepository.findOneOrFail({ id: transactionLink.userId }) return new TransactionLink(transactionLink, new User(user)) From 281be67ceb2c5499aaa9306f66388aa080163e43 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 9 Mar 2022 17:15:42 +0100 Subject: [PATCH 12/13] Add query to getTransactionInformation to the queries of the frontend. --- frontend/src/graphql/queries.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index 94a5e59f3..457514d18 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -127,3 +127,20 @@ export const communities = gql` } } ` + +export const queryTransactionLink = gql` + query($code: String!) { + queryTransactionLink(code: $code) { + amount + memo + createdAt + validUntil + user { + email + firstName + lastName + publisherId + } + } + } +` From d91310c7de8d831b9a0b41228caf7ffbf4f368fc Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 9 Mar 2022 17:16:26 +0100 Subject: [PATCH 13/13] WIP Implement the frontend to show the transactionLinkInformation. --- .../ShowTransactionLinkInformations.spec.js | 1 + .../pages/ShowTransactionLinkInformations.vue | 56 +++++++++++++++++++ frontend/src/routes/routes.js | 4 ++ 3 files changed, 61 insertions(+) create mode 100644 frontend/src/pages/ShowTransactionLinkInformations.spec.js create mode 100644 frontend/src/pages/ShowTransactionLinkInformations.vue diff --git a/frontend/src/pages/ShowTransactionLinkInformations.spec.js b/frontend/src/pages/ShowTransactionLinkInformations.spec.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/pages/ShowTransactionLinkInformations.spec.js @@ -0,0 +1 @@ + diff --git a/frontend/src/pages/ShowTransactionLinkInformations.vue b/frontend/src/pages/ShowTransactionLinkInformations.vue new file mode 100644 index 000000000..c56db14d6 --- /dev/null +++ b/frontend/src/pages/ShowTransactionLinkInformations.vue @@ -0,0 +1,56 @@ + + diff --git a/frontend/src/routes/routes.js b/frontend/src/routes/routes.js index 3fc8dc766..ea7539190 100755 --- a/frontend/src/routes/routes.js +++ b/frontend/src/routes/routes.js @@ -82,6 +82,10 @@ const routes = [ path: '/checkEmail/:optin', component: () => import('@/pages/ResetPassword.vue'), }, + { + path: '/redeem/:code', + component: () => import('@/pages/ShowTransactionLinkInformations.vue'), + }, { path: '*', component: NotFound }, ]