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 } }