From 8f117f23b412055a11b21c2fc09fe7696632824f Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 10:13:11 +0200 Subject: [PATCH 01/17] Add new right CREATE_CONTRIBUTION_MESSAGE --- 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 0d8252402..c38315de4 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -33,6 +33,7 @@ export enum RIGHTS { LIST_CONTRIBUTION_LINKS = 'LIST_CONTRIBUTION_LINKS', COMMUNITY_STATISTICS = 'COMMUNITY_STATISTICS', SEARCH_ADMIN_USERS = 'SEARCH_ADMIN_USERS', + CREATE_CONTRIBUTION_MESSAGE = 'CREATE_CONTRIBUTION_MESSAGE', // Admin SEARCH_USERS = 'SEARCH_USERS', SET_USER_ROLE = 'SET_USER_ROLE', diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index f14e77b17..bad18db9e 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -31,6 +31,7 @@ export const ROLE_USER = new Role('user', [ RIGHTS.SEARCH_ADMIN_USERS, RIGHTS.LIST_CONTRIBUTION_LINKS, RIGHTS.COMMUNITY_STATISTICS, + RIGHTS.CREATE_CONTRIBUTION_MESSAGE, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights From a59967d767d0f9aab702f8d501785f2b49b9566d Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 10:30:14 +0200 Subject: [PATCH 02/17] Add new Arg for ContributionMessage --- backend/src/graphql/arg/ContributionMessageArgs.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 backend/src/graphql/arg/ContributionMessageArgs.ts diff --git a/backend/src/graphql/arg/ContributionMessageArgs.ts b/backend/src/graphql/arg/ContributionMessageArgs.ts new file mode 100644 index 000000000..963824350 --- /dev/null +++ b/backend/src/graphql/arg/ContributionMessageArgs.ts @@ -0,0 +1,11 @@ +import { ArgsType, Field, InputType } from 'type-graphql' + +@InputType() +@ArgsType() +export default class ContributionArgs { + @Field(() => Number) + contributionId: number + + @Field(() => String) + message: string +} From 0376cffb193f230faedeaaeb4dbf4c273abed229 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 10:30:48 +0200 Subject: [PATCH 03/17] First steps createContributionMessage method of ContributionMessageResolver. --- .../resolver/ContributionMessageResolver.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backend/src/graphql/resolver/ContributionMessageResolver.ts diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts new file mode 100644 index 000000000..e10bcf853 --- /dev/null +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -0,0 +1,33 @@ +import { RIGHTS } from '@/auth/RIGHTS' +import { Context, getUser } from '@/server/context' +import { ContributionMessage } from '@entity/ContributionMessage' +import { Args, Authorized, Ctx, Mutation, Resolver } from 'type-graphql' +import ContributionMessageArgs from '@arg/ContributionMessageArgs' +import { Contribution } from '@entity/Contribution' +import { ContributionMessageType } from '@enum/MessageType' + +@Resolver() +export class ContributionResolver { + @Authorized([RIGHTS.CREATE_CONTRIBUTION_MESSAGE]) + @Mutation(() => ContributionMessage) + async createContributionMessage( + @Args() { contributionId, message }: ContributionMessageArgs, + @Ctx() context: Context, + ): Promise { + const user = getUser(context) + const contribution = await Contribution.findOneOrFail({ id: contributionId }) + if (!user.isAdmin && contribution.userId !== user.id) { + throw new Error('Can not send message to contribution of another user') + } + + const contributionMessage = new ContributionMessage() + contributionMessage.contributionId = contributionId + contributionMessage.createdAt = new Date() + contributionMessage.message = message + contributionMessage.userId = user.id + contributionMessage.type = ContributionMessageType.DIALOG + + ContributionMessage.save(contributionMessage) + return contributionMessage + } +} From 281f6cde3feb3cd04b054aeaf94564f8d6d74b98 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 10:39:56 +0200 Subject: [PATCH 04/17] Update contributionStatus to new state. --- .../graphql/resolver/ContributionMessageResolver.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index e10bcf853..b6df23488 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -5,6 +5,7 @@ import { Args, Authorized, Ctx, Mutation, Resolver } from 'type-graphql' import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { Contribution } from '@entity/Contribution' import { ContributionMessageType } from '@enum/MessageType' +import { ContributionStatus } from '../enum/ContributionStatus' @Resolver() export class ContributionResolver { @@ -26,8 +27,18 @@ export class ContributionResolver { contributionMessage.message = message contributionMessage.userId = user.id contributionMessage.type = ContributionMessageType.DIALOG - ContributionMessage.save(contributionMessage) + + if (user.isAdmin && contribution.contributionStatus === ContributionStatus.PENDING) { + contribution.contributionStatus = ContributionStatus.IN_PROGRESS + } else if ( + !user.isAdmin && + contribution.contributionStatus === ContributionStatus.IN_PROGRESS + ) { + contribution.contributionStatus = ContributionStatus.PENDING + } + Contribution.save(contribution) + return contributionMessage } } From c5b84694d04111fe6ce316594141ec24ab19b0f4 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 12:16:20 +0200 Subject: [PATCH 05/17] Withdrew admin part of user createContributionMessage. --- .../resolver/ContributionMessageResolver.ts | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index b6df23488..ea80dd7d4 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -1,3 +1,4 @@ +import { backendLogger as logger } from '@/server/logger' import { RIGHTS } from '@/auth/RIGHTS' import { Context, getUser } from '@/server/context' import { ContributionMessage } from '@entity/ContributionMessage' @@ -6,9 +7,11 @@ import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { Contribution } from '@entity/Contribution' import { ContributionMessageType } from '@enum/MessageType' import { ContributionStatus } from '../enum/ContributionStatus' +import { getConnection } from '@dbTools/typeorm' @Resolver() export class ContributionResolver { + // TODO: Have two method one for admin on for @Authorized([RIGHTS.CREATE_CONTRIBUTION_MESSAGE]) @Mutation(() => ContributionMessage) async createContributionMessage( @@ -16,29 +19,35 @@ export class ContributionResolver { @Ctx() context: Context, ): Promise { const user = getUser(context) - const contribution = await Contribution.findOneOrFail({ id: contributionId }) - if (!user.isAdmin && contribution.userId !== user.id) { - throw new Error('Can not send message to contribution of another user') - } - + const queryRunner = getConnection().createQueryRunner() + await queryRunner.connect() + await queryRunner.startTransaction('READ UNCOMMITTED') const contributionMessage = new ContributionMessage() - contributionMessage.contributionId = contributionId - contributionMessage.createdAt = new Date() - contributionMessage.message = message - contributionMessage.userId = user.id - contributionMessage.type = ContributionMessageType.DIALOG - ContributionMessage.save(contributionMessage) + try { + const contribution = await Contribution.findOneOrFail({ id: contributionId }) + if (contribution.userId !== user.id) { + throw new Error('Can not send message to contribution of another user') + } - if (user.isAdmin && contribution.contributionStatus === ContributionStatus.PENDING) { - contribution.contributionStatus = ContributionStatus.IN_PROGRESS - } else if ( - !user.isAdmin && - contribution.contributionStatus === ContributionStatus.IN_PROGRESS - ) { - contribution.contributionStatus = ContributionStatus.PENDING + contributionMessage.contributionId = contributionId + contributionMessage.createdAt = new Date() + contributionMessage.message = message + contributionMessage.userId = user.id + contributionMessage.type = ContributionMessageType.DIALOG + await queryRunner.manager.insert(ContributionMessage, contributionMessage) + + if (contribution.contributionStatus === ContributionStatus.IN_PROGRESS) { + contribution.contributionStatus = ContributionStatus.PENDING + await queryRunner.manager.update(Contribution, { id: contributionId }, contribution) + } + await queryRunner.commitTransaction() + } catch (e) { + await queryRunner.rollbackTransaction() + logger.error(`ContributionMessage was not successful: ${e}`) + throw new Error(`Transaction was not successful: ${e}`) + } finally { + await queryRunner.release() } - Contribution.save(contribution) - return contributionMessage } } From bca2f49483115f062076abb84e9f0a018de58f51 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 12:17:11 +0200 Subject: [PATCH 06/17] Add admin right to create contribution message. --- backend/src/auth/RIGHTS.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index c38315de4..a62a09bee 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -51,4 +51,5 @@ export enum RIGHTS { CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', + ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE', } From 710d47b594c6158b81f631e095fa9659a7a3de82 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 12:21:38 +0200 Subject: [PATCH 07/17] Add adminCreateContributionMessage. --- backend/src/graphql/resolver/AdminResolver.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index e70fe71ee..01d70cd3c 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -62,6 +62,9 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS, } from './const/const' +import { ContributionMessage } from '@entity/ContributionMessage' +import ContributionMessageArgs from '../arg/ContributionMessageArgs' +import { ContributionMessageType } from '../enum/MessageType' // const EMAIL_OPT_IN_REGISTER = 1 // const EMAIL_OPT_UNKNOWN = 3 // elopage? @@ -696,4 +699,44 @@ export class AdminResolver { logger.debug(`updateContributionLink successful!`) return new ContributionLink(dbContributionLink) } + + @Authorized([RIGHTS.ADMIN_CREATE_CONTRIBUTION_MESSAGE]) + @Mutation(() => ContributionMessage) + async adminCreateContributionMessage( + @Args() { contributionId, message }: ContributionMessageArgs, + @Ctx() context: Context, + ): Promise { + const user = getUser(context) + const queryRunner = getConnection().createQueryRunner() + await queryRunner.connect() + await queryRunner.startTransaction('READ UNCOMMITTED') + const contributionMessage = new ContributionMessage() + try { + const contribution = await Contribution.findOneOrFail({ id: contributionId }) + + contributionMessage.contributionId = contributionId + contributionMessage.createdAt = new Date() + contributionMessage.message = message + contributionMessage.userId = user.id + contributionMessage.type = ContributionMessageType.DIALOG + await queryRunner.manager.insert(ContributionMessage, contributionMessage) + + if ( + contribution.contributionStatus === ContributionStatus.DELETED || + contribution.contributionStatus === ContributionStatus.DENIED || + contribution.contributionStatus === ContributionStatus.PENDING + ) { + contribution.contributionStatus = ContributionStatus.IN_PROGRESS + await queryRunner.manager.update(Contribution, { id: contributionId }, contribution) + } + await queryRunner.commitTransaction() + } catch (e) { + await queryRunner.rollbackTransaction() + logger.error(`ContributionMessage was not successful: ${e}`) + throw new Error(`Transaction was not successful: ${e}`) + } finally { + await queryRunner.release() + } + return contributionMessage + } } From 5ca422c6d3aaa1ce30cacfe3b4055627fc339bb4 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 12:27:06 +0200 Subject: [PATCH 08/17] Change import for enum and arg. --- backend/src/graphql/resolver/AdminResolver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 01d70cd3c..48acada1f 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -63,8 +63,8 @@ import { MEMO_MIN_CHARS, } from './const/const' import { ContributionMessage } from '@entity/ContributionMessage' -import ContributionMessageArgs from '../arg/ContributionMessageArgs' -import { ContributionMessageType } from '../enum/MessageType' +import ContributionMessageArgs from '@arg/ContributionMessageArgs' +import { ContributionMessageType } from '@enum/MessageType' // const EMAIL_OPT_IN_REGISTER = 1 // const EMAIL_OPT_UNKNOWN = 3 // elopage? From 27fd42f097e39597b6efdf95ca7e9f392b115aec Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 22 Aug 2022 12:27:46 +0200 Subject: [PATCH 09/17] Change import for enum. --- backend/src/graphql/resolver/ContributionMessageResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index ea80dd7d4..158b3fafb 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -6,7 +6,7 @@ import { Args, Authorized, Ctx, Mutation, Resolver } from 'type-graphql' import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { Contribution } from '@entity/Contribution' import { ContributionMessageType } from '@enum/MessageType' -import { ContributionStatus } from '../enum/ContributionStatus' +import { ContributionStatus } from '@enum/ContributionStatus' import { getConnection } from '@dbTools/typeorm' @Resolver() From e70a18c6bb42bc4b022b26616e46a6d309957ba4 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Aug 2022 11:09:41 +0200 Subject: [PATCH 10/17] Change thrown error message. --- backend/src/graphql/resolver/AdminResolver.ts | 2 +- backend/src/graphql/resolver/ContributionMessageResolver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 48acada1f..68d3d4a8d 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -733,7 +733,7 @@ export class AdminResolver { } catch (e) { await queryRunner.rollbackTransaction() logger.error(`ContributionMessage was not successful: ${e}`) - throw new Error(`Transaction was not successful: ${e}`) + throw new Error(`ContributionMessage was not successful: ${e}`) } finally { await queryRunner.release() } diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index 158b3fafb..a9529dfe7 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -44,7 +44,7 @@ export class ContributionResolver { } catch (e) { await queryRunner.rollbackTransaction() logger.error(`ContributionMessage was not successful: ${e}`) - throw new Error(`Transaction was not successful: ${e}`) + throw new Error(`ContributionMessage was not successful: ${e}`) } finally { await queryRunner.release() } From 1c433e2d57269ce9decdddf6f26c728f71413888 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Aug 2022 11:53:19 +0200 Subject: [PATCH 11/17] Add graphql object that will be returned instead of dbEntity. --- .../src/graphql/model/ContributionMessage.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 backend/src/graphql/model/ContributionMessage.ts diff --git a/backend/src/graphql/model/ContributionMessage.ts b/backend/src/graphql/model/ContributionMessage.ts new file mode 100644 index 000000000..caf5eddc4 --- /dev/null +++ b/backend/src/graphql/model/ContributionMessage.ts @@ -0,0 +1,37 @@ +import { Field, ObjectType } from 'type-graphql' +import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' +import { User } from './User' + +@ObjectType() +export class ContributionMessage { + constructor(contributionMessage: DbContributionMessage, user: User) { + this.id = contributionMessage.id + this.message = contributionMessage.message + this.createdAt = contributionMessage.createdAt + this.updatedAt = contributionMessage.updatedAt + this.type = contributionMessage.type + this.userFirstName = user.firstName + this.userLastName = user.lastName + } + + @Field(() => Number) + id: number + + @Field(() => String) + message: string + + @Field(() => Date) + createdAt: Date + + @Field(() => Date, { nullable: true }) + updatedAt?: Date | null + + @Field(() => String) + type: string + + @Field(() => String, { nullable: true }) + userFirstName: string | null + + @Field(() => String, { nullable: true }) + userLastName: string | null +} From 2c459a8fae7e4ee0e7acf98ac641a6bac72b2010 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Aug 2022 11:55:34 +0200 Subject: [PATCH 12/17] Changed the Contribution.find so that we can throw a specific error, added an GraphQL Model as return value instead of DbEntity. --- backend/src/graphql/resolver/AdminResolver.ts | 15 +++++++++------ .../resolver/ContributionMessageResolver.ts | 16 ++++++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 68d3d4a8d..9a5609b75 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -62,9 +62,10 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS, } from './const/const' -import { ContributionMessage } from '@entity/ContributionMessage' +import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { ContributionMessageType } from '@enum/MessageType' +import { ContributionMessage } from '@model/ContributionMessage' // const EMAIL_OPT_IN_REGISTER = 1 // const EMAIL_OPT_UNKNOWN = 3 // elopage? @@ -710,16 +711,18 @@ export class AdminResolver { const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') - const contributionMessage = new ContributionMessage() + const contributionMessage = DbContributionMessage.create() try { - const contribution = await Contribution.findOneOrFail({ id: contributionId }) - + const contribution = await Contribution.findOne({ id: contributionId }) + if (!contribution) { + throw new Error('Contribution not found') + } contributionMessage.contributionId = contributionId contributionMessage.createdAt = new Date() contributionMessage.message = message contributionMessage.userId = user.id contributionMessage.type = ContributionMessageType.DIALOG - await queryRunner.manager.insert(ContributionMessage, contributionMessage) + await queryRunner.manager.insert(DbContributionMessage, contributionMessage) if ( contribution.contributionStatus === ContributionStatus.DELETED || @@ -737,6 +740,6 @@ export class AdminResolver { } finally { await queryRunner.release() } - return contributionMessage + return new ContributionMessage(contributionMessage, new User(user)) } } diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index a9529dfe7..dbffc77ce 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -1,17 +1,18 @@ import { backendLogger as logger } from '@/server/logger' import { RIGHTS } from '@/auth/RIGHTS' import { Context, getUser } from '@/server/context' -import { ContributionMessage } from '@entity/ContributionMessage' +import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' import { Args, Authorized, Ctx, Mutation, Resolver } from 'type-graphql' import ContributionMessageArgs from '@arg/ContributionMessageArgs' import { Contribution } from '@entity/Contribution' import { ContributionMessageType } from '@enum/MessageType' import { ContributionStatus } from '@enum/ContributionStatus' import { getConnection } from '@dbTools/typeorm' +import { ContributionMessage } from '@model/ContributionMessage' +import { User } from '@model/User' @Resolver() export class ContributionResolver { - // TODO: Have two method one for admin on for @Authorized([RIGHTS.CREATE_CONTRIBUTION_MESSAGE]) @Mutation(() => ContributionMessage) async createContributionMessage( @@ -22,9 +23,12 @@ export class ContributionResolver { const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') - const contributionMessage = new ContributionMessage() + const contributionMessage = DbContributionMessage.create() try { - const contribution = await Contribution.findOneOrFail({ id: contributionId }) + const contribution = await Contribution.findOne({ id: contributionId }) + if (!contribution) { + throw new Error('Contribution not found') + } if (contribution.userId !== user.id) { throw new Error('Can not send message to contribution of another user') } @@ -34,7 +38,7 @@ export class ContributionResolver { contributionMessage.message = message contributionMessage.userId = user.id contributionMessage.type = ContributionMessageType.DIALOG - await queryRunner.manager.insert(ContributionMessage, contributionMessage) + await queryRunner.manager.insert(DbContributionMessage, contributionMessage) if (contribution.contributionStatus === ContributionStatus.IN_PROGRESS) { contribution.contributionStatus = ContributionStatus.PENDING @@ -48,6 +52,6 @@ export class ContributionResolver { } finally { await queryRunner.release() } - return contributionMessage + return new ContributionMessage(contributionMessage, new User(user)) } } From e3e4b61c57176c724a63c2e32d274c1f82674721 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Aug 2022 11:59:24 +0200 Subject: [PATCH 13/17] Rename export of ContributionArgs to ContributionMessageArgs. --- backend/src/graphql/arg/ContributionMessageArgs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/arg/ContributionMessageArgs.ts b/backend/src/graphql/arg/ContributionMessageArgs.ts index 963824350..dd75baed0 100644 --- a/backend/src/graphql/arg/ContributionMessageArgs.ts +++ b/backend/src/graphql/arg/ContributionMessageArgs.ts @@ -2,7 +2,7 @@ import { ArgsType, Field, InputType } from 'type-graphql' @InputType() @ArgsType() -export default class ContributionArgs { +export default class ContributionMessageArgs { @Field(() => Number) contributionId: number From 41fb0d2a9f5f0b50cc7096eaf8be917b206ea442 Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Aug 2022 13:46:55 +0200 Subject: [PATCH 14/17] Change export name of ContributionMessageResolver class. --- backend/src/graphql/resolver/ContributionMessageResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index dbffc77ce..7c4779e63 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -12,7 +12,7 @@ import { ContributionMessage } from '@model/ContributionMessage' import { User } from '@model/User' @Resolver() -export class ContributionResolver { +export class ContributionMessageResolver { @Authorized([RIGHTS.CREATE_CONTRIBUTION_MESSAGE]) @Mutation(() => ContributionMessage) async createContributionMessage( From 0271a4274121fd7f137091604fd73d401888ded8 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 24 Aug 2022 10:56:19 +0200 Subject: [PATCH 15/17] Use user entity instead of user model. --- backend/src/graphql/model/ContributionMessage.ts | 2 +- backend/src/graphql/resolver/AdminResolver.ts | 2 +- .../src/graphql/resolver/ContributionMessageResolver.ts | 3 +-- backend/src/graphql/resolver/ContributionResolver.ts | 7 +++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/src/graphql/model/ContributionMessage.ts b/backend/src/graphql/model/ContributionMessage.ts index caf5eddc4..98b6b2721 100644 --- a/backend/src/graphql/model/ContributionMessage.ts +++ b/backend/src/graphql/model/ContributionMessage.ts @@ -1,6 +1,6 @@ import { Field, ObjectType } from 'type-graphql' import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage' -import { User } from './User' +import { User } from '@entity/User' @ObjectType() export class ContributionMessage { diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 9a5609b75..63da1baed 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -740,6 +740,6 @@ export class AdminResolver { } finally { await queryRunner.release() } - return new ContributionMessage(contributionMessage, new User(user)) + return new ContributionMessage(contributionMessage, user) } } diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index 7c4779e63..c73301598 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -9,7 +9,6 @@ import { ContributionMessageType } from '@enum/MessageType' import { ContributionStatus } from '@enum/ContributionStatus' import { getConnection } from '@dbTools/typeorm' import { ContributionMessage } from '@model/ContributionMessage' -import { User } from '@model/User' @Resolver() export class ContributionMessageResolver { @@ -52,6 +51,6 @@ export class ContributionMessageResolver { } finally { await queryRunner.release() } - return new ContributionMessage(contributionMessage, new User(user)) + return new ContributionMessage(contributionMessage, user) } } diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 8056ffde3..a59ba0a86 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -96,13 +96,14 @@ export class ContributionResolver { order: { createdAt: order, }, + relations: ['messages'], withDeleted: true, skip: (currentPage - 1) * pageSize, take: pageSize, }) return new ContributionListResult( count, - contributions.map((contribution) => new Contribution(contribution, new User(user))), + contributions.map((contribution) => new Contribution(contribution, user)), ) } @@ -123,9 +124,7 @@ export class ContributionResolver { .getManyAndCount() return new ContributionListResult( count, - dbContributions.map( - (contribution) => new Contribution(contribution, new User(contribution.user)), - ), + dbContributions.map((contribution) => new Contribution(contribution, contribution.user)), ) } From bda04f87d26886e67bd91c937a4510bbe09def64 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 24 Aug 2022 10:57:03 +0200 Subject: [PATCH 16/17] Add messages and state to the contribution model. --- backend/src/graphql/model/Contribution.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/model/Contribution.ts b/backend/src/graphql/model/Contribution.ts index aa878990c..741debbbb 100644 --- a/backend/src/graphql/model/Contribution.ts +++ b/backend/src/graphql/model/Contribution.ts @@ -1,7 +1,8 @@ import { ObjectType, Field, Int } from 'type-graphql' import Decimal from 'decimal.js-light' import { Contribution as dbContribution } from '@entity/Contribution' -import { User } from './User' +import { User } from '@entity/User' +import { ContributionMessage } from './ContributionMessage' @ObjectType() export class Contribution { @@ -16,6 +17,10 @@ export class Contribution { this.confirmedAt = contribution.confirmedAt this.confirmedBy = contribution.confirmedBy this.contributionDate = contribution.contributionDate + this.state = contribution.contributionStatus + this.messages = contribution.messages + ? contribution.messages.map((message) => new ContributionMessage(message, user)) + : [] } @Field(() => Number) @@ -47,6 +52,12 @@ export class Contribution { @Field(() => Date) contributionDate: Date + + @Field(() => [ContributionMessage]) + messages: ContributionMessage[] + + @Field(() => String) + state: string } @ObjectType() From dd2022df25c10a1acbdacdc6ff508f97336d9981 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 24 Aug 2022 10:57:52 +0200 Subject: [PATCH 17/17] Add new values to query for contributions in frontend. --- frontend/src/graphql/queries.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index 03299dd49..f701ad8cf 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -206,6 +206,16 @@ export const listContributions = gql` confirmedAt confirmedBy deletedAt + state + messages { + id + message + createdAt + updatedAt + type + userFirstName + userLastName + } } } }