+
@@ -104,7 +104,6 @@
:contributionId="row.item.id"
:contributionState="row.item.state"
@update-state="updateState"
- @update-user-data="updateUserData"
/>
@@ -146,22 +145,9 @@ export default {
required: true,
},
},
- data() {
- return {
- creationUserData: {
- amount: null,
- date: null,
- memo: null,
- moderator: null,
- },
- }
- },
methods: {
myself(item) {
- return (
- `${item.firstName} ${item.lastName}` ===
- `${this.$store.state.moderator.firstName} ${this.$store.state.moderator.lastName}`
- )
+ return item.userId === this.$store.state.moderator.id
},
getStatusIcon(status) {
return iconMap[status] ? iconMap[status] : 'default-icon'
@@ -174,16 +160,6 @@ export default {
if (item.state === 'IN_PROGRESS') return 'table-primary'
if (item.state === 'PENDING') return 'table-primary'
},
- updateCreationData(data) {
- const row = data.row
- this.$emit('update-contributions', data)
- delete data.row
- this.creationUserData = { ...this.creationUserData, ...data }
- row.toggleDetails()
- },
- updateUserData(rowItem, newCreation) {
- rowItem.creation = newCreation
- },
updateState(id) {
this.$emit('update-state', id)
},
diff --git a/admin/src/graphql/adminListContributions.js b/admin/src/graphql/adminListContributions.js
index 9d63bf6a9..97a11c61a 100644
--- a/admin/src/graphql/adminListContributions.js
+++ b/admin/src/graphql/adminListContributions.js
@@ -32,6 +32,8 @@ export const adminListContributions = gql`
deniedBy
deletedAt
deletedBy
+ moderatorId
+ userId
}
}
}
diff --git a/admin/src/graphql/adminOpenCreations.js b/admin/src/graphql/adminOpenCreations.js
new file mode 100644
index 000000000..0e766c0f7
--- /dev/null
+++ b/admin/src/graphql/adminOpenCreations.js
@@ -0,0 +1,11 @@
+import gql from 'graphql-tag'
+
+export const adminOpenCreations = gql`
+ query ($userId: Int!) {
+ adminOpenCreations(userId: $userId) {
+ year
+ month
+ amount
+ }
+ }
+`
diff --git a/admin/src/graphql/adminUpdateContribution.js b/admin/src/graphql/adminUpdateContribution.js
index b7c834109..c52a0cbc4 100644
--- a/admin/src/graphql/adminUpdateContribution.js
+++ b/admin/src/graphql/adminUpdateContribution.js
@@ -1,18 +1,11 @@
import gql from 'graphql-tag'
export const adminUpdateContribution = gql`
- mutation ($id: Int!, $email: String!, $amount: Decimal!, $memo: String!, $creationDate: String!) {
- adminUpdateContribution(
- id: $id
- email: $email
- amount: $amount
- memo: $memo
- creationDate: $creationDate
- ) {
+ mutation ($id: Int!, $amount: Decimal!, $memo: String!, $creationDate: String!) {
+ adminUpdateContribution(id: $id, amount: $amount, memo: $memo, creationDate: $creationDate) {
amount
date
memo
- creation
}
}
`
diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json
index 0d05eaa88..f98dc90f3 100644
--- a/admin/src/locales/de.json
+++ b/admin/src/locales/de.json
@@ -1,6 +1,7 @@
{
"all_emails": "Alle Nutzer",
"back": "zurück",
+ "change_user_role": "Nutzerrolle ändern",
"chat": "Chat",
"contributionLink": {
"amount": "Betrag",
@@ -114,6 +115,11 @@
"open_creations": "Offene Schöpfungen",
"overlay": {
"cancel": "Abbrechen",
+ "changeUserRole": {
+ "question": "Willst du die Rolle von {username} wirklich zu {newRole} ändern?",
+ "title": "Nutzerrolle ändern",
+ "yes": "Ja, Nutzerrolle ändern"
+ },
"confirm": {
"question": "Willst du diesen Gemeinwohl-Beitrag wirklich bestätigen und gutschreiben?",
"text": "Nach dem Speichern ist der Datensatz nicht mehr änderbar. Bitte überprüfe genau, dass alles stimmt.",
@@ -126,11 +132,21 @@
"title": "Gemeinwohl-Beitrag löschen!",
"yes": "Ja, Beitrag löschen!"
},
+ "deleteUser": {
+ "question": "Willst du {username} wirklich löschen?",
+ "title": "Nutzer löschen",
+ "yes": "Ja, Nutzer löschen"
+ },
"deny": {
"question": "Willst du diesen Gemeinwohl-Beitrag wirklich ablehnen?",
"text": "Nach dem Speichern ist der Datensatz nicht mehr änderbar und kann auch nicht mehr gelöscht werden. Bitte überprüfe genau, dass alles stimmt.",
"title": "Gemeinwohl-Beitrag ablehnen!",
"yes": "Ja, Beitrag ablehnen und speichern!"
+ },
+ "undeleteUser": {
+ "question": "Willst du wirklich {username} wiederherstellen?",
+ "title": "Nutzer wiederherstellen",
+ "yes": "Ja, Nutzer wiederherstellen"
}
},
"redeemed": "eingelöst",
diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json
index f36944a63..358c62a15 100644
--- a/admin/src/locales/en.json
+++ b/admin/src/locales/en.json
@@ -1,6 +1,7 @@
{
"all_emails": "All users",
"back": "back",
+ "change_user_role": "Change user role",
"chat": "Chat",
"contributionLink": {
"amount": "Amount",
@@ -114,6 +115,11 @@
"open_creations": "Open creations",
"overlay": {
"cancel": "Cancel",
+ "changeUserRole": {
+ "question": "Do you really want to change {username}'s role to {newRole}?",
+ "title": "Change user role",
+ "yes": "Yes, change user role"
+ },
"confirm": {
"question": "Do you really want to carry out and finally save this pre-stored creation?",
"text": "After saving, the record can no longer be changed. Please check carefully that everything is correct.",
@@ -126,11 +132,21 @@
"title": "Delete creation!",
"yes": "Yes, delete and save creation!"
},
+ "deleteUser": {
+ "question": "Do you really want to delete {username}?",
+ "title": "Delete user",
+ "yes": "Yes, delete user"
+ },
"deny": {
"question": "Do you really want to carry out and finally save this pre-stored creation?",
"text": "After saving, the record can no longer be changed or deleted. Please check carefully that everything is correct.",
"title": "Reject creation!",
"yes": "Yes, reject and save creation!"
+ },
+ "undeleteUser": {
+ "question": "Do you really want to undelete {username}",
+ "title": "Undelete user",
+ "yes": "Yes,undelete user"
}
},
"redeemed": "redeemed",
diff --git a/admin/src/mixins/creationMonths.js b/admin/src/mixins/creationMonths.js
index c26dc5b02..57e0ab17e 100644
--- a/admin/src/mixins/creationMonths.js
+++ b/admin/src/mixins/creationMonths.js
@@ -1,9 +1,11 @@
+import { adminOpenCreations } from '../graphql/adminOpenCreations'
+
export const creationMonths = {
- props: {
- creation: {
- type: Array,
- default: () => [1000, 1000, 1000],
- },
+ data() {
+ return {
+ creation: [1000, 1000, 1000],
+ userId: 0,
+ }
},
computed: {
creationDates() {
@@ -38,4 +40,23 @@ export const creationMonths = {
return this.creationDates.map((date) => this.$d(date, 'monthShort')).join(' | ')
},
},
+ apollo: {
+ OpenCreations: {
+ query() {
+ return adminOpenCreations
+ },
+ variables() {
+ return {
+ userId: this.userId,
+ }
+ },
+ fetchPolicy: 'no-cache',
+ update({ adminOpenCreations }) {
+ this.creation = adminOpenCreations.map((obj) => obj.amount)
+ },
+ error({ message }) {
+ this.toastError(message)
+ },
+ },
+ },
}
diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue
index b367d1b7f..3c1a1e67e 100644
--- a/admin/src/pages/CreationConfirm.vue
+++ b/admin/src/pages/CreationConfirm.vue
@@ -44,7 +44,7 @@
:fields="fields"
@show-overlay="showOverlay"
@update-state="updateStatus"
- @update-contributions="$apollo.queries.AllContributions.refetch()"
+ @update-contributions="$apollo.queries.ListAllContributions.refetch()"
/>
{
amount: 500,
memo: 'Danke für alles',
date: new Date(),
- moderator: 1,
+ moderatorId: 1,
state: 'PENDING',
creation: [500, 500, 500],
messagesCount: 0,
@@ -64,7 +64,7 @@ const defaultData = () => {
amount: 1000000,
memo: 'Gut Ergattert',
date: new Date(),
- moderator: 1,
+ moderatorId: 1,
state: 'PENDING',
creation: [500, 500, 500],
messagesCount: 0,
diff --git a/admin/src/pages/UserSearch.spec.js b/admin/src/pages/UserSearch.spec.js
index 77e8a3559..0d145cb89 100644
--- a/admin/src/pages/UserSearch.spec.js
+++ b/admin/src/pages/UserSearch.spec.js
@@ -25,7 +25,7 @@ const apolloQueryMock = jest.fn().mockResolvedValue({
email: 'benjamin@bluemchen.de',
creation: [1000, 1000, 1000],
emailChecked: true,
- deletedAt: null,
+ deletedAt: new Date(),
},
{
userId: 3,
@@ -243,6 +243,17 @@ describe('UserSearch', () => {
})
})
+ describe('recover user', () => {
+ const userId = 2
+ beforeEach(() => {
+ wrapper.findComponent({ name: 'SearchUserTable' }).vm.$emit('updateDeletedAt', userId, null)
+ })
+
+ it('toasts a success message', () => {
+ expect(toastSuccessSpy).toBeCalledWith('user_recovered')
+ })
+ })
+
describe('apollo returns error', () => {
beforeEach(() => {
apolloQueryMock.mockRejectedValue({
diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js
index 2654104dc..9d663bdea 100644
--- a/backend/.eslintrc.js
+++ b/backend/.eslintrc.js
@@ -76,7 +76,30 @@ module.exports = {
'import/no-named-default': 'error',
'import/no-namespace': 'error',
'import/no-unassigned-import': 'error',
- 'import/order': 'error',
+ 'import/order': [
+ 'error',
+ {
+ groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
+ 'newlines-between': 'always',
+ pathGroups: [
+ {
+ pattern: '@?*/**',
+ group: 'external',
+ position: 'after',
+ },
+ {
+ pattern: '@/**',
+ group: 'external',
+ position: 'after',
+ },
+ ],
+ alphabetize: {
+ order: 'asc' /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */,
+ caseInsensitive: true /* ignore case. Options: [true, false] */,
+ },
+ distinctGroup: true,
+ },
+ ],
'import/prefer-default-export': 'off', // TODO
},
overrides: [
diff --git a/backend/src/apis/HttpRequest.ts b/backend/src/apis/HttpRequest.ts
index eff0c408a..d8de68bb8 100644
--- a/backend/src/apis/HttpRequest.ts
+++ b/backend/src/apis/HttpRequest.ts
@@ -2,8 +2,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import axios from 'axios'
-import { backendLogger as logger } from '@/server/logger'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const apiPost = async (url: string, payload: unknown): Promise => {
diff --git a/backend/src/apis/KlicktippController.ts b/backend/src/apis/KlicktippController.ts
index 70c0f95b1..309cf56ee 100644
--- a/backend/src/apis/KlicktippController.ts
+++ b/backend/src/apis/KlicktippController.ts
@@ -4,9 +4,10 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
+import CONFIG from '@/config'
+
// eslint-disable-next-line import/no-relative-parent-imports
import KlicktippConnector from 'klicktipp-api'
-import CONFIG from '@/config'
const klicktippConnector = new KlicktippConnector()
diff --git a/backend/src/auth/JWT.ts b/backend/src/auth/JWT.ts
index 3da1f1d3e..93a6a8868 100644
--- a/backend/src/auth/JWT.ts
+++ b/backend/src/auth/JWT.ts
@@ -1,8 +1,10 @@
import { verify, sign } from 'jsonwebtoken'
-import { CustomJwtPayload } from './CustomJwtPayload'
+
import CONFIG from '@/config/'
import LogError from '@/server/LogError'
+import { CustomJwtPayload } from './CustomJwtPayload'
+
export const decode = (token: string): CustomJwtPayload | null => {
if (!token) throw new LogError('401 Unauthorized')
try {
diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts
index 13e339b13..e6c4e4c24 100644
--- a/backend/src/config/index.ts
+++ b/backend/src/config/index.ts
@@ -1,7 +1,7 @@
// ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env)
-import dotenv from 'dotenv'
import { Decimal } from 'decimal.js-light'
+import dotenv from 'dotenv'
dotenv.config()
diff --git a/backend/src/emails/sendEmailTranslated.test.ts b/backend/src/emails/sendEmailTranslated.test.ts
index 762b88cf0..85074344a 100644
--- a/backend/src/emails/sendEmailTranslated.test.ts
+++ b/backend/src/emails/sendEmailTranslated.test.ts
@@ -1,10 +1,13 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
import { createTransport } from 'nodemailer'
-import { sendEmailTranslated } from './sendEmailTranslated'
+
import { logger, i18n } from '@test/testSetup'
+
import CONFIG from '@/config'
+import { sendEmailTranslated } from './sendEmailTranslated'
+
CONFIG.EMAIL = false
CONFIG.EMAIL_SMTP_URL = 'EMAIL_SMTP_URL'
CONFIG.EMAIL_SMTP_PORT = '1234'
diff --git a/backend/src/emails/sendEmailTranslated.ts b/backend/src/emails/sendEmailTranslated.ts
index d865bac8f..6d89cc257 100644
--- a/backend/src/emails/sendEmailTranslated.ts
+++ b/backend/src/emails/sendEmailTranslated.ts
@@ -1,11 +1,13 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import path from 'path'
-import { createTransport } from 'nodemailer'
+
import Email from 'email-templates'
import i18n from 'i18n'
-import { backendLogger as logger } from '@/server/logger'
+import { createTransport } from 'nodemailer'
+
import CONFIG from '@/config'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
export const sendEmailTranslated = async (params: {
receiver: {
diff --git a/backend/src/emails/sendEmailVariants.test.ts b/backend/src/emails/sendEmailVariants.test.ts
index 399ed89ac..44d996fa8 100644
--- a/backend/src/emails/sendEmailVariants.test.ts
+++ b/backend/src/emails/sendEmailVariants.test.ts
@@ -4,6 +4,13 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { Decimal } from 'decimal.js-light'
+
+import { testEnvironment } from '@test/helpers'
+import { logger, i18n as localization } from '@test/testSetup'
+
+import CONFIG from '@/config'
+
+import { sendEmailTranslated } from './sendEmailTranslated'
import {
sendAddedContributionMessageEmail,
sendAccountActivationEmail,
@@ -15,10 +22,6 @@ import {
sendTransactionLinkRedeemedEmail,
sendTransactionReceivedEmail,
} from './sendEmailVariants'
-import { sendEmailTranslated } from './sendEmailTranslated'
-import { testEnvironment } from '@test/helpers'
-import { logger, i18n as localization } from '@test/testSetup'
-import CONFIG from '@/config'
let con: any
let testEnv: any
diff --git a/backend/src/emails/sendEmailVariants.ts b/backend/src/emails/sendEmailVariants.ts
index 2294ebdd5..b45e7fc67 100644
--- a/backend/src/emails/sendEmailVariants.ts
+++ b/backend/src/emails/sendEmailVariants.ts
@@ -1,8 +1,10 @@
import { Decimal } from 'decimal.js-light'
-import { sendEmailTranslated } from './sendEmailTranslated'
+
import CONFIG from '@/config'
import { decimalSeparatorByLanguage } from '@/util/utilities'
+import { sendEmailTranslated } from './sendEmailTranslated'
+
export const sendAddedContributionMessageEmail = (data: {
firstName: string
lastName: string
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts
index cb1f8b32b..390662ec1 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts
@@ -1,7 +1,10 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts
index 64797fc26..48e3151f5 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts
index a2770b34d..d2a7d4df0 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts
index cb9e32fbf..6c1916dfe 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts
index 93bfdbf4b..1655bf3d3 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts
index 2794f5fa3..c01be5f25 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts
@@ -1,6 +1,7 @@
-import { User as DbUser } from '@entity/User'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts
index 810cecf29..8a183b0d5 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts
index ab96b78f6..d4d5b9003 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts
@@ -1,7 +1,8 @@
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts
index 6bea692fd..a19bdf0ae 100644
--- a/backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts
+++ b/backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_USER_DELETE.ts b/backend/src/event/EVENT_ADMIN_USER_DELETE.ts
index 1eb7399aa..a75e2b176 100644
--- a/backend/src/event/EVENT_ADMIN_USER_DELETE.ts
+++ b/backend/src/event/EVENT_ADMIN_USER_DELETE.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts b/backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts
index 37c840475..9f09e2e3d 100644
--- a/backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts
+++ b/backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts b/backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts
index 121662ea8..51b5764d2 100644
--- a/backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts
+++ b/backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_CONTRIBUTION_CREATE.ts b/backend/src/event/EVENT_CONTRIBUTION_CREATE.ts
index 6842bc4eb..108ef7d04 100644
--- a/backend/src/event/EVENT_CONTRIBUTION_CREATE.ts
+++ b/backend/src/event/EVENT_CONTRIBUTION_CREATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_CONTRIBUTION_DELETE.ts b/backend/src/event/EVENT_CONTRIBUTION_DELETE.ts
index 30130662f..2b4064df7 100644
--- a/backend/src/event/EVENT_CONTRIBUTION_DELETE.ts
+++ b/backend/src/event/EVENT_CONTRIBUTION_DELETE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts b/backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts
index 5138548a6..5ee1da0e3 100644
--- a/backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts
+++ b/backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts
@@ -1,9 +1,10 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
-import { Transaction as DbTransaction } from '@entity/Transaction'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
+import { Transaction as DbTransaction } from '@entity/Transaction'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts b/backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts
index 1200834de..438b7f22c 100644
--- a/backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts
+++ b/backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts
@@ -1,7 +1,8 @@
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts b/backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts
index 38df20a4c..ff416c428 100644
--- a/backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts
+++ b/backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
import { Contribution as DbContribution } from '@entity/Contribution'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION.ts b/backend/src/event/EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION.ts
index ad9d27596..fc73c6e9d 100644
--- a/backend/src/event/EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION.ts
+++ b/backend/src/event/EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts b/backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts
index 2ba31af9d..1d229b563 100644
--- a/backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts
+++ b/backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_EMAIL_CONFIRMATION.ts b/backend/src/event/EVENT_EMAIL_CONFIRMATION.ts
index 5edef7f20..56a3cafc8 100644
--- a/backend/src/event/EVENT_EMAIL_CONFIRMATION.ts
+++ b/backend/src/event/EVENT_EMAIL_CONFIRMATION.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts b/backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts
index 72d3b2b2c..1b3cd11af 100644
--- a/backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts
+++ b/backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts b/backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts
index 74e4c1b42..a73ce4f6c 100644
--- a/backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts
+++ b/backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
-import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { Event as DbEvent } from '@entity/Event'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts b/backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts
index 70e06bbd4..d8f15f206 100644
--- a/backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts
+++ b/backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts
@@ -1,6 +1,7 @@
-import { User as DbUser } from '@entity/User'
-import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { Event as DbEvent } from '@entity/Event'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts b/backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts
index 75bc87916..e0ae3bb93 100644
--- a/backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts
+++ b/backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
-import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { Event as DbEvent } from '@entity/Event'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_TRANSACTION_RECEIVE.ts b/backend/src/event/EVENT_TRANSACTION_RECEIVE.ts
index a09e1c4b2..a7b945a97 100644
--- a/backend/src/event/EVENT_TRANSACTION_RECEIVE.ts
+++ b/backend/src/event/EVENT_TRANSACTION_RECEIVE.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
-import { Transaction as DbTransaction } from '@entity/Transaction'
import { Event as DbEvent } from '@entity/Event'
+import { Transaction as DbTransaction } from '@entity/Transaction'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_TRANSACTION_SEND.ts b/backend/src/event/EVENT_TRANSACTION_SEND.ts
index 71c70a425..b21970ad3 100644
--- a/backend/src/event/EVENT_TRANSACTION_SEND.ts
+++ b/backend/src/event/EVENT_TRANSACTION_SEND.ts
@@ -1,7 +1,8 @@
-import { Decimal } from 'decimal.js-light'
-import { User as DbUser } from '@entity/User'
-import { Transaction as DbTransaction } from '@entity/Transaction'
import { Event as DbEvent } from '@entity/Event'
+import { Transaction as DbTransaction } from '@entity/Transaction'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts b/backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts
index 9b2ce31ee..15d470dd7 100644
--- a/backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts
+++ b/backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_USER_INFO_UPDATE.ts b/backend/src/event/EVENT_USER_INFO_UPDATE.ts
index 6b9d89738..70b37eddf 100644
--- a/backend/src/event/EVENT_USER_INFO_UPDATE.ts
+++ b/backend/src/event/EVENT_USER_INFO_UPDATE.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_USER_LOGIN.ts b/backend/src/event/EVENT_USER_LOGIN.ts
index 81477b8a6..82458a664 100644
--- a/backend/src/event/EVENT_USER_LOGIN.ts
+++ b/backend/src/event/EVENT_USER_LOGIN.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_USER_LOGOUT.ts b/backend/src/event/EVENT_USER_LOGOUT.ts
index c6c63405a..f5e76f749 100644
--- a/backend/src/event/EVENT_USER_LOGOUT.ts
+++ b/backend/src/event/EVENT_USER_LOGOUT.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/EVENT_USER_REGISTER.ts b/backend/src/event/EVENT_USER_REGISTER.ts
index 45bc6b6f4..e144b9d6d 100644
--- a/backend/src/event/EVENT_USER_REGISTER.ts
+++ b/backend/src/event/EVENT_USER_REGISTER.ts
@@ -1,5 +1,6 @@
-import { User as DbUser } from '@entity/User'
import { Event as DbEvent } from '@entity/Event'
+import { User as DbUser } from '@entity/User'
+
import { Event } from './Event'
import { EventType } from './EventType'
diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts
index d19177b53..307d1a0c4 100644
--- a/backend/src/event/Event.ts
+++ b/backend/src/event/Event.ts
@@ -1,11 +1,12 @@
+import { Contribution as DbContribution } from '@entity/Contribution'
+import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
+import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { Event as DbEvent } from '@entity/Event'
-import { User as DbUser } from '@entity/User'
import { Transaction as DbTransaction } from '@entity/Transaction'
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
-import { Contribution as DbContribution } from '@entity/Contribution'
-import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
-import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
+import { User as DbUser } from '@entity/User'
import { Decimal } from 'decimal.js-light'
+
import { EventType } from './EventType'
export const Event = (
diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts
index ce0d708bc..c4063e4c5 100644
--- a/backend/src/federation/client/1_0/FederationClient.ts
+++ b/backend/src/federation/client/1_0/FederationClient.ts
@@ -1,11 +1,12 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
-import { gql } from 'graphql-request'
import { Community as DbCommunity } from '@entity/Community'
+import { gql } from 'graphql-request'
+
import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient'
-import { backendLogger as logger } from '@/server/logger'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
export async function requestGetPublicKey(dbCom: DbCommunity): Promise {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
diff --git a/backend/src/federation/client/1_1/FederationClient.ts b/backend/src/federation/client/1_1/FederationClient.ts
index 579a9701c..b29960407 100644
--- a/backend/src/federation/client/1_1/FederationClient.ts
+++ b/backend/src/federation/client/1_1/FederationClient.ts
@@ -1,11 +1,12 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
-import { gql } from 'graphql-request'
import { Community as DbCommunity } from '@entity/Community'
+import { gql } from 'graphql-request'
+
import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient'
-import { backendLogger as logger } from '@/server/logger'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
export async function requestGetPublicKey(dbCom: DbCommunity): Promise {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
diff --git a/backend/src/federation/validateCommunities.test.ts b/backend/src/federation/validateCommunities.test.ts
index a99bb3274..d90664b63 100644
--- a/backend/src/federation/validateCommunities.test.ts
+++ b/backend/src/federation/validateCommunities.test.ts
@@ -6,9 +6,11 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Community as DbCommunity } from '@entity/Community'
-import { validateCommunities } from './validateCommunities'
-import { logger } from '@test/testSetup'
+
import { testEnvironment, cleanDB } from '@test/helpers'
+import { logger } from '@test/testSetup'
+
+import { validateCommunities } from './validateCommunities'
let con: any
let testEnv: any
diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts
index 19185e4d9..fb6bda673 100644
--- a/backend/src/federation/validateCommunities.ts
+++ b/backend/src/federation/validateCommunities.ts
@@ -1,12 +1,14 @@
-import { Community as DbCommunity } from '@entity/Community'
import { IsNull } from '@dbTools/typeorm'
+import { Community as DbCommunity } from '@entity/Community'
+
+import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
+
// eslint-disable-next-line camelcase
import { requestGetPublicKey as v1_0_requestGetPublicKey } from './client/1_0/FederationClient'
// eslint-disable-next-line camelcase
import { requestGetPublicKey as v1_1_requestGetPublicKey } from './client/1_1/FederationClient'
import { ApiVersionType } from './enum/apiVersionType'
-import { backendLogger as logger } from '@/server/logger'
-import LogError from '@/server/LogError'
export function startValidateCommunities(timerInterval: number): void {
logger.info(
diff --git a/backend/src/graphql/arg/AdminCreateContributionArgs.ts b/backend/src/graphql/arg/AdminCreateContributionArgs.ts
index 6259e672e..65aeb82e5 100644
--- a/backend/src/graphql/arg/AdminCreateContributionArgs.ts
+++ b/backend/src/graphql/arg/AdminCreateContributionArgs.ts
@@ -1,5 +1,5 @@
-import { ArgsType, Field, InputType } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field, InputType } from 'type-graphql'
@InputType()
@ArgsType()
diff --git a/backend/src/graphql/arg/AdminUpdateContributionArgs.ts b/backend/src/graphql/arg/AdminUpdateContributionArgs.ts
index 3b10acf1a..6a8f00dc2 100644
--- a/backend/src/graphql/arg/AdminUpdateContributionArgs.ts
+++ b/backend/src/graphql/arg/AdminUpdateContributionArgs.ts
@@ -1,14 +1,11 @@
-import { ArgsType, Field, Int } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field, Int } from 'type-graphql'
@ArgsType()
export default class AdminUpdateContributionArgs {
@Field(() => Int)
id: number
- @Field(() => String)
- email: string
-
@Field(() => Decimal)
amount: Decimal
diff --git a/backend/src/graphql/arg/ContributionArgs.ts b/backend/src/graphql/arg/ContributionArgs.ts
index dc4285e4d..cc8aea41e 100644
--- a/backend/src/graphql/arg/ContributionArgs.ts
+++ b/backend/src/graphql/arg/ContributionArgs.ts
@@ -1,5 +1,5 @@
-import { ArgsType, Field, InputType } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field, InputType } from 'type-graphql'
@InputType()
@ArgsType()
diff --git a/backend/src/graphql/arg/ContributionLinkArgs.ts b/backend/src/graphql/arg/ContributionLinkArgs.ts
index fac1eacc1..d28a7808f 100644
--- a/backend/src/graphql/arg/ContributionLinkArgs.ts
+++ b/backend/src/graphql/arg/ContributionLinkArgs.ts
@@ -1,5 +1,5 @@
-import { ArgsType, Field, Int } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field, Int } from 'type-graphql'
@ArgsType()
export default class ContributionLinkArgs {
diff --git a/backend/src/graphql/arg/Paginated.ts b/backend/src/graphql/arg/Paginated.ts
index 290dba337..e605c49d4 100644
--- a/backend/src/graphql/arg/Paginated.ts
+++ b/backend/src/graphql/arg/Paginated.ts
@@ -1,5 +1,6 @@
/* eslint-disable type-graphql/invalid-nullable-input-type */
import { ArgsType, Field, Int } from 'type-graphql'
+
import { Order } from '@enum/Order'
@ArgsType()
diff --git a/backend/src/graphql/arg/SearchUsersArgs.ts b/backend/src/graphql/arg/SearchUsersArgs.ts
index 39996efca..de7275f63 100644
--- a/backend/src/graphql/arg/SearchUsersArgs.ts
+++ b/backend/src/graphql/arg/SearchUsersArgs.ts
@@ -1,4 +1,5 @@
import { ArgsType, Field, Int } from 'type-graphql'
+
import SearchUsersFilters from '@arg/SearchUsersFilters'
@ArgsType()
diff --git a/backend/src/graphql/arg/TransactionLinkArgs.ts b/backend/src/graphql/arg/TransactionLinkArgs.ts
index 6c1c4654a..19720e321 100644
--- a/backend/src/graphql/arg/TransactionLinkArgs.ts
+++ b/backend/src/graphql/arg/TransactionLinkArgs.ts
@@ -1,5 +1,5 @@
-import { ArgsType, Field } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field } from 'type-graphql'
@ArgsType()
export default class TransactionLinkArgs {
diff --git a/backend/src/graphql/arg/TransactionSendArgs.ts b/backend/src/graphql/arg/TransactionSendArgs.ts
index c0faff850..d91cecbcd 100644
--- a/backend/src/graphql/arg/TransactionSendArgs.ts
+++ b/backend/src/graphql/arg/TransactionSendArgs.ts
@@ -1,5 +1,5 @@
-import { ArgsType, Field } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ArgsType, Field } from 'type-graphql'
@ArgsType()
export default class TransactionSendArgs {
diff --git a/backend/src/graphql/directive/isAuthorized.ts b/backend/src/graphql/directive/isAuthorized.ts
index 6cdac9b97..a018fd230 100644
--- a/backend/src/graphql/directive/isAuthorized.ts
+++ b/backend/src/graphql/directive/isAuthorized.ts
@@ -2,13 +2,13 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-explicit-any */
+import { User } from '@entity/User'
import { AuthChecker } from 'type-graphql'
-import { User } from '@entity/User'
-import { decode, encode } from '@/auth/JWT'
-import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '@/auth/ROLES'
-import { RIGHTS } from '@/auth/RIGHTS'
import { INALIENABLE_RIGHTS } from '@/auth/INALIENABLE_RIGHTS'
+import { decode, encode } from '@/auth/JWT'
+import { RIGHTS } from '@/auth/RIGHTS'
+import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '@/auth/ROLES'
import LogError from '@/server/LogError'
const isAuthorized: AuthChecker = async ({ context }, rights) => {
diff --git a/backend/src/graphql/model/AdminUpdateContribution.ts b/backend/src/graphql/model/AdminUpdateContribution.ts
index d5cd4fc7f..b7c3df6bd 100644
--- a/backend/src/graphql/model/AdminUpdateContribution.ts
+++ b/backend/src/graphql/model/AdminUpdateContribution.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field } from 'type-graphql'
@ObjectType()
export class AdminUpdateContribution {
diff --git a/backend/src/graphql/model/Balance.ts b/backend/src/graphql/model/Balance.ts
index d68237db9..162ccc3c0 100644
--- a/backend/src/graphql/model/Balance.ts
+++ b/backend/src/graphql/model/Balance.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int, Float } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int, Float } from 'type-graphql'
@ObjectType()
export class Balance {
diff --git a/backend/src/graphql/model/Community.ts b/backend/src/graphql/model/Community.ts
index ec91ad36f..22b2b1fc6 100644
--- a/backend/src/graphql/model/Community.ts
+++ b/backend/src/graphql/model/Community.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { Community as DbCommunity } from '@entity/Community'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class Community {
diff --git a/backend/src/graphql/model/CommunityStatistics.ts b/backend/src/graphql/model/CommunityStatistics.ts
index 1fb1ded46..775ad183b 100644
--- a/backend/src/graphql/model/CommunityStatistics.ts
+++ b/backend/src/graphql/model/CommunityStatistics.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class DynamicStatisticsFields {
diff --git a/backend/src/graphql/model/Contribution.ts b/backend/src/graphql/model/Contribution.ts
index a83adef4b..b5db21b16 100644
--- a/backend/src/graphql/model/Contribution.ts
+++ b/backend/src/graphql/model/Contribution.ts
@@ -1,7 +1,7 @@
-import { ObjectType, Field, Int } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import { Contribution as dbContribution } from '@entity/Contribution'
import { User } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class Contribution {
@@ -21,6 +21,8 @@ export class Contribution {
this.deniedBy = contribution.deniedBy
this.deletedAt = contribution.deletedAt
this.deletedBy = contribution.deletedBy
+ this.moderatorId = contribution.moderatorId
+ this.userId = contribution.userId
}
@Field(() => Int)
@@ -67,6 +69,12 @@ export class Contribution {
@Field(() => String)
state: string
+
+ @Field(() => Int, { nullable: true })
+ moderatorId: number | null
+
+ @Field(() => Int, { nullable: true })
+ userId: number | null
}
@ObjectType()
diff --git a/backend/src/graphql/model/ContributionLink.ts b/backend/src/graphql/model/ContributionLink.ts
index 13ae31692..e47ffc6ed 100644
--- a/backend/src/graphql/model/ContributionLink.ts
+++ b/backend/src/graphql/model/ContributionLink.ts
@@ -1,6 +1,7 @@
-import { ObjectType, Field, Int } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import { ContributionLink as dbContributionLink } from '@entity/ContributionLink'
+import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
+
import CONFIG from '@/config'
@ObjectType()
diff --git a/backend/src/graphql/model/ContributionLinkList.ts b/backend/src/graphql/model/ContributionLinkList.ts
index d2c347b27..c35f6fae6 100644
--- a/backend/src/graphql/model/ContributionLinkList.ts
+++ b/backend/src/graphql/model/ContributionLinkList.ts
@@ -1,4 +1,5 @@
import { ObjectType, Field, Int } from 'type-graphql'
+
import { ContributionLink } from '@model/ContributionLink'
@ObjectType()
diff --git a/backend/src/graphql/model/ContributionMessage.ts b/backend/src/graphql/model/ContributionMessage.ts
index 6bd6a4715..6f70d5024 100644
--- a/backend/src/graphql/model/ContributionMessage.ts
+++ b/backend/src/graphql/model/ContributionMessage.ts
@@ -1,6 +1,6 @@
-import { Field, Int, ObjectType } from 'type-graphql'
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { User } from '@entity/User'
+import { Field, Int, ObjectType } from 'type-graphql'
@ObjectType()
export class ContributionMessage {
diff --git a/backend/src/graphql/model/Decay.ts b/backend/src/graphql/model/Decay.ts
index 3e8412dfa..0b710c234 100644
--- a/backend/src/graphql/model/Decay.ts
+++ b/backend/src/graphql/model/Decay.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
interface DecayInterface {
balance: Decimal
diff --git a/backend/src/graphql/model/GdtEntry.ts b/backend/src/graphql/model/GdtEntry.ts
index bbf1cceef..81dda0ca7 100644
--- a/backend/src/graphql/model/GdtEntry.ts
+++ b/backend/src/graphql/model/GdtEntry.ts
@@ -3,6 +3,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field, Float, Int } from 'type-graphql'
+
import { GdtEntryType } from '@enum/GdtEntryType'
@ObjectType()
diff --git a/backend/src/graphql/model/GdtEntryList.ts b/backend/src/graphql/model/GdtEntryList.ts
index d992de54c..06f77f532 100644
--- a/backend/src/graphql/model/GdtEntryList.ts
+++ b/backend/src/graphql/model/GdtEntryList.ts
@@ -4,6 +4,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field, Int, Float } from 'type-graphql'
+
import { GdtEntry } from './GdtEntry'
@ObjectType()
diff --git a/backend/src/graphql/model/OpenCreation.ts b/backend/src/graphql/model/OpenCreation.ts
index ed9ef731e..46ee8117f 100644
--- a/backend/src/graphql/model/OpenCreation.ts
+++ b/backend/src/graphql/model/OpenCreation.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class OpenCreation {
diff --git a/backend/src/graphql/model/Transaction.ts b/backend/src/graphql/model/Transaction.ts
index 8f0d1eadc..1b857391b 100644
--- a/backend/src/graphql/model/Transaction.ts
+++ b/backend/src/graphql/model/Transaction.ts
@@ -1,9 +1,11 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { Transaction as dbTransaction } from '@entity/Transaction'
import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
+
+import { TransactionTypeId } from '@enum/TransactionTypeId'
+
import { Decay } from './Decay'
import { User } from './User'
-import { TransactionTypeId } from '@enum/TransactionTypeId'
@ObjectType()
export class Transaction {
diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts
index ddd22f36f..7356e97c6 100644
--- a/backend/src/graphql/model/TransactionLink.ts
+++ b/backend/src/graphql/model/TransactionLink.ts
@@ -1,9 +1,11 @@
-import { ObjectType, Field, Int } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
-import { User } from './User'
+import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
+
import CONFIG from '@/config'
+import { User } from './User'
+
@ObjectType()
export class TransactionLink {
constructor(transactionLink: dbTransactionLink, user: User, redeemedBy: User | null = null) {
diff --git a/backend/src/graphql/model/TransactionList.ts b/backend/src/graphql/model/TransactionList.ts
index 888c30dc7..77f9f6481 100644
--- a/backend/src/graphql/model/TransactionList.ts
+++ b/backend/src/graphql/model/TransactionList.ts
@@ -1,6 +1,7 @@
import { ObjectType, Field } from 'type-graphql'
-import { Transaction } from './Transaction'
+
import { Balance } from './Balance'
+import { Transaction } from './Transaction'
@ObjectType()
export class TransactionList {
diff --git a/backend/src/graphql/model/UnconfirmedContribution.ts b/backend/src/graphql/model/UnconfirmedContribution.ts
index 439f70a16..dece05781 100644
--- a/backend/src/graphql/model/UnconfirmedContribution.ts
+++ b/backend/src/graphql/model/UnconfirmedContribution.ts
@@ -1,7 +1,7 @@
-import { ObjectType, Field, Int } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import { Contribution } from '@entity/Contribution'
import { User } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class UnconfirmedContribution {
diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts
index 85c6de798..c705ba912 100644
--- a/backend/src/graphql/model/User.ts
+++ b/backend/src/graphql/model/User.ts
@@ -1,5 +1,6 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { User as dbUser } from '@entity/User'
+import { ObjectType, Field, Int } from 'type-graphql'
+
import { KlickTipp } from './KlickTipp'
import { UserContact } from './UserContact'
diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts
index 84512d812..3e7210874 100644
--- a/backend/src/graphql/model/UserAdmin.ts
+++ b/backend/src/graphql/model/UserAdmin.ts
@@ -1,6 +1,6 @@
-import { ObjectType, Field, Int } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import { User } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class UserAdmin {
diff --git a/backend/src/graphql/model/UserContact.ts b/backend/src/graphql/model/UserContact.ts
index bb31d0745..4a6ed47b6 100644
--- a/backend/src/graphql/model/UserContact.ts
+++ b/backend/src/graphql/model/UserContact.ts
@@ -1,5 +1,5 @@
-import { ObjectType, Field, Int } from 'type-graphql'
import { UserContact as dbUserContact } from '@entity/UserContact'
+import { ObjectType, Field, Int } from 'type-graphql'
@ObjectType()
export class UserContact {
diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts
index 7600f12b9..deedb9dff 100644
--- a/backend/src/graphql/resolver/BalanceResolver.ts
+++ b/backend/src/graphql/resolver/BalanceResolver.ts
@@ -1,21 +1,20 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
-import { Decimal } from 'decimal.js-light'
-import { Resolver, Query, Ctx, Authorized } from 'type-graphql'
import { getCustomRepository } from '@dbTools/typeorm'
-
import { Transaction as dbTransaction } from '@entity/Transaction'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
+import { Decimal } from 'decimal.js-light'
+import { Resolver, Query, Ctx, Authorized } from 'type-graphql'
+
+import { Balance } from '@model/Balance'
+import { TransactionLinkRepository } from '@repository/TransactionLink'
+
+import { RIGHTS } from '@/auth/RIGHTS'
+import { Context, getUser } from '@/server/context'
+import { backendLogger as logger } from '@/server/logger'
+import { calculateDecay } from '@/util/decay'
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'
-import { Context, getUser } from '@/server/context'
-import { calculateDecay } from '@/util/decay'
-import { RIGHTS } from '@/auth/RIGHTS'
@Resolver()
export class BalanceResolver {
diff --git a/backend/src/graphql/resolver/CommunityResolver.test.ts b/backend/src/graphql/resolver/CommunityResolver.test.ts
index f4352c095..5b4b26cad 100644
--- a/backend/src/graphql/resolver/CommunityResolver.test.ts
+++ b/backend/src/graphql/resolver/CommunityResolver.test.ts
@@ -6,9 +6,11 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Community as DbCommunity } from '@entity/Community'
-import { getCommunities } from '@/seeds/graphql/queries'
+
import { testEnvironment } from '@test/helpers'
+import { getCommunities } from '@/seeds/graphql/queries'
+
let query: any
// to do: We need a setup for the tests that closes the connection
diff --git a/backend/src/graphql/resolver/CommunityResolver.ts b/backend/src/graphql/resolver/CommunityResolver.ts
index 6aca41472..86e55ad1f 100644
--- a/backend/src/graphql/resolver/CommunityResolver.ts
+++ b/backend/src/graphql/resolver/CommunityResolver.ts
@@ -1,6 +1,6 @@
+import { Community as DbCommunity } from '@entity/Community'
import { Resolver, Query, Authorized } from 'type-graphql'
-import { Community as DbCommunity } from '@entity/Community'
import { Community } from '@model/Community'
import { RIGHTS } from '@/auth/RIGHTS'
diff --git a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts
index d89edc695..2247318a3 100644
--- a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts
+++ b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts
@@ -4,11 +4,16 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-explicit-any */
-import { Decimal } from 'decimal.js-light'
-import { GraphQLError } from 'graphql'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Event as DbEvent } from '@entity/Event'
+import { Decimal } from 'decimal.js-light'
+import { GraphQLError } from 'graphql'
+
+import { cleanDB, testEnvironment, resetToken } from '@test/helpers'
import { logger } from '@test/testSetup'
+
+import { EventType } from '@/event/Event'
+import { userFactory } from '@/seeds/factory/user'
import {
login,
createContributionLink,
@@ -16,11 +21,8 @@ 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'
-import { EventType } from '@/event/Events'
let mutate: any, query: any, con: any
let testEnv: any
diff --git a/backend/src/graphql/resolver/ContributionLinkResolver.ts b/backend/src/graphql/resolver/ContributionLinkResolver.ts
index 6328bd3bc..462dbf99f 100644
--- a/backend/src/graphql/resolver/ContributionLinkResolver.ts
+++ b/backend/src/graphql/resolver/ContributionLinkResolver.ts
@@ -1,31 +1,32 @@
+import { MoreThan, IsNull } from '@dbTools/typeorm'
+import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Decimal } from 'decimal.js-light'
import { Resolver, Args, Arg, Authorized, Mutation, Query, Int, Ctx } from 'type-graphql'
-import { MoreThan, IsNull } from '@dbTools/typeorm'
-import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
+// TODO: this is a strange construct
+import ContributionLinkArgs from '@arg/ContributionLinkArgs'
+import Paginated from '@arg/Paginated'
+import { Order } from '@enum/Order'
+import { ContributionLink } from '@model/ContributionLink'
+import { ContributionLinkList } from '@model/ContributionLinkList'
+
+import { RIGHTS } from '@/auth/RIGHTS'
+import {
+ EVENT_ADMIN_CONTRIBUTION_LINK_CREATE,
+ EVENT_ADMIN_CONTRIBUTION_LINK_DELETE,
+ EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE,
+} from '@/event/Events'
+import { Context, getUser } from '@/server/context'
+import LogError from '@/server/LogError'
+
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'
-
-// TODO: this is a strange construct
-import LogError from '@/server/LogError'
-import { Context, getUser } from '@/server/context'
-import {
- EVENT_ADMIN_CONTRIBUTION_LINK_CREATE,
- EVENT_ADMIN_CONTRIBUTION_LINK_DELETE,
- EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE,
-} from '@/event/Events'
+import { isStartEndDateValid } from './util/creations'
@Resolver()
export class ContributionLinkResolver {
diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts
index b8125f8cb..2ebf0d657 100644
--- a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts
+++ b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts
@@ -6,10 +6,15 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { GraphQLError } from 'graphql'
import { Event as DbEvent } from '@entity/Event'
+import { GraphQLError } from 'graphql'
+
import { cleanDB, resetToken, testEnvironment } from '@test/helpers'
import { logger, i18n as localization } from '@test/testSetup'
+
+import { sendAddedContributionMessageEmail } from '@/emails/sendEmailVariants'
+import { EventType } from '@/event/Events'
+import { userFactory } from '@/seeds/factory/user'
import {
adminCreateContributionMessage,
createContribution,
@@ -17,11 +22,8 @@ import {
login,
} from '@/seeds/graphql/mutations'
import { listContributionMessages } from '@/seeds/graphql/queries'
-import { userFactory } from '@/seeds/factory/user'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { peterLustig } from '@/seeds/users/peter-lustig'
-import { sendAddedContributionMessageEmail } from '@/emails/sendEmailVariants'
-import { EventType } from '@/event/Events'
jest.mock('@/emails/sendEmailVariants', () => {
const originalModule = jest.requireActual('@/emails/sendEmailVariants')
diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts
index 276183894..4f454d420 100644
--- a/backend/src/graphql/resolver/ContributionMessageResolver.ts
+++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts
@@ -1,27 +1,26 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
-import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
import { getConnection } from '@dbTools/typeorm'
-
-import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { Contribution as DbContribution } from '@entity/Contribution'
-import { UserContact as DbUserContact } from '@entity/UserContact'
+import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
import { User as DbUser } from '@entity/User'
+import { UserContact as DbUserContact } from '@entity/UserContact'
+import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
-import { ContributionMessage, ContributionMessageListResult } from '@model/ContributionMessage'
import ContributionMessageArgs from '@arg/ContributionMessageArgs'
-import { ContributionMessageType } from '@enum/MessageType'
-import { ContributionStatus } from '@enum/ContributionStatus'
-import { Order } from '@enum/Order'
import Paginated from '@arg/Paginated'
+import { ContributionStatus } from '@enum/ContributionStatus'
+import { ContributionMessageType } from '@enum/MessageType'
+import { Order } from '@enum/Order'
+import { ContributionMessage, ContributionMessageListResult } from '@model/ContributionMessage'
import { RIGHTS } from '@/auth/RIGHTS'
-import { Context, getUser } from '@/server/context'
import { sendAddedContributionMessageEmail } from '@/emails/sendEmailVariants'
-import LogError from '@/server/LogError'
import {
EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE,
EVENT_CONTRIBUTION_MESSAGE_CREATE,
} from '@/event/Events'
+import { Context, getUser } from '@/server/context'
+import LogError from '@/server/LogError'
@Resolver()
export class ContributionMessageResolver {
diff --git a/backend/src/graphql/resolver/ContributionResolver.test.ts b/backend/src/graphql/resolver/ContributionResolver.test.ts
index b99c6b0c7..5bca29972 100644
--- a/backend/src/graphql/resolver/ContributionResolver.test.ts
+++ b/backend/src/graphql/resolver/ContributionResolver.test.ts
@@ -6,17 +6,34 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { Decimal } from 'decimal.js-light'
-import { GraphQLError } from 'graphql'
import { Contribution } from '@entity/Contribution'
+import { Event as DbEvent } from '@entity/Event'
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 { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
-import { bobBaumeister } from '@/seeds/users/bob-baumeister'
-import { stephenHawking } from '@/seeds/users/stephen-hawking'
-import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
+import { Decimal } from 'decimal.js-light'
+import { GraphQLError } from 'graphql'
+
+import { ContributionStatus } from '@enum/ContributionStatus'
+import { Order } from '@enum/Order'
+import { ContributionListResult } from '@model/Contribution'
+import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
+import {
+ cleanDB,
+ resetToken,
+ testEnvironment,
+ contributionDateFormatter,
+ resetEntity,
+} from '@test/helpers'
+
+import {
+ sendContributionConfirmedEmail,
+ sendContributionDeletedEmail,
+ sendContributionDeniedEmail,
+} from '@/emails/sendEmailVariants'
+import { creations } from '@/seeds/creation/index'
+import { creationFactory } from '@/seeds/factory/creation'
+import { userFactory } from '@/seeds/factory/user'
import {
createContribution,
updateContribution,
@@ -35,29 +52,14 @@ import {
listContributions,
adminListContributions,
} from '@/seeds/graphql/queries'
-import {
- sendContributionConfirmedEmail,
- 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 { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
+import { bobBaumeister } from '@/seeds/users/bob-baumeister'
+import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
import { peterLustig } from '@/seeds/users/peter-lustig'
import { EventType } from '@/event/Events'
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'
+import { stephenHawking } from '@/seeds/users/stephen-hawking'
jest.mock('@/emails/sendEmailVariants')
@@ -435,7 +437,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: pendingContribution.data.createContribution.id,
- email: 'bibi@bloxberg.de',
amount: 10.0,
memo: 'Test env contribution',
creationDate: new Date().toString(),
@@ -1670,7 +1671,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: 1,
- email: 'bibi@bloxberg.de',
amount: new Decimal(300),
memo: 'Danke Bibi!',
creationDate: contributionDateFormatter(new Date()),
@@ -1749,7 +1749,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: 1,
- email: 'bibi@bloxberg.de',
amount: new Decimal(300),
memo: 'Danke Bibi!',
creationDate: contributionDateFormatter(new Date()),
@@ -2043,6 +2042,50 @@ 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 ', () => {
@@ -2080,58 +2123,6 @@ describe('ContributionResolver', () => {
// stephen@hawking.uk: [1000, 1000, 1000] - deleted
// garrick@ollivander.com: [1000, 1000, 1000] - not activated
- describe('user for creation to update does not exist', () => {
- it('throws an error', async () => {
- jest.clearAllMocks()
- await expect(
- mutate({
- mutation: adminUpdateContribution,
- variables: {
- id: 1,
- email: 'bob@baumeister.de',
- amount: new Decimal(300),
- memo: 'Danke Bibi!',
- creationDate: contributionDateFormatter(new Date()),
- },
- }),
- ).resolves.toEqual(
- expect.objectContaining({
- errors: [new GraphQLError('Could not find User')],
- }),
- )
- })
-
- it('logs the error "Could not find User"', () => {
- expect(logger.error).toBeCalledWith('Could not find User', 'bob@baumeister.de')
- })
- })
-
- describe('user for creation to update is deleted', () => {
- it('throws an error', async () => {
- jest.clearAllMocks()
- await expect(
- mutate({
- mutation: adminUpdateContribution,
- variables: {
- id: 1,
- email: 'stephen@hawking.uk',
- amount: new Decimal(300),
- memo: 'Danke Bibi!',
- creationDate: contributionDateFormatter(new Date()),
- },
- }),
- ).resolves.toEqual(
- expect.objectContaining({
- errors: [new GraphQLError('User was deleted')],
- }),
- )
- })
-
- it('logs the error "User was deleted"', () => {
- expect(logger.error).toBeCalledWith('User was deleted', 'stephen@hawking.uk')
- })
- })
-
describe('creation does not exist', () => {
it('throws an error', async () => {
jest.clearAllMocks()
@@ -2140,7 +2131,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: -1,
- email: 'bibi@bloxberg.de',
amount: new Decimal(300),
memo: 'Danke Bibi!',
creationDate: contributionDateFormatter(new Date()),
@@ -2158,40 +2148,6 @@ describe('ContributionResolver', () => {
})
})
- describe('user email does not match creation user', () => {
- it('throws an error', async () => {
- jest.clearAllMocks()
- await expect(
- mutate({
- mutation: adminUpdateContribution,
- variables: {
- id: creation ? creation.id : -1,
- email: 'bibi@bloxberg.de',
- amount: new Decimal(300),
- memo: 'Danke Bibi!',
- creationDate: creation
- ? contributionDateFormatter(creation.contributionDate)
- : contributionDateFormatter(new Date()),
- },
- }),
- ).resolves.toEqual(
- expect.objectContaining({
- errors: [
- new GraphQLError(
- 'User of the pending contribution and send user does not correspond',
- ),
- ],
- }),
- )
- })
-
- it('logs the error "User of the pending contribution and send user does not correspond"', () => {
- expect(logger.error).toBeCalledWith(
- 'User of the pending contribution and send user does not correspond',
- )
- })
- })
-
describe('creation update is not valid', () => {
// as this test has not clearly defined that date, it is a false positive
it('throws an error', async () => {
@@ -2201,7 +2157,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: creation ? creation.id : -1,
- email: 'peter@lustig.de',
amount: new Decimal(1900),
memo: 'Danke Peter!',
creationDate: creation
@@ -2238,7 +2193,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: creation?.id,
- email: 'peter@lustig.de',
amount: new Decimal(300),
memo: 'Danke Peter!',
creationDate: creation
@@ -2253,7 +2207,6 @@ describe('ContributionResolver', () => {
date: expect.any(String),
memo: 'Danke Peter!',
amount: '300',
- creation: ['1000', '700', '500'],
},
},
}),
@@ -2280,7 +2233,6 @@ describe('ContributionResolver', () => {
mutation: adminUpdateContribution,
variables: {
id: creation?.id,
- email: 'peter@lustig.de',
amount: new Decimal(200),
memo: 'Das war leider zu Viel!',
creationDate: creation
@@ -2295,7 +2247,6 @@ describe('ContributionResolver', () => {
date: expect.any(String),
memo: 'Das war leider zu Viel!',
amount: '200',
- creation: ['1000', '800', '1000'],
},
},
}),
diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts
index e5112e8b4..60f03020a 100644
--- a/backend/src/graphql/resolver/ContributionResolver.ts
+++ b/backend/src/graphql/resolver/ContributionResolver.ts
@@ -1,42 +1,34 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */
-import { Decimal } from 'decimal.js-light'
-import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
import { IsNull, getConnection } from '@dbTools/typeorm'
-
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionMessage } from '@entity/ContributionMessage'
-import { UserContact } from '@entity/UserContact'
-import { User as DbUser } from '@entity/User'
import { Transaction as DbTransaction } from '@entity/Transaction'
+import { User as DbUser } from '@entity/User'
+import { UserContact } from '@entity/UserContact'
+import { Decimal } from 'decimal.js-light'
+import { Arg, Args, Authorized, Ctx, Int, Mutation, Query, Resolver } from 'type-graphql'
-import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
-import { getLastTransaction } from './util/getLastTransaction'
-import { findContributions } from './util/findContributions'
-import {
- getUserCreation,
- validateContribution,
- updateCreations,
- isValidDateString,
- getOpenCreations,
-} from './util/creations'
+import AdminCreateContributionArgs from '@arg/AdminCreateContributionArgs'
+import AdminUpdateContributionArgs from '@arg/AdminUpdateContributionArgs'
+import ContributionArgs from '@arg/ContributionArgs'
+import Paginated from '@arg/Paginated'
+import { ContributionStatus } from '@enum/ContributionStatus'
+import { ContributionType } from '@enum/ContributionType'
+import { ContributionMessageType } from '@enum/MessageType'
+import { Order } from '@enum/Order'
+import { TransactionTypeId } from '@enum/TransactionTypeId'
import { AdminUpdateContribution } from '@model/AdminUpdateContribution'
import { Contribution, ContributionListResult } from '@model/Contribution'
import { Decay } from '@model/Decay'
import { OpenCreation } from '@model/OpenCreation'
import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
-import { TransactionTypeId } from '@enum/TransactionTypeId'
-import { Order } from '@enum/Order'
-import { ContributionType } from '@enum/ContributionType'
-import { ContributionStatus } from '@enum/ContributionStatus'
-import { ContributionMessageType } from '@enum/MessageType'
-import ContributionArgs from '@arg/ContributionArgs'
-import Paginated from '@arg/Paginated'
-import AdminCreateContributionArgs from '@arg/AdminCreateContributionArgs'
-import AdminUpdateContributionArgs from '@arg/AdminUpdateContributionArgs'
import { RIGHTS } from '@/auth/RIGHTS'
-import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
-import { backendLogger as logger } from '@/server/logger'
+import {
+ sendContributionConfirmedEmail,
+ sendContributionDeletedEmail,
+ sendContributionDeniedEmail,
+} from '@/emails/sendEmailVariants'
import {
EVENT_CONTRIBUTION_CREATE,
EVENT_CONTRIBUTION_DELETE,
@@ -47,14 +39,22 @@ import {
EVENT_ADMIN_CONTRIBUTION_CONFIRM,
EVENT_ADMIN_CONTRIBUTION_DENY,
} from '@/event/Events'
-import { calculateDecay } from '@/util/decay'
-import {
- sendContributionConfirmedEmail,
- sendContributionDeletedEmail,
- sendContributionDeniedEmail,
-} from '@/emails/sendEmailVariants'
-import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
+import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
+import { calculateDecay } from '@/util/decay'
+import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
+
+import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
+import {
+ getUserCreation,
+ validateContribution,
+ updateCreations,
+ isValidDateString,
+ getOpenCreations,
+} from './util/creations'
+import { findContributions } from './util/findContributions'
+import { getLastTransaction } from './util/getLastTransaction'
@Resolver()
export class ContributionResolver {
@@ -201,6 +201,9 @@ 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
@@ -306,41 +309,27 @@ export class ContributionResolver {
@Authorized([RIGHTS.ADMIN_UPDATE_CONTRIBUTION])
@Mutation(() => AdminUpdateContribution)
async adminUpdateContribution(
- @Args() { id, email, amount, memo, creationDate }: AdminUpdateContributionArgs,
+ @Args() { id, amount, memo, creationDate }: AdminUpdateContributionArgs,
@Ctx() context: Context,
): Promise {
const clientTimezoneOffset = getClientTimezoneOffset(context)
- const emailContact = await UserContact.findOne({
- where: { email },
- withDeleted: true,
- relations: ['user'],
- })
- if (!emailContact || !emailContact.user) {
- throw new LogError('Could not find User', email)
- }
- if (emailContact.deletedAt || emailContact.user.deletedAt) {
- throw new LogError('User was deleted', email)
- }
const moderator = getUser(context)
const contributionToUpdate = await DbContribution.findOne({
where: { id, confirmedAt: IsNull(), deniedAt: IsNull() },
})
+
if (!contributionToUpdate) {
throw new LogError('Contribution not found', id)
}
- if (contributionToUpdate.userId !== emailContact.user.id) {
- throw new LogError('User of the pending contribution and send user does not correspond')
- }
-
if (contributionToUpdate.moderatorId === null) {
throw new LogError('An admin is not allowed to update an user contribution')
}
const creationDateObj = new Date(creationDate)
- let creations = await getUserCreation(emailContact.user.id, clientTimezoneOffset)
+ let creations = await getUserCreation(contributionToUpdate.userId, clientTimezoneOffset)
// TODO: remove this restriction
if (contributionToUpdate.contributionDate.getMonth() === creationDateObj.getMonth()) {
@@ -363,9 +352,9 @@ export class ContributionResolver {
result.amount = amount
result.memo = contributionToUpdate.memo
result.date = contributionToUpdate.contributionDate
- result.creation = await getUserCreation(emailContact.user.id, clientTimezoneOffset)
+
await EVENT_ADMIN_CONTRIBUTION_UPDATE(
- emailContact.user,
+ { id: contributionToUpdate.userId } as DbUser,
moderator,
contributionToUpdate,
amount,
diff --git a/backend/src/graphql/resolver/EmailOptinCodes.test.ts b/backend/src/graphql/resolver/EmailOptinCodes.test.ts
index e9f9bc052..cc8d4e534 100644
--- a/backend/src/graphql/resolver/EmailOptinCodes.test.ts
+++ b/backend/src/graphql/resolver/EmailOptinCodes.test.ts
@@ -6,10 +6,12 @@
import { User as DbUser } from '@entity/User'
import { GraphQLError } from 'graphql'
+
import { testEnvironment, cleanDB } from '@test/helpers'
+
+import CONFIG from '@/config'
import { createUser, setPassword, forgotPassword } from '@/seeds/graphql/mutations'
import { queryOptIn } from '@/seeds/graphql/queries'
-import CONFIG from '@/config'
let mutate: any, query: any, con: any
let testEnv: any
diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts
index e12f92458..53fc23295 100644
--- a/backend/src/graphql/resolver/GdtResolver.ts
+++ b/backend/src/graphql/resolver/GdtResolver.ts
@@ -3,14 +3,14 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
import { Resolver, Query, Args, Ctx, Authorized, Arg, Int, Float } from 'type-graphql'
-import { GdtEntryList } from '@model/GdtEntryList'
-import { Order } from '@enum/Order'
import Paginated from '@arg/Paginated'
+import { Order } from '@enum/Order'
+import { GdtEntryList } from '@model/GdtEntryList'
-import { Context, getUser } from '@/server/context'
-import CONFIG from '@/config'
import { apiGet, apiPost } from '@/apis/HttpRequest'
import { RIGHTS } from '@/auth/RIGHTS'
+import CONFIG from '@/config'
+import { Context, getUser } from '@/server/context'
import LogError from '@/server/LogError'
@Resolver()
diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts
index d5ae9503c..21cf81e97 100644
--- a/backend/src/graphql/resolver/StatisticsResolver.ts
+++ b/backend/src/graphql/resolver/StatisticsResolver.ts
@@ -1,11 +1,10 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
-import { Decimal } from 'decimal.js-light'
-import { Resolver, Query, Authorized, FieldResolver } from 'type-graphql'
import { getConnection } from '@dbTools/typeorm'
-
import { Transaction as DbTransaction } from '@entity/Transaction'
import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+import { Resolver, Query, Authorized, FieldResolver } from 'type-graphql'
import { CommunityStatistics, DynamicStatisticsFields } from '@model/CommunityStatistics'
diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts
index 41188aea1..70238e515 100644
--- a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts
+++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts
@@ -7,21 +7,22 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
+import { Event as DbEvent } from '@entity/Event'
+import { Transaction } from '@entity/Transaction'
import { User } from '@entity/User'
+import { UserContact } from '@entity/UserContact'
import { Decimal } from 'decimal.js-light'
import { GraphQLError } from 'graphql'
-import { Transaction } from '@entity/Transaction'
-import { Event as DbEvent } from '@entity/Event'
-import { UserContact } from '@entity/UserContact'
-import { transactionLinkCode } from './TransactionLinkResolver'
-import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
-import { peterLustig } from '@/seeds/users/peter-lustig'
+
+import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
import { cleanDB, testEnvironment, resetToken, resetEntity } from '@test/helpers'
-import { creationFactory } from '@/seeds/factory/creation'
+import { logger } from '@test/testSetup'
+
+import { EventType } from '@/event/Event'
import { creations } from '@/seeds/creation/index'
-import { userFactory } from '@/seeds/factory/user'
+import { creationFactory } from '@/seeds/factory/creation'
import { transactionLinkFactory } from '@/seeds/factory/transactionLink'
-import { transactionLinks } from '@/seeds/transactionLink/index'
+import { userFactory } from '@/seeds/factory/user'
import {
login,
createContributionLink,
@@ -33,10 +34,11 @@ import {
confirmContribution,
} from '@/seeds/graphql/mutations'
import { listTransactionLinksAdmin } from '@/seeds/graphql/queries'
-import { UnconfirmedContribution } from '@model/UnconfirmedContribution'
+import { transactionLinks } from '@/seeds/transactionLink/index'
+import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
+import { peterLustig } from '@/seeds/users/peter-lustig'
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
-import { logger } from '@test/testSetup'
-import { EventType } from '@/event/Events'
+import { transactionLinkCode } from './TransactionLinkResolver'
// mock semaphore to allow use fake timers
jest.mock('@/util/TRANSACTIONS_LOCK')
diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts
index 3b2f7704a..f69878cac 100644
--- a/backend/src/graphql/resolver/TransactionLinkResolver.ts
+++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts
@@ -1,44 +1,45 @@
import { randomBytes } from 'crypto'
-import { Decimal } from 'decimal.js-light'
import { getConnection } from '@dbTools/typeorm'
-
-import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
-import { User as DbUser } from '@entity/User'
-import { Transaction as DbTransaction } from '@entity/Transaction'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
-
+import { Transaction as DbTransaction } from '@entity/Transaction'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
+import { User as DbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query, Int } from 'type-graphql'
-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 Paginated from '@arg/Paginated'
+import TransactionLinkArgs from '@arg/TransactionLinkArgs'
+import TransactionLinkFilters from '@arg/TransactionLinkFilters'
+import { ContributionCycleType } from '@enum/ContributionCycleType'
+import { ContributionStatus } from '@enum/ContributionStatus'
+import { ContributionType } from '@enum/ContributionType'
+import { TransactionTypeId } from '@enum/TransactionTypeId'
import { ContributionLink } from '@model/ContributionLink'
import { Decay } from '@model/Decay'
import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
-import { ContributionType } from '@enum/ContributionType'
-import { ContributionStatus } from '@enum/ContributionStatus'
-import { TransactionTypeId } from '@enum/TransactionTypeId'
-import { ContributionCycleType } from '@enum/ContributionCycleType'
-import TransactionLinkArgs from '@arg/TransactionLinkArgs'
-import Paginated from '@arg/Paginated'
-import TransactionLinkFilters from '@arg/TransactionLinkFilters'
-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 { User } from '@model/User'
import QueryLinkResult from '@union/QueryLinkResult'
-import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
-import LogError from '@/server/LogError'
+
+import { RIGHTS } from '@/auth/RIGHTS'
import {
EVENT_CONTRIBUTION_LINK_REDEEM,
EVENT_TRANSACTION_LINK_CREATE,
EVENT_TRANSACTION_LINK_DELETE,
EVENT_TRANSACTION_LINK_REDEEM,
} from '@/event/Events'
+import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
+import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
+import { calculateDecay } from '@/util/decay'
+import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
+import { calculateBalance } from '@/util/validate'
+
+import { executeTransaction } from './TransactionResolver'
+import { getUserCreation, validateContribution } from './util/creations'
+import { getLastTransaction } from './util/getLastTransaction'
+import transactionLinkList from './util/transactionLinkList'
// TODO: do not export, test it inside the resolver
export const transactionLinkCode = (date: Date): string => {
diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts
index 0ac1f724a..63606e4ee 100644
--- a/backend/src/graphql/resolver/TransactionResolver.test.ts
+++ b/backend/src/graphql/resolver/TransactionResolver.test.ts
@@ -5,12 +5,14 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { Decimal } from 'decimal.js-light'
+import { Event as DbEvent } from '@entity/Event'
import { Transaction } from '@entity/Transaction'
import { User } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
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/Events'
import { userFactory } from '@/seeds/factory/user'
import {
@@ -23,8 +25,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'
+
+import { findUserByEmail } from './UserResolver'
let mutate: any, query: any, con: any
let testEnv: any
diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts
index 3620dbcef..a78d51e7a 100644
--- a/backend/src/graphql/resolver/TransactionResolver.ts
+++ b/backend/src/graphql/resolver/TransactionResolver.ts
@@ -2,34 +2,24 @@
/* eslint-disable new-cap */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
-import { Decimal } from 'decimal.js-light'
-import { Resolver, Query, Args, Authorized, Ctx, Mutation } from 'type-graphql'
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 { BalanceResolver } from './BalanceResolver'
-import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
-import { findUserByEmail } from './UserResolver'
-import { getLastTransaction } from './util/getLastTransaction'
+import { User as dbUser } from '@entity/User'
+import { Decimal } from 'decimal.js-light'
+import { Resolver, Query, Args, Authorized, Ctx, Mutation } from 'type-graphql'
+
+import Paginated from '@arg/Paginated'
+import TransactionSendArgs from '@arg/TransactionSendArgs'
+import { Order } from '@enum/Order'
+import { TransactionTypeId } from '@enum/TransactionTypeId'
+import { Transaction } from '@model/Transaction'
+import { TransactionList } from '@model/TransactionList'
+import { User } from '@model/User'
import { TransactionRepository } from '@repository/Transaction'
import { TransactionLinkRepository } from '@repository/TransactionLink'
-import { User } from '@model/User'
-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 { backendLogger as logger } from '@/server/logger'
-import { Context, getUser } from '@/server/context'
import { RIGHTS } from '@/auth/RIGHTS'
-import { communityUser } from '@/util/communityUser'
-import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions'
import {
sendTransactionLinkRedeemedEmail,
sendTransactionReceivedEmail,
@@ -37,7 +27,17 @@ import {
import { EVENT_TRANSACTION_RECEIVE, EVENT_TRANSACTION_SEND } from '@/event/Events'
import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK'
+import { Context, getUser } from '@/server/context'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
+import { communityUser } from '@/util/communityUser'
+import { calculateBalance } from '@/util/validate'
+import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions'
+
+import { BalanceResolver } from './BalanceResolver'
+import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
+import { findUserByEmail } from './UserResolver'
+import { getLastTransaction } from './util/getLastTransaction'
export const executeTransaction = async (
amount: Decimal,
diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts
index 735c27950..341a4be56 100644
--- a/backend/src/graphql/resolver/UserResolver.test.ts
+++ b/backend/src/graphql/resolver/UserResolver.test.ts
@@ -6,21 +6,32 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { GraphQLError } from 'graphql'
-import { User } from '@entity/User'
-import { TransactionLink } from '@entity/TransactionLink'
-import { validate as validateUUID, version as versionUUID } from 'uuid'
-import { UserContact } from '@entity/UserContact'
import { Event as DbEvent } from '@entity/Event'
+import { TransactionLink } from '@entity/TransactionLink'
+import { User } from '@entity/User'
+import { UserContact } from '@entity/UserContact'
+import { GraphQLError } from 'graphql'
+import { validate as validateUUID, version as versionUUID } from 'uuid'
+
import { OptInType } from '@enum/OptInType'
-import { UserContactType } from '@enum/UserContactType'
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
-import { objectValuesToArray } from '@/util/utilities'
+import { UserContactType } from '@enum/UserContactType'
+import { ContributionLink } from '@model/ContributionLink'
import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers'
import { logger, i18n as localization } from '@test/testSetup'
-import { printTimeDuration } from '@/util/time'
+
+import CONFIG from '@/config'
+import {
+ sendAccountActivationEmail,
+ sendAccountMultiRegistrationEmail,
+ sendResetPasswordEmail,
+} from '@/emails/sendEmailVariants'
+import { EventType } from '@/event/Events'
+import { SecretKeyCryptographyCreateKey } from '@/password/EncryptorUtils'
+import { encryptPassword } from '@/password/PasswordEncryptor'
+import { contributionLinkFactory } from '@/seeds/factory/contributionLink'
+import { transactionLinkFactory } from '@/seeds/factory/transactionLink'
import { userFactory } from '@/seeds/factory/user'
-import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import {
login,
logout,
@@ -36,22 +47,13 @@ import {
sendActivationEmail,
} from '@/seeds/graphql/mutations'
import { verifyLogin, queryOptIn, searchAdminUsers, searchUsers } from '@/seeds/graphql/queries'
-import CONFIG from '@/config'
-import {
- sendAccountActivationEmail,
- sendAccountMultiRegistrationEmail,
- sendResetPasswordEmail,
-} from '@/emails/sendEmailVariants'
-import { contributionLinkFactory } from '@/seeds/factory/contributionLink'
-import { transactionLinkFactory } from '@/seeds/factory/transactionLink'
-import { ContributionLink } from '@model/ContributionLink'
-import { EventType } from '@/event/Events'
-import { peterLustig } from '@/seeds/users/peter-lustig'
+import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { bobBaumeister } from '@/seeds/users/bob-baumeister'
-import { stephenHawking } from '@/seeds/users/stephen-hawking'
import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
-import { encryptPassword } from '@/password/PasswordEncryptor'
-import { SecretKeyCryptographyCreateKey } from '@/password/EncryptorUtils'
+import { peterLustig } from '@/seeds/users/peter-lustig'
+import { stephenHawking } from '@/seeds/users/stephen-hawking'
+import { printTimeDuration } from '@/util/time'
+import { objectValuesToArray } from '@/util/utilities'
// import { klicktippSignIn } from '@/apis/KlicktippController'
diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts
index 8f72b3bcf..7ec1973fa 100644
--- a/backend/src/graphql/resolver/UserResolver.ts
+++ b/backend/src/graphql/resolver/UserResolver.ts
@@ -2,8 +2,12 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
+import { getConnection, getCustomRepository, IsNull, Not } from '@dbTools/typeorm'
+import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
+import { User as DbUser } from '@entity/User'
+import { UserContact as DbUserContact } from '@entity/UserContact'
import i18n from 'i18n'
-import { v4 as uuidv4 } from 'uuid'
import {
Resolver,
Query,
@@ -15,46 +19,31 @@ import {
Mutation,
Int,
} from 'type-graphql'
-import { getConnection, getCustomRepository, IsNull, Not } from '@dbTools/typeorm'
+import { v4 as uuidv4 } from 'uuid'
-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 { getUserCreations } from './util/creations'
-import { FULL_CREATION_AVAILABLE } from './const/const'
-import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
-import { UserRepository } from '@repository/User'
-
-import { User } from '@model/User'
-import { SearchAdminUsersResult } from '@model/AdminUser'
-import { UserAdmin, SearchUsersResult } from '@model/UserAdmin'
+import CreateUserArgs from '@arg/CreateUserArgs'
+import Paginated from '@arg/Paginated'
+import SearchUsersArgs from '@arg/SearchUsersArgs'
+import UnsecureLoginArgs from '@arg/UnsecureLoginArgs'
+import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs'
import { OptInType } from '@enum/OptInType'
import { Order } from '@enum/Order'
+import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
import { UserContactType } from '@enum/UserContactType'
+import { SearchAdminUsersResult } from '@model/AdminUser'
+import { User } from '@model/User'
+import { UserAdmin, SearchUsersResult } from '@model/UserAdmin'
+import { UserRepository } from '@repository/User'
+import { klicktippSignIn } from '@/apis/KlicktippController'
+import { encode } from '@/auth/JWT'
+import { RIGHTS } from '@/auth/RIGHTS'
+import CONFIG from '@/config'
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'
-import { communityDbUser } from '@/util/communityUser'
-import { encode } from '@/auth/JWT'
-import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddleware'
-import { klicktippSignIn } from '@/apis/KlicktippController'
-import { RIGHTS } from '@/auth/RIGHTS'
-import { hasElopageBuys } from '@/util/hasElopageBuys'
import {
Event,
EventType,
@@ -71,14 +60,23 @@ import {
EVENT_ADMIN_USER_DELETE,
EVENT_ADMIN_USER_UNDELETE,
} from '@/event/Events'
+import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddleware'
import { isValidPassword } from '@/password/EncryptorUtils'
import { encryptPassword, verifyPassword } from '@/password/PasswordEncryptor'
+import { Context, getUser, getClientTimezoneOffset } from '@/server/context'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
+import { communityDbUser } from '@/util/communityUser'
+import { hasElopageBuys } from '@/util/hasElopageBuys'
+import { getTimeDurationObject, printTimeDuration } from '@/util/time'
+
+import { FULL_CREATION_AVAILABLE } from './const/const'
+import { getUserCreations } from './util/creations'
-// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
-const sodium = require('sodium-native')
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
const random = require('random-bigint')
+// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
+const sodium = require('sodium-native')
const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl']
const DEFAULT_LANGUAGE = 'de'
diff --git a/backend/src/graphql/resolver/semaphore.test.ts b/backend/src/graphql/resolver/semaphore.test.ts
index 6b1976021..6963c980e 100644
--- a/backend/src/graphql/resolver/semaphore.test.ts
+++ b/backend/src/graphql/resolver/semaphore.test.ts
@@ -5,12 +5,11 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Decimal } from 'decimal.js-light'
-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 { creationFactory, nMonthsBefore } from '@/seeds/factory/creation'
+import { userFactory } from '@/seeds/factory/user'
import {
confirmContribution,
createContribution,
@@ -20,6 +19,9 @@ import {
createContributionLink,
sendCoins,
} from '@/seeds/graphql/mutations'
+import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
+import { bobBaumeister } from '@/seeds/users/bob-baumeister'
+import { peterLustig } from '@/seeds/users/peter-lustig'
let mutate: any, con: any
let testEnv: any
diff --git a/backend/src/graphql/resolver/util/creations.test.ts b/backend/src/graphql/resolver/util/creations.test.ts
index 7461401c8..1e3460b30 100644
--- a/backend/src/graphql/resolver/util/creations.test.ts
+++ b/backend/src/graphql/resolver/util/creations.test.ts
@@ -4,14 +4,17 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { User } from '@entity/User'
import { Contribution } from '@entity/Contribution'
-import { getUserCreation } from './creations'
+import { User } from '@entity/User'
+
import { testEnvironment, cleanDB, contributionDateFormatter } from '@test/helpers'
-import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
-import { peterLustig } from '@/seeds/users/peter-lustig'
+
import { userFactory } from '@/seeds/factory/user'
import { login, createContribution, adminCreateContribution } from '@/seeds/graphql/mutations'
+import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
+import { peterLustig } from '@/seeds/users/peter-lustig'
+
+import { getUserCreation } from './creations'
let mutate: any, con: any
let testEnv: any
diff --git a/backend/src/graphql/resolver/util/creations.ts b/backend/src/graphql/resolver/util/creations.ts
index 6ebeae8b9..dbf0650a6 100644
--- a/backend/src/graphql/resolver/util/creations.ts
+++ b/backend/src/graphql/resolver/util/creations.ts
@@ -3,10 +3,12 @@
import { getConnection } from '@dbTools/typeorm'
import { Contribution } from '@entity/Contribution'
import { Decimal } from 'decimal.js-light'
-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 { FULL_CREATION_AVAILABLE, MAX_CREATION_AMOUNT } from '@/graphql/resolver/const/const'
import LogError from '@/server/LogError'
+import { backendLogger as logger } from '@/server/logger'
interface CreationMap {
id: number
diff --git a/backend/src/graphql/resolver/util/findContributions.ts b/backend/src/graphql/resolver/util/findContributions.ts
index a40279e9c..a08631e2c 100644
--- a/backend/src/graphql/resolver/util/findContributions.ts
+++ b/backend/src/graphql/resolver/util/findContributions.ts
@@ -1,5 +1,6 @@
-import { Contribution as DbContribution } from '@entity/Contribution'
import { In } from '@dbTools/typeorm'
+import { Contribution as DbContribution } from '@entity/Contribution'
+
import { ContributionStatus } from '@enum/ContributionStatus'
import { Order } from '@enum/Order'
diff --git a/backend/src/graphql/resolver/util/transactionLinkList.ts b/backend/src/graphql/resolver/util/transactionLinkList.ts
index 2d151b94a..544d35114 100644
--- a/backend/src/graphql/resolver/util/transactionLinkList.ts
+++ b/backend/src/graphql/resolver/util/transactionLinkList.ts
@@ -1,10 +1,12 @@
import { MoreThan } from '@dbTools/typeorm'
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { User as DbUser } from '@entity/User'
-import { Order } from '@enum/Order'
+
import Paginated from '@arg/Paginated'
import TransactionLinkFilters from '@arg/TransactionLinkFilters'
+import { Order } from '@enum/Order'
import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
+
import { User } from '@/graphql/model/User'
export default async function transactionLinkList(
diff --git a/backend/src/graphql/scalar/Decimal.ts b/backend/src/graphql/scalar/Decimal.ts
index 586481a6d..e46446cee 100644
--- a/backend/src/graphql/scalar/Decimal.ts
+++ b/backend/src/graphql/scalar/Decimal.ts
@@ -1,5 +1,5 @@
-import { GraphQLScalarType, Kind } from 'graphql'
import { Decimal } from 'decimal.js-light'
+import { GraphQLScalarType, Kind } from 'graphql'
const DecimalType = new GraphQLScalarType({
name: 'Decimal',
diff --git a/backend/src/graphql/schema.ts b/backend/src/graphql/schema.ts
index 194a24c00..c6097f027 100644
--- a/backend/src/graphql/schema.ts
+++ b/backend/src/graphql/schema.ts
@@ -1,8 +1,9 @@
import path from 'path'
+
+import { Decimal } from 'decimal.js-light'
import { GraphQLSchema } from 'graphql'
import { buildSchema } from 'type-graphql'
-import { Decimal } from 'decimal.js-light'
import isAuthorized from './directive/isAuthorized'
import DecimalScalar from './scalar/Decimal'
diff --git a/backend/src/graphql/union/QueryLinkResult.ts b/backend/src/graphql/union/QueryLinkResult.ts
index 9a35fbc71..390175d1d 100644
--- a/backend/src/graphql/union/QueryLinkResult.ts
+++ b/backend/src/graphql/union/QueryLinkResult.ts
@@ -1,6 +1,7 @@
import { createUnionType } from 'type-graphql'
-import { TransactionLink } from '@model/TransactionLink'
+
import { ContributionLink } from '@model/ContributionLink'
+import { TransactionLink } from '@model/TransactionLink'
export default createUnionType({
name: 'QueryLinkResult', // the name of the GraphQL union
diff --git a/backend/src/index.ts b/backend/src/index.ts
index cd6d002cc..353b77616 100644
--- a/backend/src/index.ts
+++ b/backend/src/index.ts
@@ -1,10 +1,9 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
-import createServer from './server/createServer'
-
// config
import CONFIG from './config'
import { startValidateCommunities } from './federation/validateCommunities'
+import createServer from './server/createServer'
async function main() {
const { app } = await createServer()
diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts
index 0469b4ccc..481094752 100644
--- a/backend/src/middleware/klicktippMiddleware.ts
+++ b/backend/src/middleware/klicktippMiddleware.ts
@@ -3,8 +3,10 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
import { MiddlewareFn } from 'type-graphql'
-import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController'
+
import { KlickTipp } from '@model/KlickTipp'
+
+import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController'
import CONFIG from '@/config'
import { klickTippLogger as logger } from '@/server/logger'
diff --git a/backend/src/password/EncryptorUtils.ts b/backend/src/password/EncryptorUtils.ts
index b4531b3bb..eb25edda6 100644
--- a/backend/src/password/EncryptorUtils.ts
+++ b/backend/src/password/EncryptorUtils.ts
@@ -2,10 +2,12 @@
/* 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')
diff --git a/backend/src/password/PasswordEncryptor.ts b/backend/src/password/PasswordEncryptor.ts
index 1735106c1..1c7457a40 100644
--- a/backend/src/password/PasswordEncryptor.ts
+++ b/backend/src/password/PasswordEncryptor.ts
@@ -1,4 +1,5 @@
import { User } from '@entity/User'
+
// import { logger } from '@test/testSetup' getting error "jest is not defined"
import { getUserCryptographicSalt, SecretKeyCryptographyCreateKey } from './EncryptorUtils'
diff --git a/backend/src/seeds/creation/index.ts b/backend/src/seeds/creation/index.ts
index 757407438..3f2a545a4 100644
--- a/backend/src/seeds/creation/index.ts
+++ b/backend/src/seeds/creation/index.ts
@@ -1,6 +1,7 @@
-import { CreationInterface } from './CreationInterface'
import { nMonthsBefore } from '@/seeds/factory/creation'
+import { CreationInterface } from './CreationInterface'
+
const bobsSendings = [
{
amount: 10,
diff --git a/backend/src/seeds/factory/contributionLink.ts b/backend/src/seeds/factory/contributionLink.ts
index 5925cdcfe..51e970a5c 100644
--- a/backend/src/seeds/factory/contributionLink.ts
+++ b/backend/src/seeds/factory/contributionLink.ts
@@ -2,9 +2,11 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
import { ApolloServerTestClient } from 'apollo-server-testing'
-import { login, createContributionLink } from '@/seeds/graphql/mutations'
+
import { ContributionLink } from '@model/ContributionLink'
+
import { ContributionLinkInterface } from '@/seeds/contributionLink/ContributionLinkInterface'
+import { login, createContributionLink } from '@/seeds/graphql/mutations'
export const contributionLinkFactory = async (
client: ApolloServerTestClient,
diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts
index ba46f4c09..6a3aaa3e7 100644
--- a/backend/src/seeds/factory/creation.ts
+++ b/backend/src/seeds/factory/creation.ts
@@ -5,12 +5,13 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { ApolloServerTestClient } from 'apollo-server-testing'
-import { Transaction } from '@entity/Transaction'
import { Contribution } from '@entity/Contribution'
+import { Transaction } from '@entity/Transaction'
+import { ApolloServerTestClient } from 'apollo-server-testing'
+
+import { findUserByEmail } from '@/graphql/resolver/UserResolver'
import { CreationInterface } from '@/seeds/creation/CreationInterface'
import { login, createContribution, confirmContribution } from '@/seeds/graphql/mutations'
-import { findUserByEmail } from '@/graphql/resolver/UserResolver'
// import CONFIG from '@/config/index'
export const nMonthsBefore = (date: Date, months = 1): string => {
diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts
index c6ed68839..cab478c4b 100644
--- a/backend/src/seeds/factory/transactionLink.ts
+++ b/backend/src/seeds/factory/transactionLink.ts
@@ -1,10 +1,11 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/unbound-method */
-import { ApolloServerTestClient } from 'apollo-server-testing'
import { TransactionLink } from '@entity/TransactionLink'
+import { ApolloServerTestClient } from 'apollo-server-testing'
+
+import { transactionLinkExpireDate } from '@/graphql/resolver/TransactionLinkResolver'
import { login, createTransactionLink } from '@/seeds/graphql/mutations'
import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface'
-import { transactionLinkExpireDate } from '@/graphql/resolver/TransactionLinkResolver'
export const transactionLinkFactory = async (
client: ApolloServerTestClient,
diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts
index c82c56648..13a274911 100644
--- a/backend/src/seeds/factory/user.ts
+++ b/backend/src/seeds/factory/user.ts
@@ -2,6 +2,7 @@
/* eslint-disable @typescript-eslint/unbound-method */
import { User } from '@entity/User'
import { ApolloServerTestClient } from 'apollo-server-testing'
+
import { createUser, setPassword } from '@/seeds/graphql/mutations'
import { UserInterface } from '@/seeds/users/UserInterface'
diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts
index 1c2473608..7e141e5d6 100644
--- a/backend/src/seeds/graphql/mutations.ts
+++ b/backend/src/seeds/graphql/mutations.ts
@@ -133,18 +133,11 @@ export const unDeleteUser = gql`
`
export const adminUpdateContribution = gql`
- mutation ($id: Int!, $email: String!, $amount: Decimal!, $memo: String!, $creationDate: String!) {
- adminUpdateContribution(
- id: $id
- email: $email
- amount: $amount
- memo: $memo
- creationDate: $creationDate
- ) {
+ mutation ($id: Int!, $amount: Decimal!, $memo: String!, $creationDate: String!) {
+ adminUpdateContribution(id: $id, amount: $amount, memo: $memo, creationDate: $creationDate) {
amount
date
memo
- creation
}
}
`
diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts
index 19f936d16..d1960eea9 100644
--- a/backend/src/seeds/index.ts
+++ b/backend/src/seeds/index.ts
@@ -5,21 +5,22 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
+import { entities } from '@entity/index'
import { createTestClient } from 'apollo-server-testing'
import { name, internet, datatype } from 'faker'
-import { entities } from '@entity/index'
-import { users } from './users/index'
-import { creations } from './creation/index'
-import { transactionLinks } from './transactionLink/index'
-import { contributionLinks } from './contributionLink/index'
-import { userFactory } from './factory/user'
-import { creationFactory } from './factory/creation'
-import { transactionLinkFactory } from './factory/transactionLink'
-import { contributionLinkFactory } from './factory/contributionLink'
+import CONFIG from '@/config'
import createServer from '@/server/createServer'
import { backendLogger as logger } from '@/server/logger'
-import CONFIG from '@/config'
+
+import { contributionLinks } from './contributionLink/index'
+import { creations } from './creation/index'
+import { contributionLinkFactory } from './factory/contributionLink'
+import { creationFactory } from './factory/creation'
+import { transactionLinkFactory } from './factory/transactionLink'
+import { userFactory } from './factory/user'
+import { transactionLinks } from './transactionLink/index'
+import { users } from './users/index'
CONFIG.EMAIL = false
diff --git a/backend/src/seeds/users/index.ts b/backend/src/seeds/users/index.ts
index 7a6dbe519..beb6c6f25 100644
--- a/backend/src/seeds/users/index.ts
+++ b/backend/src/seeds/users/index.ts
@@ -1,9 +1,9 @@
-import { peterLustig } from './peter-lustig'
import { bibiBloxberg } from './bibi-bloxberg'
import { bobBaumeister } from './bob-baumeister'
+import { garrickOllivander } from './garrick-ollivander'
+import { peterLustig } from './peter-lustig'
import { raeuberHotzenplotz } from './raeuber-hotzenplotz'
import { stephenHawking } from './stephen-hawking'
-import { garrickOllivander } from './garrick-ollivander'
export const users = [
peterLustig,
diff --git a/backend/src/server/LogError.test.ts b/backend/src/server/LogError.test.ts
index 318a477ef..5aa1cae21 100644
--- a/backend/src/server/LogError.test.ts
+++ b/backend/src/server/LogError.test.ts
@@ -1,8 +1,9 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/unbound-method */
-import LogError from './LogError'
import { logger } from '@test/testSetup'
+import LogError from './LogError'
+
describe('LogError', () => {
it('logs an Error when created', () => {
/* eslint-disable-next-line no-new */
diff --git a/backend/src/server/context.ts b/backend/src/server/context.ts
index 570865587..f0e63daea 100644
--- a/backend/src/server/context.ts
+++ b/backend/src/server/context.ts
@@ -1,10 +1,12 @@
-import { User as dbUser } from '@entity/User'
import { Transaction as dbTransaction } from '@entity/Transaction'
-import { Decimal } from 'decimal.js-light'
+import { User as dbUser } from '@entity/User'
import { ExpressContext } from 'apollo-server-express'
-import LogError from './LogError'
+import { Decimal } from 'decimal.js-light'
+
import { Role } from '@/auth/Role'
+import LogError from './LogError'
+
export interface Context {
token: string | null
setHeaders: { key: string; value: string }[]
diff --git a/backend/src/server/createServer.ts b/backend/src/server/createServer.ts
index f23e90b56..8a94ef3eb 100644
--- a/backend/src/server/createServer.ts
+++ b/backend/src/server/createServer.ts
@@ -1,21 +1,23 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/unbound-method */
+import { Connection } from '@dbTools/typeorm'
import { ApolloServer } from 'apollo-server-express'
import express, { Express, json, urlencoded } from 'express'
-import { Connection } from '@dbTools/typeorm'
import { Logger } from 'log4js'
-import cors from './cors'
-import serverContext from './context'
-import plugins from './plugins'
-import { apolloLogger } from './logger'
-import { i18n } from './localization'
-import connection from '@/typeorm/connection'
-import { checkDBVersion } from '@/typeorm/DBVersion'
+
import CONFIG from '@/config'
import schema from '@/graphql/schema'
+import connection from '@/typeorm/connection'
+import { checkDBVersion } from '@/typeorm/DBVersion'
import { elopageWebhook } from '@/webhook/elopage'
+import serverContext from './context'
+import cors from './cors'
+import { i18n } from './localization'
+import { apolloLogger } from './logger'
+import plugins from './plugins'
+
// TODO implement
// import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity";
diff --git a/backend/src/server/localization.ts b/backend/src/server/localization.ts
index 22616fcf0..59ba4cfce 100644
--- a/backend/src/server/localization.ts
+++ b/backend/src/server/localization.ts
@@ -1,5 +1,7 @@
import path from 'path'
+
import i18n from 'i18n'
+
import { backendLogger } from './logger'
i18n.configure({
diff --git a/backend/src/server/logger.ts b/backend/src/server/logger.ts
index 0887340d4..89f292ab7 100644
--- a/backend/src/server/logger.ts
+++ b/backend/src/server/logger.ts
@@ -1,7 +1,9 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { readFileSync } from 'fs'
+
import { configure, getLogger } from 'log4js'
+
import CONFIG from '@/config'
const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8'))
diff --git a/backend/src/typeorm/DBVersion.ts b/backend/src/typeorm/DBVersion.ts
index cb53c49f1..c4c8d6c78 100644
--- a/backend/src/typeorm/DBVersion.ts
+++ b/backend/src/typeorm/DBVersion.ts
@@ -1,4 +1,5 @@
import { Migration } from '@entity/Migration'
+
import { backendLogger as logger } from '@/server/logger'
const getDBVersion = async (): Promise => {
diff --git a/backend/src/typeorm/connection.ts b/backend/src/typeorm/connection.ts
index 54b951a79..a3a20450b 100644
--- a/backend/src/typeorm/connection.ts
+++ b/backend/src/typeorm/connection.ts
@@ -2,6 +2,7 @@
// We cannot use our connection here, but must use the external typeorm installation
import { Connection, createConnection, FileLogger } from '@dbTools/typeorm'
import { entities } from '@entity/index'
+
import CONFIG from '@/config'
const connection = async (): Promise => {
diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts
index 58e9ca30b..61e87b3c8 100644
--- a/backend/src/typeorm/repository/Transaction.ts
+++ b/backend/src/typeorm/repository/Transaction.ts
@@ -1,5 +1,6 @@
import { EntityRepository, Repository } from '@dbTools/typeorm'
import { Transaction } from '@entity/Transaction'
+
import { Order } from '@enum/Order'
import { TransactionTypeId } from '@enum/TransactionTypeId'
diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts
index 4928b0cc8..71e43329b 100644
--- a/backend/src/typeorm/repository/User.ts
+++ b/backend/src/typeorm/repository/User.ts
@@ -1,5 +1,6 @@
import { Brackets, EntityRepository, IsNull, Not, Repository } from '@dbTools/typeorm'
import { User as DbUser } from '@entity/User'
+
import SearchUsersFilters from '@/graphql/arg/SearchUsersFilters'
@EntityRepository(DbUser)
diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts
index dfa477da9..f96c33470 100644
--- a/backend/src/util/communityUser.ts
+++ b/backend/src/util/communityUser.ts
@@ -3,9 +3,11 @@
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,
diff --git a/backend/src/util/decay.test.ts b/backend/src/util/decay.test.ts
index b33d18d42..1d4ebab3b 100644
--- a/backend/src/util/decay.test.ts
+++ b/backend/src/util/decay.test.ts
@@ -1,4 +1,5 @@
import { Decimal } from 'decimal.js-light'
+
import { decayFormula, calculateDecay } from './decay'
describe('utils/decay', () => {
diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts
index d35eb83a4..77157e203 100644
--- a/backend/src/util/decay.ts
+++ b/backend/src/util/decay.ts
@@ -1,6 +1,8 @@
import { Decimal } from 'decimal.js-light'
-import CONFIG from '@/config'
+
import { Decay } from '@model/Decay'
+
+import CONFIG from '@/config'
import LogError from '@/server/LogError'
// TODO: externalize all those definitions and functions into an external decay library
diff --git a/backend/src/util/klicktipp.ts b/backend/src/util/klicktipp.ts
index 6444d20f6..4d90be134 100644
--- a/backend/src/util/klicktipp.ts
+++ b/backend/src/util/klicktipp.ts
@@ -1,7 +1,8 @@
import { User } from '@entity/User'
-import connection from '@/typeorm/connection'
+
import { getKlickTippUser } from '@/apis/KlicktippController'
import LogError from '@/server/LogError'
+import connection from '@/typeorm/connection'
export async function retrieveNotRegisteredEmails(): Promise {
const con = await connection()
diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts
index ec28dfa13..22a6ee5db 100644
--- a/backend/src/util/validate.ts
+++ b/backend/src/util/validate.ts
@@ -1,10 +1,13 @@
-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 { Decimal } from 'decimal.js-light'
+
import { Decay } from '@model/Decay'
+import { TransactionLinkRepository } from '@repository/TransactionLink'
+
+import { getLastTransaction } from '@/graphql/resolver/util/getLastTransaction'
+
+import { calculateDecay } from './decay'
function isStringBoolean(value: string): boolean {
const lowerValue = value.toLowerCase()
diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts
index 7810ad871..68a37746b 100644
--- a/backend/src/util/virtualTransactions.ts
+++ b/backend/src/util/virtualTransactions.ts
@@ -2,11 +2,13 @@
import { SaveOptions, RemoveOptions } from '@dbTools/typeorm'
import { Transaction as dbTransaction } from '@entity/Transaction'
import { Decimal } from 'decimal.js-light'
-import { calculateDecay } from './decay'
-import { Transaction } from '@model/Transaction'
+
import { TransactionTypeId } from '@enum/TransactionTypeId'
+import { Transaction } from '@model/Transaction'
import { User } from '@model/User'
+import { calculateDecay } from './decay'
+
const defaultModelFunctions = {
hasId: function (): boolean {
throw new Error('Function not implemented.')
diff --git a/backend/src/webhook/elopage.ts b/backend/src/webhook/elopage.ts
index 6f3e3cbdb..404f2696a 100644
--- a/backend/src/webhook/elopage.ts
+++ b/backend/src/webhook/elopage.ts
@@ -33,6 +33,7 @@
import { LoginElopageBuys } from '@entity/LoginElopageBuys'
import { UserContact as dbUserContact } from '@entity/UserContact'
+
import { UserResolver } from '@/graphql/resolver/UserResolver'
export const elopageWebhook = async (req: any, res: any): Promise => {
diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts
index ad6d2c4e3..f440adc02 100644
--- a/backend/test/helpers.ts
+++ b/backend/test/helpers.ts
@@ -6,12 +6,14 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { createTestClient } from 'apollo-server-testing'
import { initialize } from '@dbTools/helpers'
import { entities } from '@entity/index'
-import { i18n, logger } from './testSetup'
+import { createTestClient } from 'apollo-server-testing'
+
import createServer from '@/server/createServer'
+import { i18n, logger } from './testSetup'
+
export const headerPushMock = jest.fn((t) => {
context.token = t.value
})
diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts
index b13e3cf26..4e8a67e3f 100644
--- a/backend/test/testSetup.ts
+++ b/backend/test/testSetup.ts
@@ -1,8 +1,8 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import CONFIG from '@/config'
-import { backendLogger as logger } from '@/server/logger'
import { i18n } from '@/server/localization'
+import { backendLogger as logger } from '@/server/logger'
CONFIG.EMAIL = true
CONFIG.EMAIL_TEST_MODUS = false
diff --git a/deployment/bare_metal/start.sh b/deployment/bare_metal/start.sh
index 6c3c07766..b30d90f19 100755
--- a/deployment/bare_metal/start.sh
+++ b/deployment/bare_metal/start.sh
@@ -118,6 +118,18 @@ case "$NGINX_SSL" in
esac
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/update-page.conf
+# Clean tmp folder - remove yarn files
+find /tmp -name "yarn--*" -exec rm -r {} \;
+
+# Remove node_modules folders
+# we had problems with corrupted node_modules folder
+rm -Rf $PROJECT_ROOT/database/node_modules
+rm -Rf $PROJECT_ROOT/backend/node_modules
+rm -Rf $PROJECT_ROOT/frontend/node_modules
+rm -Rf $PROJECT_ROOT/admin/node_modules
+rm -Rf $PROJECT_ROOT/dht-node/node_modules
+rm -Rf $PROJECT_ROOT/federation/node_modules
+
# Regenerate .env files
cp -f $PROJECT_ROOT/database/.env $PROJECT_ROOT/database/.env.bak
cp -f $PROJECT_ROOT/backend/.env $PROJECT_ROOT/backend/.env.bak
diff --git a/federation/.env.template b/federation/.env.template
index af6e8f627..5713a7f3f 100644
--- a/federation/.env.template
+++ b/federation/.env.template
@@ -5,12 +5,11 @@ LOG_LEVEL=$LOG_LEVEL
GRAPHIQL=false
# Database
-DB_HOST=$DB_HOST
-DB_PORT=$DB_PORT
-DB_DATABASE=$DB_DATABASE
+DB_HOST=localhost
+DB_PORT=3306
DB_USER=$DB_USER
DB_PASSWORD=$DB_PASSWORD
+DB_DATABASE=gradido_community
# Federation
FEDERATION_COMMUNITY_URL=$FEDERATION_COMMUNITY_URL
-
diff --git a/frontend/src/components/Contributions/ContributionListItem.vue b/frontend/src/components/Contributions/ContributionListItem.vue
index 56546d183..27e8459bd 100644
--- a/frontend/src/components/Contributions/ContributionListItem.vue
+++ b/frontend/src/components/Contributions/ContributionListItem.vue
@@ -47,7 +47,7 @@
{{ amount | GDD }}
-
+
@@ -58,7 +58,7 @@
>
@@ -69,7 +69,7 @@
{{ $t('edit') }}
-
-
+
{{ $t('moderatorChat') }}
@@ -180,6 +179,11 @@ export default {
required: false,
default: false,
},
+ moderatorId: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
},
data() {
return {
diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js
index 7193eded0..1a37d082b 100644
--- a/frontend/src/graphql/queries.js
+++ b/frontend/src/graphql/queries.js
@@ -187,6 +187,7 @@ export const listContributions = gql`
messagesCount
deniedAt
deniedBy
+ moderatorId
}
}
}
@@ -236,7 +237,7 @@ export const searchAdminUsers = gql`
`
export const listContributionMessages = gql`
- query($contributionId: Float!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
+ query($contributionId: Int!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
listContributionMessages(
contributionId: $contributionId
pageSize: $pageSize