Revert "do not allow user to edit admin contributions"

This reverts commit 43e2f5fbc839921b5b0fe3deadc85c15baeb104f.
This commit is contained in:
Moriz Wahl 2023-03-30 18:25:47 +02:00
parent 769e36bea5
commit 6dff07a7ba
20 changed files with 52 additions and 97 deletions

View File

@ -9,6 +9,7 @@ import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
import { GdtResolver } from './GdtResolver'
import { getLastTransaction } from './util/getLastTransaction'
import { TransactionLinkRepository } from '@repository/TransactionLink'
import { Balance } from '@model/Balance'
import { backendLogger as logger } from '@/server/logger'

View File

@ -6,8 +6,8 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Community as DbCommunity } from '@entity/Community'
import { testEnvironment } from '@test/helpers'
import { getCommunities } from '@/seeds/graphql/queries'
import { testEnvironment } from '@test/helpers'
let query: any

View File

@ -9,7 +9,6 @@ import { GraphQLError } from 'graphql'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
import { logger } from '@test/testSetup'
import { cleanDB, testEnvironment, resetToken } from '@test/helpers'
import {
login,
createContributionLink,
@ -17,6 +16,7 @@ import {
updateContributionLink,
} from '@/seeds/graphql/mutations'
import { listContributionLinks } from '@/seeds/graphql/queries'
import { cleanDB, testEnvironment, resetToken } from '@test/helpers'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { userFactory } from '@/seeds/factory/user'

View File

@ -3,20 +3,20 @@ import { Resolver, Args, Arg, Authorized, Mutation, Query, Int, Ctx } from 'type
import { MoreThan, IsNull } from '@dbTools/typeorm'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver'
import { isStartEndDateValid } from './util/creations'
import {
CONTRIBUTIONLINK_NAME_MAX_CHARS,
CONTRIBUTIONLINK_NAME_MIN_CHARS,
MEMO_MAX_CHARS,
MEMO_MIN_CHARS,
} from './const/const'
import { isStartEndDateValid } from './util/creations'
import { transactionLinkCode as contributionLinkCode } from './TransactionLinkResolver'
import { ContributionLinkList } from '@model/ContributionLinkList'
import { ContributionLink } from '@model/ContributionLink'
import ContributionLinkArgs from '@arg/ContributionLinkArgs'
import { RIGHTS } from '@/auth/RIGHTS'
import { Order } from '@enum/Order'
import Paginated from '@arg/Paginated'
import { RIGHTS } from '@/auth/RIGHTS'
// TODO: this is a strange construct
import LogError from '@/server/LogError'

View File

@ -13,18 +13,6 @@ import { Transaction as DbTransaction } from '@entity/Transaction'
import { User } from '@entity/User'
import { UserInputError } from 'apollo-server-express'
import { Event as DbEvent } from '@entity/Event'
import {
cleanDB,
resetToken,
testEnvironment,
contributionDateFormatter,
resetEntity,
} from '@test/helpers'
import { logger, i18n as localization } from '@test/testSetup'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { ContributionListResult } from '@model/Contribution'
import { ContributionStatus } from '@enum/ContributionStatus'
import { Order } from '@enum/Order'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { bobBaumeister } from '@/seeds/users/bob-baumeister'
import { stephenHawking } from '@/seeds/users/stephen-hawking'
@ -52,12 +40,24 @@ import {
sendContributionDeletedEmail,
sendContributionDeniedEmail,
} from '@/emails/sendEmailVariants'
import {
cleanDB,
resetToken,
testEnvironment,
contributionDateFormatter,
resetEntity,
} from '@test/helpers'
import { userFactory } from '@/seeds/factory/user'
import { creationFactory } from '@/seeds/factory/creation'
import { creations } from '@/seeds/creation/index'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { EventType } from '@/event/Event'
import { logger, i18n as localization } from '@test/testSetup'
import { raeuberHotzenplotz } from '@/seeds/users/raeuber-hotzenplotz'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { ContributionListResult } from '@model/Contribution'
import { ContributionStatus } from '@enum/ContributionStatus'
import { Order } from '@enum/Order'
jest.mock('@/emails/sendEmailVariants')
@ -2040,50 +2040,6 @@ describe('ContributionResolver', () => {
}),
)
})
describe('user tries to update admin contribution', () => {
beforeAll(async () => {
await mutate({
mutation: login,
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
})
})
afterAll(async () => {
await mutate({
mutation: login,
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
})
})
it('logs and throws "Cannot update contribution of moderator" error', async () => {
jest.clearAllMocks()
const adminContribution = await Contribution.findOne({
where: {
moderatorId: admin.id,
userId: bibi.id,
},
})
await expect(
mutate({
mutation: updateContribution,
variables: {
contributionId: (adminContribution && adminContribution.id) || -1,
amount: 100.0,
memo: 'Test Test Test',
creationDate: new Date().toString(),
},
}),
).resolves.toMatchObject({
errors: [new GraphQLError('Cannot update contribution of moderator')],
})
expect(logger.error).toBeCalledWith(
'Cannot update contribution of moderator',
expect.any(Object),
bibi.id,
)
})
})
})
describe('second creation surpasses the available amount ', () => {

View File

@ -9,6 +9,9 @@ import { UserContact } from '@entity/UserContact'
import { User as DbUser } from '@entity/User'
import { Transaction as DbTransaction } from '@entity/Transaction'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
import { getLastTransaction } from './util/getLastTransaction'
import { findContributions } from './util/findContributions'
import {
getUserCreation,
validateContribution,
@ -16,9 +19,6 @@ import {
isValidDateString,
getOpenCreations,
} from './util/creations'
import { findContributions } from './util/findContributions'
import { getLastTransaction } from './util/getLastTransaction'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
import { AdminUpdateContribution } from '@model/AdminUpdateContribution'
import { Contribution, ContributionListResult } from '@model/Contribution'
import { Decay } from '@model/Decay'
@ -201,9 +201,6 @@ export class ContributionResolver {
user.id,
)
}
if (contributionToUpdate.moderatorId) {
throw new LogError('Cannot update contribution of moderator', contributionToUpdate, user.id)
}
if (
contributionToUpdate.contributionStatus !== ContributionStatus.IN_PROGRESS &&
contributionToUpdate.contributionStatus !== ContributionStatus.PENDING

View File

@ -14,11 +14,9 @@ import { Transaction } from '@entity/Transaction'
import { Event as DbEvent } from '@entity/Event'
import { UserContact } from '@entity/UserContact'
import { transactionLinkCode } from './TransactionLinkResolver'
import { cleanDB, testEnvironment, resetToken, resetEntity } from '@test/helpers'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { logger } from '@test/testSetup'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { cleanDB, testEnvironment, resetToken, resetEntity } from '@test/helpers'
import { creationFactory } from '@/seeds/factory/creation'
import { creations } from '@/seeds/creation/index'
import { userFactory } from '@/seeds/factory/user'
@ -35,7 +33,9 @@ import {
confirmContribution,
} from '@/seeds/graphql/mutations'
import { listTransactionLinksAdmin } from '@/seeds/graphql/queries'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
import { logger } from '@test/testSetup'
import { EventType } from '@/event/Event'
// mock semaphore to allow use fake timers

View File

@ -10,10 +10,10 @@ import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query, Int } from 'type-graphql'
import transactionLinkList from './util/transactionLinkList'
import { getLastTransaction } from './util/getLastTransaction'
import { executeTransaction } from './TransactionResolver'
import { getUserCreation, validateContribution } from './util/creations'
import { executeTransaction } from './TransactionResolver'
import { getLastTransaction } from './util/getLastTransaction'
import transactionLinkList from './util/transactionLinkList'
import { User } from '@model/User'
import { ContributionLink } from '@model/ContributionLink'
import { Decay } from '@model/Decay'
@ -25,12 +25,12 @@ import { ContributionCycleType } from '@enum/ContributionCycleType'
import TransactionLinkArgs from '@arg/TransactionLinkArgs'
import Paginated from '@arg/Paginated'
import TransactionLinkFilters from '@arg/TransactionLinkFilters'
import QueryLinkResult from '@union/QueryLinkResult'
import { backendLogger as logger } from '@/server/logger'
import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
import { calculateBalance } from '@/util/validate'
import { RIGHTS } from '@/auth/RIGHTS'
import { calculateDecay } from '@/util/decay'
import QueryLinkResult from '@union/QueryLinkResult'
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
import LogError from '@/server/LogError'
import {

View File

@ -11,8 +11,6 @@ import { User } from '@entity/User'
import { GraphQLError } from 'graphql'
import { Event as DbEvent } from '@entity/Event'
import { findUserByEmail } from './UserResolver'
import { cleanDB, testEnvironment } from '@test/helpers'
import { logger } from '@test/testSetup'
import { EventType } from '@/event/Event'
import { userFactory } from '@/seeds/factory/user'
import {
@ -25,6 +23,8 @@ import { bobBaumeister } from '@/seeds/users/bob-baumeister'
import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { stephenHawking } from '@/seeds/users/stephen-hawking'
import { cleanDB, testEnvironment } from '@test/helpers'
import { logger } from '@test/testSetup'
let mutate: any, query: any, con: any
let testEnv: any

View File

@ -9,10 +9,10 @@ import { getCustomRepository, getConnection, In } from '@dbTools/typeorm'
import { User as dbUser } from '@entity/User'
import { Transaction as dbTransaction } from '@entity/Transaction'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
import { getLastTransaction } from './util/getLastTransaction'
import { findUserByEmail } from './UserResolver'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
import { BalanceResolver } from './BalanceResolver'
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
import { findUserByEmail } from './UserResolver'
import { getLastTransaction } from './util/getLastTransaction'
import { TransactionRepository } from '@repository/Transaction'
import { TransactionLinkRepository } from '@repository/TransactionLink'
@ -21,9 +21,9 @@ import { Transaction } from '@model/Transaction'
import { TransactionList } from '@model/TransactionList'
import { Order } from '@enum/Order'
import { TransactionTypeId } from '@enum/TransactionTypeId'
import { calculateBalance } from '@/util/validate'
import TransactionSendArgs from '@arg/TransactionSendArgs'
import Paginated from '@arg/Paginated'
import { calculateBalance } from '@/util/validate'
import { backendLogger as logger } from '@/server/logger'
import { Context, getUser } from '@/server/context'

View File

@ -15,10 +15,9 @@ import { Event as DbEvent } from '@entity/Event'
import { OptInType } from '@enum/OptInType'
import { UserContactType } from '@enum/UserContactType'
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
import { objectValuesToArray } from '@/util/utilities'
import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers'
import { logger, i18n as localization } from '@test/testSetup'
import { ContributionLink } from '@model/ContributionLink'
import { objectValuesToArray } from '@/util/utilities'
import { printTimeDuration } from '@/util/time'
import { userFactory } from '@/seeds/factory/user'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
@ -45,6 +44,7 @@ import {
} from '@/emails/sendEmailVariants'
import { contributionLinkFactory } from '@/seeds/factory/contributionLink'
import { transactionLinkFactory } from '@/seeds/factory/transactionLink'
import { ContributionLink } from '@model/ContributionLink'
import { EventType } from '@/event/Event'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { bobBaumeister } from '@/seeds/users/bob-baumeister'

View File

@ -21,8 +21,8 @@ import { User as DbUser } from '@entity/User'
import { UserContact as DbUserContact } from '@entity/UserContact'
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { FULL_CREATION_AVAILABLE } from './const/const'
import { getUserCreations } from './util/creations'
import { FULL_CREATION_AVAILABLE } from './const/const'
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
import { UserRepository } from '@repository/User'
@ -33,18 +33,19 @@ import { OptInType } from '@enum/OptInType'
import { Order } from '@enum/Order'
import { UserContactType } from '@enum/UserContactType'
import CreateUserArgs from '@arg/CreateUserArgs'
import UnsecureLoginArgs from '@arg/UnsecureLoginArgs'
import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs'
import Paginated from '@arg/Paginated'
import SearchUsersArgs from '@arg/SearchUsersArgs'
import { getTimeDurationObject, printTimeDuration } from '@/util/time'
import {
sendAccountActivationEmail,
sendAccountMultiRegistrationEmail,
sendResetPasswordEmail,
} from '@/emails/sendEmailVariants'
import { getTimeDurationObject, printTimeDuration } from '@/util/time'
import CreateUserArgs from '@arg/CreateUserArgs'
import UnsecureLoginArgs from '@arg/UnsecureLoginArgs'
import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs'
import Paginated from '@arg/Paginated'
import SearchUsersArgs from '@arg/SearchUsersArgs'
import { backendLogger as logger } from '@/server/logger'
import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
import CONFIG from '@/config'

View File

@ -5,12 +5,12 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Decimal } from 'decimal.js-light'
import { cleanDB, testEnvironment, contributionDateFormatter } from '@test/helpers'
import { userFactory } from '@/seeds/factory/user'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { bobBaumeister } from '@/seeds/users/bob-baumeister'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { creationFactory, nMonthsBefore } from '@/seeds/factory/creation'
import { cleanDB, testEnvironment, contributionDateFormatter } from '@test/helpers'
import {
confirmContribution,
createContribution,

View File

@ -3,9 +3,9 @@
import { getConnection } from '@dbTools/typeorm'
import { Contribution } from '@entity/Contribution'
import { Decimal } from 'decimal.js-light'
import { OpenCreation } from '@model/OpenCreation'
import { FULL_CREATION_AVAILABLE, MAX_CREATION_AMOUNT } from '@/graphql/resolver/const/const'
import { backendLogger as logger } from '@/server/logger'
import { OpenCreation } from '@model/OpenCreation'
import LogError from '@/server/LogError'
interface CreationMap {

View File

@ -3,8 +3,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import { MiddlewareFn } from 'type-graphql'
import { KlickTipp } from '@model/KlickTipp'
import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController'
import { KlickTipp } from '@model/KlickTipp'
import CONFIG from '@/config'
import { klickTippLogger as logger } from '@/server/logger'

View File

@ -2,10 +2,10 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { User } from '@entity/User'
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
import CONFIG from '@/config'
import LogError from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
const sodium = require('sodium-native')

View File

@ -2,8 +2,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
import { ApolloServerTestClient } from 'apollo-server-testing'
import { ContributionLink } from '@model/ContributionLink'
import { login, createContributionLink } from '@/seeds/graphql/mutations'
import { ContributionLink } from '@model/ContributionLink'
import { ContributionLinkInterface } from '@/seeds/contributionLink/ContributionLinkInterface'
export const contributionLinkFactory = async (

View File

@ -3,9 +3,9 @@
import { SaveOptions, RemoveOptions } from '@dbTools/typeorm'
import { User as dbUser } from '@entity/User'
import { UserContact } from '@entity/UserContact'
import { User } from '@model/User'
import { PasswordEncryptionType } from '@/graphql/enum/PasswordEncryptionType'
// import { UserContact as EmailContact } from '@entity/UserContact'
import { User } from '@model/User'
const communityDbUser: dbUser = {
id: -1,

View File

@ -1,6 +1,6 @@
import { Decimal } from 'decimal.js-light'
import { Decay } from '@model/Decay'
import CONFIG from '@/config'
import { Decay } from '@model/Decay'
import LogError from '@/server/LogError'
// TODO: externalize all those definitions and functions into an external decay library

View File

@ -2,9 +2,9 @@ import { Decimal } from 'decimal.js-light'
import { getCustomRepository } from '@dbTools/typeorm'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
import { calculateDecay } from './decay'
import { getLastTransaction } from '@/graphql/resolver/util/getLastTransaction'
import { TransactionLinkRepository } from '@repository/TransactionLink'
import { Decay } from '@model/Decay'
import { getLastTransaction } from '@/graphql/resolver/util/getLastTransaction'
function isStringBoolean(value: string): boolean {
const lowerValue = value.toLowerCase()