gradido/backend/src/interactions/updateUnconfirmedContribution/UnconfirmedContributionUserAddMessage.role.ts

64 lines
2.6 KiB
TypeScript

import { Contribution } from '@entity/Contribution'
import { User } from '@entity/User'
import { ContributionMessageBuilder } from '@/data/ContributionMessage.builder'
import { ContributionMessageArgs } from '@/graphql/arg/ContributionMessageArgs'
import { ContributionMessageType } from '@/graphql/enum/ContributionMessageType'
import { ContributionStatus } from '@/graphql/enum/ContributionStatus'
import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
import { AbstractUnconfirmedContributionRole } from './AbstractUnconfirmedContribution.role'
/**
* This role will be used if a User comment his contribution, for example as answer to a moderator question
* independent from there role, because the own contribution can only be commented in user role
*/
export class UnconfirmedContributionUserAddMessageRole extends AbstractUnconfirmedContributionRole {
public constructor(contribution: Contribution, private updateData: ContributionMessageArgs) {
super(contribution, contribution.amount, contribution.contributionDate)
logger.debug('use UnconfirmedContributionUserAddMessageRole')
}
protected update(): void {
if (
(this.self.contributionStatus as ContributionStatus) === ContributionStatus.IN_PROGRESS ||
this.self.resubmissionAt !== null
) {
this.self.contributionStatus = ContributionStatus.PENDING
this.self.resubmissionAt = null
} else {
this.changed = false
}
}
protected checkAuthorization(user: User): AbstractUnconfirmedContributionRole {
if (this.self.userId !== user.id) {
throw new LogError('Can not update contribution of another user', this.self, user.id)
}
// only admins and moderators can update it when status is other than progress or pending
// but we are in the user add message role.. we are currently not admin or moderator
const contributionStatus = this.self.contributionStatus as ContributionStatus
if (
contributionStatus !== ContributionStatus.IN_PROGRESS &&
contributionStatus !== ContributionStatus.PENDING
) {
throw new LogError(
'Contribution can not be updated due to status',
this.self.contributionStatus,
)
}
if (this.updateData.messageType !== ContributionMessageType.DIALOG) {
throw new LogError('unexpected contribution message type, only dialog is allowed for user')
}
return this
}
public createContributionMessage(): ContributionMessageBuilder | undefined {
const builder = super.createContributionMessage()
if (builder) {
return builder.setIsModerator(false).setDialogType(this.updateData.message)
}
}
}