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/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, 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/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/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts new file mode 100644 index 000000000..2f54dc70c --- /dev/null +++ b/backend/src/seeds/factory/transactionLink.ts @@ -0,0 +1,43 @@ +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' + +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, + } + + // get the transaction links's id + const { + data: { + createTransactionLink: { id }, + }, + } = await mutate({ mutation: createTransactionLink, variables }) + + if (transactionLink.createdAt || transactionLink.deletedAt) { + const dbTransactionLink = await TransactionLink.findOneOrFail({ id }) + + 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/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..19ca2a8d0 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 + } } ` @@ -65,6 +67,7 @@ export const sendCoins = gql` export const createTransactionLink = gql` mutation ($amount: Decimal!, $memo: String!) { createTransactionLink(amount: $amount, memo: $memo) { + id code } } 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 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..ddc835b33 --- /dev/null +++ b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts @@ -0,0 +1,7 @@ +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 new file mode 100644 index 000000000..25755c0f2 --- /dev/null +++ b/backend/src/seeds/transactionLink/index.ts @@ -0,0 +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, + }, +] diff --git a/frontend/src/graphql/mutations.js b/frontend/src/graphql/mutations.js index 89721f02b..5db319ad2 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 + } } `