From 12f3a7ab4abe56cae81664757070db4508753088 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 15 Mar 2022 21:03:55 +0100 Subject: [PATCH 1/6] set up seed for transaction links --- backend/src/seeds/factory/transactionLink.ts | 21 +++++++++++++++++++ backend/src/seeds/index.ts | 7 +++++++ .../TransactionLinkInterface.ts | 5 +++++ backend/src/seeds/transactionLink/index.ts | 10 +++++++++ 4 files changed, 43 insertions(+) create mode 100644 backend/src/seeds/factory/transactionLink.ts create mode 100644 backend/src/seeds/transactionLink/TransactionLinkInterface.ts create mode 100644 backend/src/seeds/transactionLink/index.ts diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts new file mode 100644 index 000000000..c1ea13915 --- /dev/null +++ b/backend/src/seeds/factory/transactionLink.ts @@ -0,0 +1,21 @@ +import { ApolloServerTestClient } from 'apollo-server-testing' +import { createTransactionLink } from '@/seeds/graphql/mutations' +import { login } from '@/seeds/graphql/queries' +import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface' + +export const transactionLinkFactory = async ( + client: ApolloServerTestClient, + transactionLink: TransactionLinkInterface, +): Promise => { + const { mutate, query } = client + + // login + await query({ query: login, variables: { email: transactionLink.email, password: 'Aa12345_' } }) + + const variables = { + amount: transactionLink.amount, + memo: transactionLink.memo, + } + + await mutate({ mutation: createTransactionLink, variables }) +} diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts index 3943a63e0..37c9992a7 100644 --- a/backend/src/seeds/index.ts +++ b/backend/src/seeds/index.ts @@ -8,8 +8,10 @@ import { name, internet, random } from 'faker' import { users } from './users/index' import { creations } from './creation/index' +import { transactionLinks } from './transactionLink/index' import { userFactory } from './factory/user' import { creationFactory } from './factory/creation' +import { transactionLinkFactory } from './factory/transactionLink' import { entities } from '@entity/index' const context = { @@ -64,6 +66,11 @@ const run = async () => { await creationFactory(seedClient, creations[i]) } + // create Transaction Links + for (let i = 0; i < transactionLinks.length; i++) { + await transactionLinkFactory(seedClient, transactionLinks[i]) + } + await con.close() } diff --git a/backend/src/seeds/transactionLink/TransactionLinkInterface.ts b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts new file mode 100644 index 000000000..94b14992b --- /dev/null +++ b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts @@ -0,0 +1,5 @@ +export interface TransactionLinkInterface { + email: string + amount: number + memo: string +} diff --git a/backend/src/seeds/transactionLink/index.ts b/backend/src/seeds/transactionLink/index.ts new file mode 100644 index 000000000..cd952c47f --- /dev/null +++ b/backend/src/seeds/transactionLink/index.ts @@ -0,0 +1,10 @@ +import { TransactionLinkInterface } from './TransactionLinkInterface' + +export const transactionLinks: TransactionLinkInterface[] = [ + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, +] From 5b9463ca2a20b31278d99b7244d0fadd7058ee27 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 15 Mar 2022 21:24:44 +0100 Subject: [PATCH 2/6] seed deleted and outdated transaction links --- .../resolver/TransactionLinkResolver.ts | 2 +- backend/src/seeds/factory/transactionLink.ts | 22 ++++++++++ .../TransactionLinkInterface.ts | 2 + backend/src/seeds/transactionLink/index.ts | 42 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 9e2af6111..32f30807b 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -29,7 +29,7 @@ export const transactionLinkCode = (date: Date): string => { const CODE_VALID_DAYS_DURATION = 14 -const transactionLinkExpireDate = (date: Date): Date => { +export const transactionLinkExpireDate = (date: Date): Date => { const validUntil = new Date(date) return new Date(validUntil.setDate(date.getDate() + CODE_VALID_DAYS_DURATION)) } diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts index c1ea13915..665ae03f3 100644 --- a/backend/src/seeds/factory/transactionLink.ts +++ b/backend/src/seeds/factory/transactionLink.ts @@ -2,6 +2,9 @@ import { ApolloServerTestClient } from 'apollo-server-testing' import { createTransactionLink } from '@/seeds/graphql/mutations' import { login } from '@/seeds/graphql/queries' import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface' +import { transactionLinkExpireDate } from '@/graphql/resolver/TransactionLinkResolver' +import { TransactionLink } from '@entity/TransactionLink' +import { User } from '@entity/User' export const transactionLinkFactory = async ( client: ApolloServerTestClient, @@ -18,4 +21,23 @@ export const transactionLinkFactory = async ( } await mutate({ mutation: createTransactionLink, variables }) + + if (transactionLink.createdAt || transactionLink.deletedAt) { + const user = await User.findOneOrFail({ where: { email: transactionLink.email } }) + const dbTransactionLink = await TransactionLink.findOneOrFail({ + where: { userId: user.id }, + order: { createdAt: 'DESC' }, + }) + + if (transactionLink.createdAt) { + dbTransactionLink.createdAt = transactionLink.createdAt + dbTransactionLink.validUntil = transactionLinkExpireDate(transactionLink.createdAt) + await dbTransactionLink.save() + } + + if (transactionLink.deletedAt) { + dbTransactionLink.deletedAt = new Date() + await dbTransactionLink.save() + } + } } diff --git a/backend/src/seeds/transactionLink/TransactionLinkInterface.ts b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts index 94b14992b..ddc835b33 100644 --- a/backend/src/seeds/transactionLink/TransactionLinkInterface.ts +++ b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts @@ -2,4 +2,6 @@ export interface TransactionLinkInterface { email: string amount: number memo: string + createdAt?: Date + deletedAt?: boolean } diff --git a/backend/src/seeds/transactionLink/index.ts b/backend/src/seeds/transactionLink/index.ts index cd952c47f..25755c0f2 100644 --- a/backend/src/seeds/transactionLink/index.ts +++ b/backend/src/seeds/transactionLink/index.ts @@ -1,10 +1,52 @@ import { TransactionLinkInterface } from './TransactionLinkInterface' export const transactionLinks: TransactionLinkInterface[] = [ + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', + createdAt: new Date(2022, 0, 1), + }, { email: 'bibi@bloxberg.de', amount: 19.99, memo: `Kein Trick, keine Zauberrei, bei Gradidio sei dabei!`, }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: 'Da habe ich mich wohl etwas übernommen.', + deletedAt: true, + }, ] From 1182b94075e2b1d0ba2865400dcd680c83a1a728 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 17 Mar 2022 08:40:02 +0100 Subject: [PATCH 3/6] createUser returns User object, adopt mutations, reduce db calls in seed --- backend/src/graphql/resolver/UserResolver.ts | 6 +-- backend/src/seeds/factory/user.ts | 47 +++++++++++--------- backend/src/seeds/graphql/mutations.ts | 4 +- frontend/src/graphql/mutations.js | 4 +- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 9896ddc97..a18833d58 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -313,10 +313,10 @@ export class UserResolver { } @Authorized([RIGHTS.CREATE_USER]) - @Mutation(() => String) + @Mutation(() => User) async createUser( @Args() { email, firstName, lastName, language, publisherId }: CreateUserArgs, - ): Promise { + ): Promise { // TODO: wrong default value (should be null), how does graphql work here? Is it an required field? // default int publisher_id = 0; @@ -396,7 +396,7 @@ export class UserResolver { } finally { await queryRunner.release() } - return 'success' + return new User(dbUser) } // THis is used by the admin only - should we move it to the admin resolver? diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 6d81f26a6..ff4c1d6c9 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -11,36 +11,41 @@ export const userFactory = async ( ): Promise => { const { mutate } = client - await mutate({ mutation: createUser, variables: user }) - let dbUser = await User.findOneOrFail({ where: { email: user.email } }) + const { + data: { + createUser: { id }, + }, + } = await mutate({ mutation: createUser, variables: user }) if (user.emailChecked) { - const optin = await LoginEmailOptIn.findOneOrFail({ where: { userId: dbUser.id } }) + const optin = await LoginEmailOptIn.findOneOrFail({ userId: id }) await mutate({ mutation: setPassword, variables: { password: 'Aa12345_', code: optin.verificationCode }, }) } - // refetch data - dbUser = await User.findOneOrFail({ where: { email: user.email } }) + if (user.createdAt || user.deletedAt || user.isAdmin) { + // get user from database + const dbUser = await User.findOneOrFail({ id }) - if (user.createdAt || user.deletedAt) { - if (user.createdAt) dbUser.createdAt = user.createdAt - if (user.deletedAt) dbUser.deletedAt = user.deletedAt - await dbUser.save() - } + if (user.createdAt || user.deletedAt) { + if (user.createdAt) dbUser.createdAt = user.createdAt + if (user.deletedAt) dbUser.deletedAt = user.deletedAt + await dbUser.save() + } - if (user.isAdmin) { - const admin = new ServerUser() - admin.username = dbUser.firstName - admin.password = 'please_refactor' - admin.email = dbUser.email - admin.role = 'admin' - admin.activated = 1 - admin.lastLogin = new Date() - admin.created = dbUser.createdAt - admin.modified = dbUser.createdAt - await admin.save() + if (user.isAdmin) { + const admin = new ServerUser() + admin.username = dbUser.firstName + admin.password = 'please_refactor' + admin.email = dbUser.email + admin.role = 'admin' + admin.activated = 1 + admin.lastLogin = new Date() + admin.created = dbUser.createdAt + admin.modified = dbUser.createdAt + await admin.save() + } } } diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index 32232e410..306f4350b 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -52,7 +52,9 @@ export const createUser = gql` lastName: $lastName language: $language publisherId: $publisherId - ) + ) { + id + } } ` diff --git a/frontend/src/graphql/mutations.js b/frontend/src/graphql/mutations.js index d4bf8c1da..98905e8d6 100644 --- a/frontend/src/graphql/mutations.js +++ b/frontend/src/graphql/mutations.js @@ -52,7 +52,9 @@ export const createUser = gql` lastName: $lastName language: $language publisherId: $publisherId - ) + ) { + id + } } ` From 8a350e7cab44bfda90c62f14c9745b782588c3ce Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 17 Mar 2022 08:48:49 +0100 Subject: [PATCH 4/6] get user id by login query in seeds --- backend/src/seeds/factory/creation.ts | 14 +++++++------- backend/src/seeds/graphql/queries.ts | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index 980e0b3af..d4d4c8101 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -15,14 +15,14 @@ export const creationFactory = async ( ): Promise => { const { mutate, query } = client - // login as Peter Lustig (admin) - await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) + // login as Peter Lustig (admin) and get his user ID + const { + data: { + login: { id }, + }, + } = await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) - // get Peter Lustig's user id - const peterLustig = await User.findOneOrFail({ where: { email: 'peter@lustig.de' } }) - const variables = { ...creation, moderator: peterLustig.id } - - await mutate({ mutation: createPendingCreation, variables }) + await mutate({ mutation: createPendingCreation, variables: { ...creation, moderator: id } }) // get User const user = await User.findOneOrFail({ where: { email: creation.email } }) diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts index 942258fde..04f849727 100644 --- a/backend/src/seeds/graphql/queries.ts +++ b/backend/src/seeds/graphql/queries.ts @@ -3,6 +3,7 @@ import gql from 'graphql-tag' export const login = gql` query ($email: String!, $password: String!, $publisherId: Int) { login(email: $email, password: $password, publisherId: $publisherId) { + id email firstName lastName From 689d6c3fb87ba5b36eddc6bd0d6c8f81b6981f94 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 17 Mar 2022 08:58:07 +0100 Subject: [PATCH 5/6] get transaction link id by mutation call --- backend/src/seeds/factory/transactionLink.ts | 14 +++++++------- backend/src/seeds/graphql/mutations.ts | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts index 665ae03f3..2f54dc70c 100644 --- a/backend/src/seeds/factory/transactionLink.ts +++ b/backend/src/seeds/factory/transactionLink.ts @@ -4,7 +4,6 @@ import { login } from '@/seeds/graphql/queries' import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface' import { transactionLinkExpireDate } from '@/graphql/resolver/TransactionLinkResolver' import { TransactionLink } from '@entity/TransactionLink' -import { User } from '@entity/User' export const transactionLinkFactory = async ( client: ApolloServerTestClient, @@ -20,14 +19,15 @@ export const transactionLinkFactory = async ( memo: transactionLink.memo, } - await mutate({ mutation: createTransactionLink, variables }) + // get the transaction links's id + const { + data: { + createTransactionLink: { id }, + }, + } = await mutate({ mutation: createTransactionLink, variables }) if (transactionLink.createdAt || transactionLink.deletedAt) { - const user = await User.findOneOrFail({ where: { email: transactionLink.email } }) - const dbTransactionLink = await TransactionLink.findOneOrFail({ - where: { userId: user.id }, - order: { createdAt: 'DESC' }, - }) + const dbTransactionLink = await TransactionLink.findOneOrFail({ id }) if (transactionLink.createdAt) { dbTransactionLink.createdAt = transactionLink.createdAt diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index 306f4350b..19ca2a8d0 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -67,6 +67,7 @@ export const sendCoins = gql` export const createTransactionLink = gql` mutation ($amount: Decimal!, $memo: String!) { createTransactionLink(amount: $amount, memo: $memo) { + id code } } From 51c06741fcb31879f12c3191870fc8a516728ce7 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 17 Mar 2022 09:06:40 +0100 Subject: [PATCH 6/6] get test working with chages to the schema --- backend/src/graphql/resolver/UserResolver.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 1e1e266fb..66e435207 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -69,7 +69,9 @@ describe('UserResolver', () => { }) it('returns success', () => { - expect(result).toEqual(expect.objectContaining({ data: { createUser: 'success' } })) + expect(result).toEqual( + expect.objectContaining({ data: { createUser: { id: expect.any(Number) } } }), + ) }) describe('valid input data', () => { @@ -331,6 +333,7 @@ describe('UserResolver', () => { email: 'bibi@bloxberg.de', firstName: 'Bibi', hasElopage: false, + id: expect.any(Number), isAdmin: false, klickTipp: { newsletterState: false,