gradido/backend/src/interactions/updateUnconfirmedContribution/UnconfirmedContributionAdminAddMessage.role.ts
2023-11-30 18:43:50 +01:00

76 lines
2.9 KiB
TypeScript

import { Contribution } from '@entity/Contribution'
import { User } from '@entity/User'
import { RIGHTS } from '@/auth/RIGHTS'
import { Role } from '@/auth/Role'
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 for Moderators and Admins which want to comment a contribution
* Admins and Moderators are currently not allowed to comment her own contributions with the admin/moderator role
*/
export class UnconfirmedContributionAdminAddMessageRole extends AbstractUnconfirmedContributionRole {
public constructor(contribution: Contribution, private updateData: ContributionMessageArgs) {
super(contribution, contribution.amount, contribution.contributionDate)
logger.debug('use UnconfirmedContributionAdminAddMessageRole')
}
protected update(): void {
let newStatus = this.self.contributionStatus
// change status (does not apply to moderator messages)
if (this.updateData.messageType !== ContributionMessageType.MODERATOR) {
newStatus = ContributionStatus.IN_PROGRESS
}
const resubmissionDate: Date | null = this.updateData.resubmissionAt
? new Date(this.updateData.resubmissionAt)
: null
if (
this.self.contributionStatus !== newStatus ||
this.self.resubmissionAt !== resubmissionDate
) {
this.self.contributionStatus = newStatus
this.self.resubmissionAt = resubmissionDate
} else {
this.changed = false
}
}
protected checkAuthorization(user: User, role: Role): AbstractUnconfirmedContributionRole {
if (!role.hasRight(RIGHTS.ADMIN_CREATE_CONTRIBUTION_MESSAGE)) {
throw new LogError('missing right ADMIN_CREATE_CONTRIBUTION_MESSAGE for user', user.id)
}
// TODO: think if there are cases in which admin comment his own contribution
if (
this.self.userId === user.id &&
this.updateData.messageType === ContributionMessageType.MODERATOR
) {
throw new LogError(
'Moderator|Admin can not make a moderator comment on his own contribution',
this.self.id,
)
}
return this
}
protected async validate(clientTimezoneOffset: number): Promise<void> {
await super.validate(clientTimezoneOffset)
}
public createContributionMessage(): ContributionMessageBuilder | undefined {
const builder = super.createContributionMessage()
if (builder) {
return builder
.setIsModerator(true)
.setMessageAndType(this.updateData.message, this.updateData.messageType)
}
}
}