From 2ac133c41abee6e1c670b20a48110623139b5b23 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 10 Feb 2023 02:06:39 +0100 Subject: [PATCH 01/18] rework - initial work --- backend/src/event/Event.ts | 765 ++++++------------ backend/src/event/EventProtocolEmitter.ts | 17 - .../graphql/resolver/ContributionResolver.ts | 81 +- .../graphql/resolver/TransactionResolver.ts | 27 +- backend/src/graphql/resolver/UserResolver.ts | 60 +- 5 files changed, 325 insertions(+), 625 deletions(-) delete mode 100644 backend/src/event/EventProtocolEmitter.ts diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 77e86ad46..2545bdc63 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -1,509 +1,278 @@ -import decimal from 'decimal.js-light' +import { EventProtocol as dbEvent } from '@entity/EventProtocol' +import Decimal from 'decimal.js-light' import { EventProtocolType } from './EventProtocolType' -export class EventBasic { - type: string - createdAt: Date -} -export class EventBasicUserId extends EventBasic { - userId: number -} - -export class EventBasicTx extends EventBasicUserId { - transactionId: number - amount: decimal -} - -export class EventBasicTxX extends EventBasicTx { - xUserId: number - xCommunityId: number -} - -export class EventBasicCt extends EventBasicUserId { - contributionId: number - amount: decimal -} - -export class EventBasicCtX extends EventBasicCt { - xUserId: number - xCommunityId: number -} - -export class EventBasicRedeem extends EventBasicUserId { - transactionId?: number - contributionId?: number -} - -export class EventBasicCtMsg extends EventBasicCt { - messageId: number -} - -export class EventVisitGradido extends EventBasic {} -export class EventRegister extends EventBasicUserId {} -export class EventRedeemRegister extends EventBasicRedeem {} -export class EventVerifyRedeem extends EventBasicRedeem {} -export class EventInactiveAccount extends EventBasicUserId {} -export class EventSendConfirmationEmail extends EventBasicUserId {} -export class EventSendAccountMultiRegistrationEmail extends EventBasicUserId {} -export class EventSendForgotPasswordEmail extends EventBasicUserId {} -export class EventSendTransactionSendEmail extends EventBasicTxX {} -export class EventSendTransactionReceiveEmail extends EventBasicTxX {} -export class EventSendTransactionLinkRedeemEmail extends EventBasicTxX {} -export class EventSendAddedContributionEmail extends EventBasicCt {} -export class EventSendContributionConfirmEmail extends EventBasicCt {} -export class EventConfirmationEmail extends EventBasicUserId {} -export class EventRegisterEmailKlicktipp extends EventBasicUserId {} -export class EventLogin extends EventBasicUserId {} -export class EventLogout extends EventBasicUserId {} -export class EventRedeemLogin extends EventBasicRedeem {} -export class EventActivateAccount extends EventBasicUserId {} -export class EventPasswordChange extends EventBasicUserId {} -export class EventTransactionSend extends EventBasicTxX {} -export class EventTransactionSendRedeem extends EventBasicTxX {} -export class EventTransactionRepeateRedeem extends EventBasicTxX {} -export class EventTransactionCreation extends EventBasicTx {} -export class EventTransactionReceive extends EventBasicTxX {} -export class EventTransactionReceiveRedeem extends EventBasicTxX {} -export class EventContributionCreate extends EventBasicCt {} -export class EventAdminContributionCreate extends EventBasicCt {} -export class EventAdminContributionDelete extends EventBasicCt {} -export class EventAdminContributionDeny extends EventBasicCt {} -export class EventAdminContributionUpdate extends EventBasicCt {} -export class EventUserCreateContributionMessage extends EventBasicCtMsg {} -export class EventAdminCreateContributionMessage extends EventBasicCtMsg {} -export class EventContributionDelete extends EventBasicCt {} -export class EventContributionUpdate extends EventBasicCt {} -export class EventContributionConfirm extends EventBasicCtX {} -export class EventContributionDeny extends EventBasicCtX {} -export class EventContributionLinkDefine extends EventBasicCt {} -export class EventContributionLinkActivateRedeem extends EventBasicCt {} -export class EventDeleteUser extends EventBasicUserId {} -export class EventUndeleteUser extends EventBasicUserId {} -export class EventChangeUserRole extends EventBasicUserId {} -export class EventAdminUpdateContribution extends EventBasicCt {} -export class EventAdminDeleteContribution extends EventBasicCt {} -export class EventCreateContributionLink extends EventBasicCt {} -export class EventDeleteContributionLink extends EventBasicCt {} -export class EventUpdateContributionLink extends EventBasicCt {} - -export class Event { - public setEventBasic(): Event { - this.type = EventProtocolType.BASIC - this.createdAt = new Date() - - return this - } - - public setEventVisitGradido(): Event { - this.setEventBasic() - this.type = EventProtocolType.VISIT_GRADIDO - - return this - } - - public setEventRegister(ev: EventRegister): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.REGISTER - - return this - } - - public setEventRedeemRegister(ev: EventRedeemRegister): Event { - this.setByBasicRedeem(ev.userId, ev.transactionId, ev.contributionId) - this.type = EventProtocolType.REDEEM_REGISTER - - return this - } - - public setEventVerifyRedeem(ev: EventVerifyRedeem): Event { - this.setByBasicRedeem(ev.userId, ev.transactionId, ev.contributionId) - this.type = EventProtocolType.VERIFY_REDEEM - - return this - } - - public setEventInactiveAccount(ev: EventInactiveAccount): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.INACTIVE_ACCOUNT - - return this - } - - public setEventSendConfirmationEmail(ev: EventSendConfirmationEmail): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.SEND_CONFIRMATION_EMAIL - - return this - } - - public setEventSendAccountMultiRegistrationEmail( - ev: EventSendAccountMultiRegistrationEmail, - ): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL - - return this - } - - public setEventSendForgotPasswordEmail(ev: EventSendForgotPasswordEmail): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.SEND_FORGOT_PASSWORD_EMAIL - - return this - } - - public setEventSendTransactionSendEmail(ev: EventSendTransactionSendEmail): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.SEND_TRANSACTION_SEND_EMAIL - - return this - } - - public setEventSendTransactionReceiveEmail(ev: EventSendTransactionReceiveEmail): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.SEND_TRANSACTION_RECEIVE_EMAIL - - return this - } - - public setEventSendTransactionLinkRedeemEmail(ev: EventSendTransactionLinkRedeemEmail): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.SEND_TRANSACTION_LINK_REDEEM_EMAIL - - return this - } - - public setEventSendAddedContributionEmail(ev: EventSendAddedContributionEmail): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.SEND_ADDED_CONTRIBUTION_EMAIL - - return this - } - - public setEventSendContributionConfirmEmail(ev: EventSendContributionConfirmEmail): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.SEND_CONTRIBUTION_CONFIRM_EMAIL - - return this - } - - public setEventConfirmationEmail(ev: EventConfirmationEmail): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.CONFIRM_EMAIL - - return this - } - - public setEventRegisterEmailKlicktipp(ev: EventRegisterEmailKlicktipp): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.REGISTER_EMAIL_KLICKTIPP - - return this - } - - public setEventLogin(ev: EventLogin): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.LOGIN - - return this - } - - public setEventLogout(ev: EventLogout): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.LOGOUT - - return this - } - - public setEventRedeemLogin(ev: EventRedeemLogin): Event { - this.setByBasicRedeem(ev.userId, ev.transactionId, ev.contributionId) - this.type = EventProtocolType.REDEEM_LOGIN - - return this - } - - public setEventActivateAccount(ev: EventActivateAccount): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.ACTIVATE_ACCOUNT - - return this - } - - public setEventPasswordChange(ev: EventPasswordChange): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.PASSWORD_CHANGE - - return this - } - - public setEventTransactionSend(ev: EventTransactionSend): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.TRANSACTION_SEND - - return this - } - - public setEventTransactionSendRedeem(ev: EventTransactionSendRedeem): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.TRANSACTION_SEND_REDEEM - - return this - } - - public setEventTransactionRepeateRedeem(ev: EventTransactionRepeateRedeem): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.TRANSACTION_REPEATE_REDEEM - - return this - } - - public setEventTransactionCreation(ev: EventTransactionCreation): Event { - this.setByBasicTx(ev.userId, ev.transactionId, ev.amount) - this.type = EventProtocolType.TRANSACTION_CREATION - - return this - } - - public setEventTransactionReceive(ev: EventTransactionReceive): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.TRANSACTION_RECEIVE - - return this - } - - public setEventTransactionReceiveRedeem(ev: EventTransactionReceiveRedeem): Event { - this.setByBasicTxX(ev.userId, ev.transactionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.TRANSACTION_RECEIVE_REDEEM - - return this - } - - public setEventContributionCreate(ev: EventContributionCreate): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CONTRIBUTION_CREATE - - return this - } - - public setEventAdminContributionCreate(ev: EventAdminContributionCreate): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_CONTRIBUTION_CREATE - - return this - } - - public setEventAdminContributionDelete(ev: EventAdminContributionDelete): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_CONTRIBUTION_DELETE - - return this - } - - public setEventAdminContributionDeny(ev: EventAdminContributionDeny): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_CONTRIBUTION_DENY - - return this - } - - public setEventAdminContributionUpdate(ev: EventAdminContributionUpdate): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_CONTRIBUTION_UPDATE - - return this - } - - public setEventUserCreateContributionMessage(ev: EventUserCreateContributionMessage): Event { - this.setByBasicCtMsg(ev.userId, ev.contributionId, ev.amount, ev.messageId) - this.type = EventProtocolType.USER_CREATE_CONTRIBUTION_MESSAGE - - return this - } - - public setEventAdminCreateContributionMessage(ev: EventAdminCreateContributionMessage): Event { - this.setByBasicCtMsg(ev.userId, ev.contributionId, ev.amount, ev.messageId) - this.type = EventProtocolType.ADMIN_CREATE_CONTRIBUTION_MESSAGE - - return this - } - - public setEventContributionDelete(ev: EventContributionDelete): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CONTRIBUTION_DELETE - - return this - } - - public setEventContributionUpdate(ev: EventContributionUpdate): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CONTRIBUTION_UPDATE - - return this - } - - public setEventContributionConfirm(ev: EventContributionConfirm): Event { - this.setByBasicCtX(ev.userId, ev.contributionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.CONTRIBUTION_CONFIRM - - return this - } - - public setEventContributionDeny(ev: EventContributionDeny): Event { - this.setByBasicCtX(ev.userId, ev.contributionId, ev.amount, ev.xUserId, ev.xCommunityId) - this.type = EventProtocolType.CONTRIBUTION_DENY - - return this - } - - public setEventContributionLinkDefine(ev: EventContributionLinkDefine): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CONTRIBUTION_LINK_DEFINE - - return this - } - - public setEventContributionLinkActivateRedeem(ev: EventContributionLinkActivateRedeem): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CONTRIBUTION_LINK_ACTIVATE_REDEEM - - return this - } - - public setEventDeleteUser(ev: EventDeleteUser): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.DELETE_USER - - return this - } - - public setEventUndeleteUser(ev: EventUndeleteUser): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.UNDELETE_USER - - return this - } - - public setEventChangeUserRole(ev: EventChangeUserRole): Event { - this.setByBasicUser(ev.userId) - this.type = EventProtocolType.CHANGE_USER_ROLE - - return this - } - - public setEventAdminUpdateContribution(ev: EventAdminUpdateContribution): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_UPDATE_CONTRIBUTION - - return this - } - - public setEventAdminDeleteContribution(ev: EventAdminDeleteContribution): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.ADMIN_DELETE_CONTRIBUTION - - return this - } - - public setEventCreateContributionLink(ev: EventCreateContributionLink): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.CREATE_CONTRIBUTION_LINK - - return this - } - - public setEventDeleteContributionLink(ev: EventDeleteContributionLink): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.DELETE_CONTRIBUTION_LINK - - return this - } - - public setEventUpdateContributionLink(ev: EventUpdateContributionLink): Event { - this.setByBasicCt(ev.userId, ev.contributionId, ev.amount) - this.type = EventProtocolType.UPDATE_CONTRIBUTION_LINK - - return this - } - - setByBasicUser(userId: number): Event { - this.setEventBasic() - this.userId = userId - - return this - } - - setByBasicTx(userId: number, transactionId: number, amount: decimal): Event { - this.setByBasicUser(userId) - this.transactionId = transactionId - this.amount = amount - - return this - } - - setByBasicTxX( +export class Event extends dbEvent { + constructor( + type: EventProtocolType, userId: number, - transactionId: number, - amount: decimal, - xUserId: number, - xCommunityId: number, - ): Event { - this.setByBasicTx(userId, transactionId, amount) + xUserId: number | null = null, + xCommunityId: number | null = null, + transactionId: number | null = null, + contributionId: number | null = null, + amount: Decimal | null = null, + messageId: number | null = null, + autosave = true, + ) { + super() + this.type = type + this.userId = userId this.xUserId = xUserId this.xCommunityId = xCommunityId - - return this - } - - setByBasicCt(userId: number, contributionId: number, amount: decimal): Event { - this.setByBasicUser(userId) + this.transactionId = transactionId this.contributionId = contributionId this.amount = amount - - return this - } - - setByBasicCtMsg( - userId: number, - contributionId: number, - amount: decimal, - messageId: number, - ): Event { - this.setByBasicCt(userId, contributionId, amount) this.messageId = messageId - return this + if (autosave) { + // This is unsafe, since we cannot wait for this in the constructor - the saving process is async therefore + this.save() + } } - - setByBasicCtX( - userId: number, - contributionId: number, - amount: decimal, - xUserId: number, - xCommunityId: number, - ): Event { - this.setByBasicCt(userId, contributionId, amount) - this.xUserId = xUserId - this.xCommunityId = xCommunityId - - return this - } - - setByBasicRedeem(userId: number, transactionId?: number, contributionId?: number): Event { - this.setByBasicUser(userId) - if (transactionId) this.transactionId = transactionId - if (contributionId) this.contributionId = contributionId - - return this - } - - id: number - type: string - createdAt: Date - userId: number - xUserId?: number - xCommunityId?: number - transactionId?: number - contributionId?: number - amount?: decimal - messageId?: number } + +export const EVENT_CONTRIBUTION_CREATE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.CONTRIBUTION_CREATE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) +export const EVENT_CONTRIBUTION_DELETE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.CONTRIBUTION_DELETE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) +export const EVENT_CONTRIBUTION_UPDATE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.CONTRIBUTION_UPDATE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_ADMIN_CONTRIBUTION_CREATE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.ADMIN_CONTRIBUTION_CREATE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_ADMIN_CONTRIBUTION_UPDATE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_ADMIN_CONTRIBUTION_DELETE = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.ADMIN_CONTRIBUTION_DELETE, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_CONTRIBUTION_CONFIRM = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.CONTRIBUTION_CONFIRM, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_ADMIN_CONTRIBUTION_DENY = ( + userId: number, + contributionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.ADMIN_CONTRIBUTION_DENY, + userId, + null, + null, + null, + contributionId, + amount, + null, + autosave, + ) + +export const EVENT_TRANSACTION_SEND = ( + userId: number, + xUserId: number, + transactionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.TRANSACTION_SEND, + userId, + xUserId, + null, + transactionId, + null, + amount, + null, + autosave, + ) + +export const EVENT_TRANSACTION_RECEIVE = ( + userId: number, + xUserId: number, + transactionId: number, + amount: Decimal, + autosave = true, +): Event => + new Event( + EventProtocolType.TRANSACTION_RECEIVE, + userId, + xUserId, + null, + transactionId, + null, + amount, + null, + autosave, + ) + +export const EVENT_LOGIN = (userId: number, autosave = true): Event => + new Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null, autosave) + +export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = ( + userId: number, + autosave = true, +): Event => + new Event( + EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, + userId, + null, + null, + null, + null, + null, + null, + autosave, + ) + +export const EVENT_SEND_CONFIRMATION_EMAIL = (userId: number, autosave = true): Event => + new Event( + EventProtocolType.SEND_CONFIRMATION_EMAIL, + userId, + null, + null, + null, + null, + null, + null, + autosave, + ) + +export const EVENT_REDEEM_REGISTER = ( + userId: number, + transactionId: number | null = null, + contributionId: number | null = null, + autosave = true, +): Event => + new Event( + EventProtocolType.REDEEM_REGISTER, + userId, + null, + null, + transactionId, + contributionId, + null, + null, + autosave, + ) + +export const EVENT_REGISTER = (userId: number, autosave = true): Event => + new Event(EventProtocolType.REGISTER, userId, null, null, null, null, null, null, autosave) + +export const EVENT_ACTIVATE_ACCOUNT = (userId: number, autosave = true): Event => + new Event( + EventProtocolType.ACTIVATE_ACCOUNT, + userId, + null, + null, + null, + null, + null, + null, + autosave, + ) diff --git a/backend/src/event/EventProtocolEmitter.ts b/backend/src/event/EventProtocolEmitter.ts deleted file mode 100644 index a87e8a256..000000000 --- a/backend/src/event/EventProtocolEmitter.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Event } from '@/event/Event' -import { backendLogger as logger } from '@/server/logger' -import { EventProtocol } from '@entity/EventProtocol' - -export const writeEvent = async (event: Event): Promise => { - logger.info('writeEvent', event) - const dbEvent = new EventProtocol() - dbEvent.type = event.type - dbEvent.createdAt = event.createdAt - dbEvent.userId = event.userId - dbEvent.xUserId = event.xUserId || null - dbEvent.xCommunityId = event.xCommunityId || null - dbEvent.contributionId = event.contributionId || null - dbEvent.transactionId = event.transactionId || null - dbEvent.amount = event.amount || null - return dbEvent.save() -} diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index c46a49555..b374275c4 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -37,17 +37,15 @@ import { } from './util/creations' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS, FULL_CREATION_AVAILABLE } from './const/const' import { - Event, - EventContributionCreate, - EventContributionDelete, - EventContributionUpdate, - EventContributionConfirm, - EventAdminContributionCreate, - EventAdminContributionDelete, - EventAdminContributionDeny, - EventAdminContributionUpdate, + EVENT_CONTRIBUTION_CREATE, + EVENT_CONTRIBUTION_DELETE, + EVENT_CONTRIBUTION_UPDATE, + EVENT_ADMIN_CONTRIBUTION_CREATE, + EVENT_ADMIN_CONTRIBUTION_UPDATE, + EVENT_ADMIN_CONTRIBUTION_DELETE, + EVENT_CONTRIBUTION_CONFIRM, + EVENT_ADMIN_CONTRIBUTION_DENY, } from '@/event/Event' -import { writeEvent } from '@/event/EventProtocolEmitter' import { calculateDecay } from '@/util/decay' import { sendContributionConfirmedEmail, @@ -77,8 +75,6 @@ export class ContributionResolver { throw new Error(`memo text is too short (${MEMO_MIN_CHARS} characters minimum)`) } - const event = new Event() - const user = getUser(context) const creations = await getUserCreation(user.id, clientTimezoneOffset) logger.trace('creations', creations) @@ -97,11 +93,7 @@ export class ContributionResolver { logger.trace('contribution to save', contribution) await DbContribution.save(contribution) - const eventCreateContribution = new EventContributionCreate() - eventCreateContribution.userId = user.id - eventCreateContribution.amount = amount - eventCreateContribution.contributionId = contribution.id - await writeEvent(event.setEventContributionCreate(eventCreateContribution)) + EVENT_CONTRIBUTION_CREATE(user.id, contribution.id, amount) return new UnconfirmedContribution(contribution, user, creations) } @@ -112,7 +104,6 @@ export class ContributionResolver { @Arg('id', () => Int) id: number, @Ctx() context: Context, ): Promise { - const event = new Event() const user = getUser(context) const contribution = await DbContribution.findOne(id) if (!contribution) { @@ -133,11 +124,7 @@ export class ContributionResolver { contribution.deletedAt = new Date() await contribution.save() - const eventDeleteContribution = new EventContributionDelete() - eventDeleteContribution.userId = user.id - eventDeleteContribution.contributionId = contribution.id - eventDeleteContribution.amount = contribution.amount - await writeEvent(event.setEventContributionDelete(eventDeleteContribution)) + EVENT_CONTRIBUTION_DELETE(user.id, contribution.id, contribution.amount) const res = await contribution.softRemove() return !!res @@ -288,13 +275,7 @@ export class ContributionResolver { contributionToUpdate.updatedAt = new Date() DbContribution.save(contributionToUpdate) - const event = new Event() - - const eventUpdateContribution = new EventContributionUpdate() - eventUpdateContribution.userId = user.id - eventUpdateContribution.contributionId = contributionId - eventUpdateContribution.amount = amount - await writeEvent(event.setEventContributionUpdate(eventUpdateContribution)) + EVENT_CONTRIBUTION_UPDATE(user.id, contributionId, amount) return new UnconfirmedContribution(contributionToUpdate, user, creations) } @@ -335,7 +316,6 @@ export class ContributionResolver { throw new Error('Contribution could not be saved, Email is not activated') } - const event = new Event() const moderator = getUser(context) logger.trace('moderator: ', moderator.id) const creations = await getUserCreation(emailContact.userId, clientTimezoneOffset) @@ -357,11 +337,7 @@ export class ContributionResolver { await DbContribution.save(contribution) - const eventAdminCreateContribution = new EventAdminContributionCreate() - eventAdminCreateContribution.userId = moderator.id - eventAdminCreateContribution.amount = amount - eventAdminCreateContribution.contributionId = contribution.id - await writeEvent(event.setEventAdminContributionCreate(eventAdminCreateContribution)) + EVENT_ADMIN_CONTRIBUTION_CREATE(moderator.id, contribution.id, amount) return getUserCreation(emailContact.userId, clientTimezoneOffset) } @@ -466,12 +442,7 @@ export class ContributionResolver { result.creation = await getUserCreation(user.id, clientTimezoneOffset) - const event = new Event() - const eventAdminContributionUpdate = new EventAdminContributionUpdate() - eventAdminContributionUpdate.userId = user.id - eventAdminContributionUpdate.amount = amount - eventAdminContributionUpdate.contributionId = contributionToUpdate.id - await writeEvent(event.setEventAdminContributionUpdate(eventAdminContributionUpdate)) + EVENT_ADMIN_CONTRIBUTION_UPDATE(user.id, contributionToUpdate.id, amount) return result } @@ -544,12 +515,8 @@ export class ContributionResolver { await contribution.save() const res = await contribution.softRemove() - const event = new Event() - const eventAdminContributionDelete = new EventAdminContributionDelete() - eventAdminContributionDelete.userId = contribution.userId - eventAdminContributionDelete.amount = contribution.amount - eventAdminContributionDelete.contributionId = contribution.id - await writeEvent(event.setEventAdminContributionDelete(eventAdminContributionDelete)) + EVENT_ADMIN_CONTRIBUTION_DELETE(contribution.userId, contribution.id, contribution.amount) + sendContributionDeletedEmail({ firstName: user.firstName, lastName: user.lastName, @@ -667,12 +634,7 @@ export class ContributionResolver { await queryRunner.release() } - const event = new Event() - const eventContributionConfirm = new EventContributionConfirm() - eventContributionConfirm.userId = user.id - eventContributionConfirm.amount = contribution.amount - eventContributionConfirm.contributionId = contribution.id - await writeEvent(event.setEventContributionConfirm(eventContributionConfirm)) + EVENT_CONTRIBUTION_CONFIRM(user.id, contribution.id, contribution.amount) } finally { releaseLock() } @@ -766,12 +728,11 @@ export class ContributionResolver { contributionToUpdate.deniedAt = new Date() const res = await contributionToUpdate.save() - const event = new Event() - const eventAdminContributionDeny = new EventAdminContributionDeny() - eventAdminContributionDeny.userId = contributionToUpdate.userId - eventAdminContributionDeny.amount = contributionToUpdate.amount - eventAdminContributionDeny.contributionId = contributionToUpdate.id - await writeEvent(event.setEventAdminContributionDeny(eventAdminContributionDeny)) + EVENT_ADMIN_CONTRIBUTION_DENY( + contributionToUpdate.userId, + contributionToUpdate.id, + contributionToUpdate.amount, + ) sendContributionDeniedEmail({ firstName: user.firstName, diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index bedf8c533..1d3864f27 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -29,8 +29,7 @@ import { sendTransactionLinkRedeemedEmail, sendTransactionReceivedEmail, } from '@/emails/sendEmailVariants' -import { Event, EventTransactionReceive, EventTransactionSend } from '@/event/Event' -import { writeEvent } from '@/event/EventProtocolEmitter' +import { EVENT_TRANSACTION_RECEIVE, EVENT_TRANSACTION_SEND } from '@/event/Event' import { BalanceResolver } from './BalanceResolver' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' @@ -141,19 +140,19 @@ export const executeTransaction = async ( await queryRunner.commitTransaction() logger.info(`commit Transaction successful...`) - const eventTransactionSend = new EventTransactionSend() - eventTransactionSend.userId = transactionSend.userId - eventTransactionSend.xUserId = transactionSend.linkedUserId - eventTransactionSend.transactionId = transactionSend.id - eventTransactionSend.amount = transactionSend.amount.mul(-1) - await writeEvent(new Event().setEventTransactionSend(eventTransactionSend)) + EVENT_TRANSACTION_SEND( + transactionSend.userId, + transactionSend.linkedUserId, + transactionSend.id, + transactionSend.amount.mul(-1), + ) - const eventTransactionReceive = new EventTransactionReceive() - eventTransactionReceive.userId = transactionReceive.userId - eventTransactionReceive.xUserId = transactionReceive.linkedUserId - eventTransactionReceive.transactionId = transactionReceive.id - eventTransactionReceive.amount = transactionReceive.amount - await writeEvent(new Event().setEventTransactionReceive(eventTransactionReceive)) + EVENT_TRANSACTION_RECEIVE( + transactionReceive.userId, + transactionReceive.linkedUserId, + transactionReceive.id, + transactionReceive.amount, + ) } catch (e) { await queryRunner.rollbackTransaction() logger.error(`Transaction was not successful: ${e}`) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 5ebf5b445..7a9eebe65 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -48,15 +48,13 @@ import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddle import { klicktippSignIn } from '@/apis/KlicktippController' import { RIGHTS } from '@/auth/RIGHTS' import { hasElopageBuys } from '@/util/hasElopageBuys' -import { writeEvent } from '@/event/EventProtocolEmitter' import { - Event, - EventLogin, - EventRedeemRegister, - EventRegister, - EventSendAccountMultiRegistrationEmail, - EventSendConfirmationEmail, - EventActivateAccount, + EVENT_LOGIN, + EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, + EVENT_SEND_CONFIRMATION_EMAIL, + EVENT_REDEEM_REGISTER, + EVENT_REGISTER, + EVENT_ACTIVATE_ACCOUNT, } from '@/event/Event' import { getUserCreations } from './util/creations' import { isValidPassword } from '@/password/EncryptorUtils' @@ -177,9 +175,9 @@ export class UserResolver { key: 'token', value: encode(dbUser.gradidoID), }) - const ev = new EventLogin() - ev.userId = user.id - writeEvent(new Event().setEventLogin(ev)) + + EVENT_LOGIN(user.id) + logger.info(`successful Login: ${JSON.stringify(user, null, 2)}`) return user } @@ -211,7 +209,6 @@ export class UserResolver { ) // TODO: wrong default value (should be null), how does graphql work here? Is it an required field? // default int publisher_id = 0; - const event = new Event() // Validate Language (no throw) if (!language || !isLanguage(language)) { @@ -249,9 +246,9 @@ export class UserResolver { email, language: foundUser.language, // use language of the emails owner for sending }) - const eventSendAccountMultiRegistrationEmail = new EventSendAccountMultiRegistrationEmail() - eventSendAccountMultiRegistrationEmail.userId = foundUser.id - writeEvent(event.setEventSendConfirmationEmail(eventSendAccountMultiRegistrationEmail)) + + EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL(foundUser.id) + logger.info( `sendAccountMultiRegistrationEmail by ${firstName} ${lastName} to ${foundUser.firstName} ${foundUser.lastName} <${email}>`, ) @@ -268,10 +265,7 @@ export class UserResolver { const gradidoID = await newGradidoID() - const eventRegister = new EventRegister() - const eventRedeemRegister = new EventRedeemRegister() - const eventSendConfirmEmail = new EventSendConfirmationEmail() - + const eventRegisterRedeem = EVENT_REDEEM_REGISTER(0, null, null, false) let dbUser = new DbUser() dbUser.gradidoID = gradidoID dbUser.firstName = firstName @@ -288,14 +282,14 @@ export class UserResolver { logger.info('redeemCode found contributionLink=' + contributionLink) if (contributionLink) { dbUser.contributionLinkId = contributionLink.id - eventRedeemRegister.contributionId = contributionLink.id + eventRegisterRedeem.contributionId = contributionLink.id } } else { const transactionLink = await DbTransactionLink.findOne({ code: redeemCode }) logger.info('redeemCode found transactionLink=' + transactionLink) if (transactionLink) { dbUser.referrerId = transactionLink.userId - eventRedeemRegister.transactionId = transactionLink.id + eventRegisterRedeem.transactionId = transactionLink.id } } } @@ -333,8 +327,9 @@ export class UserResolver { timeDurationObject: getTimeDurationObject(CONFIG.EMAIL_CODE_VALID_TIME), }) logger.info(`sendAccountActivationEmail of ${firstName}.${lastName} to ${email}`) - eventSendConfirmEmail.userId = dbUser.id - writeEvent(event.setEventSendConfirmationEmail(eventSendConfirmEmail)) + + // TODO: this event is used twice, why? + EVENT_SEND_CONFIRMATION_EMAIL(dbUser.id) if (!emailSent) { logger.debug(`Account confirmation link: ${activationLink}`) @@ -351,11 +346,10 @@ export class UserResolver { logger.info('createUser() successful...') if (redeemCode) { - eventRedeemRegister.userId = dbUser.id - await writeEvent(event.setEventRedeemRegister(eventRedeemRegister)) + eventRegisterRedeem.userId = dbUser.id + eventRegisterRedeem.save() } else { - eventRegister.userId = dbUser.id - await writeEvent(event.setEventRegister(eventRegister)) + EVENT_REGISTER(dbUser.id) } return new User(dbUser) @@ -458,8 +452,6 @@ export class UserResolver { await queryRunner.connect() await queryRunner.startTransaction('REPEATABLE READ') - const event = new Event() - try { // Save user await queryRunner.manager.save(user).catch((error) => { @@ -473,9 +465,7 @@ export class UserResolver { await queryRunner.commitTransaction() logger.info('User and UserContact data written successfully...') - const eventActivateAccount = new EventActivateAccount() - eventActivateAccount.userId = user.id - writeEvent(event.setEventActivateAccount(eventActivateAccount)) + EVENT_ACTIVATE_ACCOUNT(user.id) } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Error on writing User and User Contact data', e) @@ -819,10 +809,8 @@ export class UserResolver { if (!emailSent) { logger.info(`Account confirmation link: ${activationLink}`) } else { - const event = new Event() - const eventSendConfirmationEmail = new EventSendConfirmationEmail() - eventSendConfirmationEmail.userId = user.id - await writeEvent(event.setEventSendConfirmationEmail(eventSendConfirmationEmail)) + // TODO: this event is used twice, why? + EVENT_SEND_CONFIRMATION_EMAIL(user.id) } return true From f9b6b887e0e0aae32e0f88072dc38f529c4357f5 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 10 Feb 2023 03:37:48 +0100 Subject: [PATCH 02/18] things are working properly --- backend/src/event/Event.ts | 157 +++++++----------- backend/src/event/EventProtocolType.ts | 64 +++---- .../graphql/resolver/ContributionResolver.ts | 16 +- .../graphql/resolver/TransactionResolver.ts | 4 +- backend/src/graphql/resolver/UserResolver.ts | 26 +-- 5 files changed, 117 insertions(+), 150 deletions(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 2545bdc63..310bf6601 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -1,8 +1,9 @@ -import { EventProtocol as dbEvent } from '@entity/EventProtocol' +import { EventProtocol as DbEvent } from '@entity/EventProtocol' import Decimal from 'decimal.js-light' import { EventProtocolType } from './EventProtocolType' -export class Event extends dbEvent { +export class Event { + event: DbEvent constructor( type: EventProtocolType, userId: number, @@ -12,31 +13,28 @@ export class Event extends dbEvent { contributionId: number | null = null, amount: Decimal | null = null, messageId: number | null = null, - autosave = true, ) { - super() - this.type = type - this.userId = userId - this.xUserId = xUserId - this.xCommunityId = xCommunityId - this.transactionId = transactionId - this.contributionId = contributionId - this.amount = amount - this.messageId = messageId + this.event = new DbEvent() + this.event.type = type + this.event.userId = userId + this.event.xUserId = xUserId + this.event.xCommunityId = xCommunityId + this.event.transactionId = transactionId + this.event.contributionId = contributionId + this.event.amount = amount + this.event.messageId = messageId + } - if (autosave) { - // This is unsafe, since we cannot wait for this in the constructor - the saving process is async therefore - this.save() - } + save(): Promise { + return this.event.save() } } -export const EVENT_CONTRIBUTION_CREATE = ( +export const EVENT_CONTRIBUTION_CREATE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.CONTRIBUTION_CREATE, userId, @@ -46,14 +44,13 @@ export const EVENT_CONTRIBUTION_CREATE = ( contributionId, amount, null, - autosave, - ) -export const EVENT_CONTRIBUTION_DELETE = ( + ).save() + +export const EVENT_CONTRIBUTION_DELETE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.CONTRIBUTION_DELETE, userId, @@ -63,14 +60,13 @@ export const EVENT_CONTRIBUTION_DELETE = ( contributionId, amount, null, - autosave, - ) -export const EVENT_CONTRIBUTION_UPDATE = ( + ).save() + +export const EVENT_CONTRIBUTION_UPDATE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.CONTRIBUTION_UPDATE, userId, @@ -80,15 +76,13 @@ export const EVENT_CONTRIBUTION_UPDATE = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_ADMIN_CONTRIBUTION_CREATE = ( +export const EVENT_ADMIN_CONTRIBUTION_CREATE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.ADMIN_CONTRIBUTION_CREATE, userId, @@ -98,15 +92,13 @@ export const EVENT_ADMIN_CONTRIBUTION_CREATE = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_ADMIN_CONTRIBUTION_UPDATE = ( +export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, userId, @@ -116,15 +108,13 @@ export const EVENT_ADMIN_CONTRIBUTION_UPDATE = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_ADMIN_CONTRIBUTION_DELETE = ( +export const EVENT_ADMIN_CONTRIBUTION_DELETE = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.ADMIN_CONTRIBUTION_DELETE, userId, @@ -134,15 +124,13 @@ export const EVENT_ADMIN_CONTRIBUTION_DELETE = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_CONTRIBUTION_CONFIRM = ( +export const EVENT_CONTRIBUTION_CONFIRM = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.CONTRIBUTION_CONFIRM, userId, @@ -152,15 +140,13 @@ export const EVENT_CONTRIBUTION_CONFIRM = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_ADMIN_CONTRIBUTION_DENY = ( +export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( userId: number, contributionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.ADMIN_CONTRIBUTION_DENY, userId, @@ -170,16 +156,14 @@ export const EVENT_ADMIN_CONTRIBUTION_DENY = ( contributionId, amount, null, - autosave, - ) + ).save() -export const EVENT_TRANSACTION_SEND = ( +export const EVENT_TRANSACTION_SEND = async ( userId: number, xUserId: number, transactionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.TRANSACTION_SEND, userId, @@ -189,16 +173,14 @@ export const EVENT_TRANSACTION_SEND = ( null, amount, null, - autosave, - ) + ).save() -export const EVENT_TRANSACTION_RECEIVE = ( +export const EVENT_TRANSACTION_RECEIVE = async ( userId: number, xUserId: number, transactionId: number, amount: Decimal, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.TRANSACTION_RECEIVE, userId, @@ -208,16 +190,14 @@ export const EVENT_TRANSACTION_RECEIVE = ( null, amount, null, - autosave, - ) + ).save() -export const EVENT_LOGIN = (userId: number, autosave = true): Event => - new Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null, autosave) +export const EVENT_LOGIN = async (userId: number): Promise => + new Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save() -export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = ( +export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( userId: number, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId, @@ -227,10 +207,9 @@ export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = ( null, null, null, - autosave, - ) + ).save() -export const EVENT_SEND_CONFIRMATION_EMAIL = (userId: number, autosave = true): Event => +export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => new Event( EventProtocolType.SEND_CONFIRMATION_EMAIL, userId, @@ -240,15 +219,13 @@ export const EVENT_SEND_CONFIRMATION_EMAIL = (userId: number, autosave = true): null, null, null, - autosave, - ) + ).save() -export const EVENT_REDEEM_REGISTER = ( +/* export const EVENT_REDEEM_REGISTER = async ( userId: number, transactionId: number | null = null, contributionId: number | null = null, - autosave = true, -): Event => +): Promise => new Event( EventProtocolType.REDEEM_REGISTER, userId, @@ -258,21 +235,11 @@ export const EVENT_REDEEM_REGISTER = ( contributionId, null, null, - autosave, - ) + ).save() +*/ -export const EVENT_REGISTER = (userId: number, autosave = true): Event => - new Event(EventProtocolType.REGISTER, userId, null, null, null, null, null, null, autosave) +export const EVENT_REGISTER = async (userId: number): Promise => + new Event(EventProtocolType.REGISTER, userId, null, null, null, null, null, null).save() -export const EVENT_ACTIVATE_ACCOUNT = (userId: number, autosave = true): Event => - new Event( - EventProtocolType.ACTIVATE_ACCOUNT, - userId, - null, - null, - null, - null, - null, - null, - autosave, - ) +export const EVENT_ACTIVATE_ACCOUNT = async (userId: number): Promise => + new Event(EventProtocolType.ACTIVATE_ACCOUNT, userId, null, null, null, null, null, null).save() diff --git a/backend/src/event/EventProtocolType.ts b/backend/src/event/EventProtocolType.ts index ccd15d238..b3ade4c5c 100644 --- a/backend/src/event/EventProtocolType.ts +++ b/backend/src/event/EventProtocolType.ts @@ -1,50 +1,50 @@ export enum EventProtocolType { - BASIC = 'BASIC', - VISIT_GRADIDO = 'VISIT_GRADIDO', + // BASIC = 'BASIC', + // VISIT_GRADIDO = 'VISIT_GRADIDO', REGISTER = 'REGISTER', REDEEM_REGISTER = 'REDEEM_REGISTER', - VERIFY_REDEEM = 'VERIFY_REDEEM', - INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT', + // VERIFY_REDEEM = 'VERIFY_REDEEM', + // INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT', SEND_CONFIRMATION_EMAIL = 'SEND_CONFIRMATION_EMAIL', SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = 'SEND_ACCOUNT_MULTIREGISTRATION_EMAIL', - CONFIRM_EMAIL = 'CONFIRM_EMAIL', - REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP', + // CONFIRM_EMAIL = 'CONFIRM_EMAIL', + // REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP', LOGIN = 'LOGIN', - LOGOUT = 'LOGOUT', - REDEEM_LOGIN = 'REDEEM_LOGIN', + // LOGOUT = 'LOGOUT', + // REDEEM_LOGIN = 'REDEEM_LOGIN', ACTIVATE_ACCOUNT = 'ACTIVATE_ACCOUNT', - SEND_FORGOT_PASSWORD_EMAIL = 'SEND_FORGOT_PASSWORD_EMAIL', - PASSWORD_CHANGE = 'PASSWORD_CHANGE', - SEND_TRANSACTION_SEND_EMAIL = 'SEND_TRANSACTION_SEND_EMAIL', - SEND_TRANSACTION_RECEIVE_EMAIL = 'SEND_TRANSACTION_RECEIVE_EMAIL', + // SEND_FORGOT_PASSWORD_EMAIL = 'SEND_FORGOT_PASSWORD_EMAIL', + // PASSWORD_CHANGE = 'PASSWORD_CHANGE', + // SEND_TRANSACTION_SEND_EMAIL = 'SEND_TRANSACTION_SEND_EMAIL', + // SEND_TRANSACTION_RECEIVE_EMAIL = 'SEND_TRANSACTION_RECEIVE_EMAIL', TRANSACTION_SEND = 'TRANSACTION_SEND', - TRANSACTION_SEND_REDEEM = 'TRANSACTION_SEND_REDEEM', - TRANSACTION_REPEATE_REDEEM = 'TRANSACTION_REPEATE_REDEEM', - TRANSACTION_CREATION = 'TRANSACTION_CREATION', + // TRANSACTION_SEND_REDEEM = 'TRANSACTION_SEND_REDEEM', + // TRANSACTION_REPEATE_REDEEM = 'TRANSACTION_REPEATE_REDEEM', + // TRANSACTION_CREATION = 'TRANSACTION_CREATION', TRANSACTION_RECEIVE = 'TRANSACTION_RECEIVE', - TRANSACTION_RECEIVE_REDEEM = 'TRANSACTION_RECEIVE_REDEEM', - SEND_TRANSACTION_LINK_REDEEM_EMAIL = 'SEND_TRANSACTION_LINK_REDEEM_EMAIL', - SEND_ADDED_CONTRIBUTION_EMAIL = 'SEND_ADDED_CONTRIBUTION_EMAIL', - SEND_CONTRIBUTION_CONFIRM_EMAIL = 'SEND_CONTRIBUTION_CONFIRM_EMAIL', + // TRANSACTION_RECEIVE_REDEEM = 'TRANSACTION_RECEIVE_REDEEM', + // SEND_TRANSACTION_LINK_REDEEM_EMAIL = 'SEND_TRANSACTION_LINK_REDEEM_EMAIL', + // SEND_ADDED_CONTRIBUTION_EMAIL = 'SEND_ADDED_CONTRIBUTION_EMAIL', + // SEND_CONTRIBUTION_CONFIRM_EMAIL = 'SEND_CONTRIBUTION_CONFIRM_EMAIL', CONTRIBUTION_CREATE = 'CONTRIBUTION_CREATE', CONTRIBUTION_CONFIRM = 'CONTRIBUTION_CONFIRM', - CONTRIBUTION_DENY = 'CONTRIBUTION_DENY', - CONTRIBUTION_LINK_DEFINE = 'CONTRIBUTION_LINK_DEFINE', - CONTRIBUTION_LINK_ACTIVATE_REDEEM = 'CONTRIBUTION_LINK_ACTIVATE_REDEEM', + // CONTRIBUTION_DENY = 'CONTRIBUTION_DENY', + // CONTRIBUTION_LINK_DEFINE = 'CONTRIBUTION_LINK_DEFINE', + // CONTRIBUTION_LINK_ACTIVATE_REDEEM = 'CONTRIBUTION_LINK_ACTIVATE_REDEEM', CONTRIBUTION_DELETE = 'CONTRIBUTION_DELETE', CONTRIBUTION_UPDATE = 'CONTRIBUTION_UPDATE', ADMIN_CONTRIBUTION_CREATE = 'ADMIN_CONTRIBUTION_CREATE', ADMIN_CONTRIBUTION_DELETE = 'ADMIN_CONTRIBUTION_DELETE', ADMIN_CONTRIBUTION_DENY = 'ADMIN_CONTRIBUTION_DENY', ADMIN_CONTRIBUTION_UPDATE = 'ADMIN_CONTRIBUTION_UPDATE', - USER_CREATE_CONTRIBUTION_MESSAGE = 'USER_CREATE_CONTRIBUTION_MESSAGE', - ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE', - DELETE_USER = 'DELETE_USER', - UNDELETE_USER = 'UNDELETE_USER', - CHANGE_USER_ROLE = 'CHANGE_USER_ROLE', - ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION', - ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION', - CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', - DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', - UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', + // USER_CREATE_CONTRIBUTION_MESSAGE = 'USER_CREATE_CONTRIBUTION_MESSAGE', + // ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE', + // DELETE_USER = 'DELETE_USER', + // UNDELETE_USER = 'UNDELETE_USER', + // CHANGE_USER_ROLE = 'CHANGE_USER_ROLE', + // ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION', + // ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION', + // CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', + // DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', + // UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', } diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index b374275c4..62001c6e8 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -93,7 +93,7 @@ export class ContributionResolver { logger.trace('contribution to save', contribution) await DbContribution.save(contribution) - EVENT_CONTRIBUTION_CREATE(user.id, contribution.id, amount) + await EVENT_CONTRIBUTION_CREATE(user.id, contribution.id, amount) return new UnconfirmedContribution(contribution, user, creations) } @@ -124,7 +124,7 @@ export class ContributionResolver { contribution.deletedAt = new Date() await contribution.save() - EVENT_CONTRIBUTION_DELETE(user.id, contribution.id, contribution.amount) + await EVENT_CONTRIBUTION_DELETE(user.id, contribution.id, contribution.amount) const res = await contribution.softRemove() return !!res @@ -275,7 +275,7 @@ export class ContributionResolver { contributionToUpdate.updatedAt = new Date() DbContribution.save(contributionToUpdate) - EVENT_CONTRIBUTION_UPDATE(user.id, contributionId, amount) + await EVENT_CONTRIBUTION_UPDATE(user.id, contributionId, amount) return new UnconfirmedContribution(contributionToUpdate, user, creations) } @@ -337,7 +337,7 @@ export class ContributionResolver { await DbContribution.save(contribution) - EVENT_ADMIN_CONTRIBUTION_CREATE(moderator.id, contribution.id, amount) + await EVENT_ADMIN_CONTRIBUTION_CREATE(moderator.id, contribution.id, amount) return getUserCreation(emailContact.userId, clientTimezoneOffset) } @@ -442,7 +442,7 @@ export class ContributionResolver { result.creation = await getUserCreation(user.id, clientTimezoneOffset) - EVENT_ADMIN_CONTRIBUTION_UPDATE(user.id, contributionToUpdate.id, amount) + await EVENT_ADMIN_CONTRIBUTION_UPDATE(user.id, contributionToUpdate.id, amount) return result } @@ -515,7 +515,7 @@ export class ContributionResolver { await contribution.save() const res = await contribution.softRemove() - EVENT_ADMIN_CONTRIBUTION_DELETE(contribution.userId, contribution.id, contribution.amount) + await EVENT_ADMIN_CONTRIBUTION_DELETE(contribution.userId, contribution.id, contribution.amount) sendContributionDeletedEmail({ firstName: user.firstName, @@ -634,7 +634,7 @@ export class ContributionResolver { await queryRunner.release() } - EVENT_CONTRIBUTION_CONFIRM(user.id, contribution.id, contribution.amount) + await EVENT_CONTRIBUTION_CONFIRM(user.id, contribution.id, contribution.amount) } finally { releaseLock() } @@ -728,7 +728,7 @@ export class ContributionResolver { contributionToUpdate.deniedAt = new Date() const res = await contributionToUpdate.save() - EVENT_ADMIN_CONTRIBUTION_DENY( + await EVENT_ADMIN_CONTRIBUTION_DENY( contributionToUpdate.userId, contributionToUpdate.id, contributionToUpdate.amount, diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 1d3864f27..46fb812f7 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -140,14 +140,14 @@ export const executeTransaction = async ( await queryRunner.commitTransaction() logger.info(`commit Transaction successful...`) - EVENT_TRANSACTION_SEND( + await EVENT_TRANSACTION_SEND( transactionSend.userId, transactionSend.linkedUserId, transactionSend.id, transactionSend.amount.mul(-1), ) - EVENT_TRANSACTION_RECEIVE( + await EVENT_TRANSACTION_RECEIVE( transactionReceive.userId, transactionReceive.linkedUserId, transactionReceive.id, diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 7a9eebe65..96bb62aef 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -49,10 +49,10 @@ import { klicktippSignIn } from '@/apis/KlicktippController' import { RIGHTS } from '@/auth/RIGHTS' import { hasElopageBuys } from '@/util/hasElopageBuys' import { + Event, EVENT_LOGIN, EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, EVENT_SEND_CONFIRMATION_EMAIL, - EVENT_REDEEM_REGISTER, EVENT_REGISTER, EVENT_ACTIVATE_ACCOUNT, } from '@/event/Event' @@ -62,6 +62,7 @@ import { FULL_CREATION_AVAILABLE } from './const/const' import { encryptPassword, verifyPassword } from '@/password/PasswordEncryptor' import { PasswordEncryptionType } from '../enum/PasswordEncryptionType' import LogError from '@/server/LogError' +import { EventProtocolType } from '@/event/EventProtocolType' // eslint-disable-next-line @typescript-eslint/no-var-requires const sodium = require('sodium-native') @@ -176,8 +177,7 @@ export class UserResolver { value: encode(dbUser.gradidoID), }) - EVENT_LOGIN(user.id) - + await EVENT_LOGIN(user.id) logger.info(`successful Login: ${JSON.stringify(user, null, 2)}`) return user } @@ -247,7 +247,7 @@ export class UserResolver { language: foundUser.language, // use language of the emails owner for sending }) - EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL(foundUser.id) + await EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL(foundUser.id) logger.info( `sendAccountMultiRegistrationEmail by ${firstName} ${lastName} to ${foundUser.firstName} ${foundUser.lastName} <${email}>`, @@ -265,7 +265,7 @@ export class UserResolver { const gradidoID = await newGradidoID() - const eventRegisterRedeem = EVENT_REDEEM_REGISTER(0, null, null, false) + const eventRegisterRedeem = new Event(EventProtocolType.REDEEM_REGISTER, 0) let dbUser = new DbUser() dbUser.gradidoID = gradidoID dbUser.firstName = firstName @@ -282,14 +282,14 @@ export class UserResolver { logger.info('redeemCode found contributionLink=' + contributionLink) if (contributionLink) { dbUser.contributionLinkId = contributionLink.id - eventRegisterRedeem.contributionId = contributionLink.id + eventRegisterRedeem.event.contributionId = contributionLink.id } } else { const transactionLink = await DbTransactionLink.findOne({ code: redeemCode }) logger.info('redeemCode found transactionLink=' + transactionLink) if (transactionLink) { dbUser.referrerId = transactionLink.userId - eventRegisterRedeem.transactionId = transactionLink.id + eventRegisterRedeem.event.transactionId = transactionLink.id } } } @@ -329,7 +329,7 @@ export class UserResolver { logger.info(`sendAccountActivationEmail of ${firstName}.${lastName} to ${email}`) // TODO: this event is used twice, why? - EVENT_SEND_CONFIRMATION_EMAIL(dbUser.id) + await EVENT_SEND_CONFIRMATION_EMAIL(dbUser.id) if (!emailSent) { logger.debug(`Account confirmation link: ${activationLink}`) @@ -346,10 +346,10 @@ export class UserResolver { logger.info('createUser() successful...') if (redeemCode) { - eventRegisterRedeem.userId = dbUser.id - eventRegisterRedeem.save() + eventRegisterRedeem.event.userId = dbUser.id + await eventRegisterRedeem.save() } else { - EVENT_REGISTER(dbUser.id) + await EVENT_REGISTER(dbUser.id) } return new User(dbUser) @@ -465,7 +465,7 @@ export class UserResolver { await queryRunner.commitTransaction() logger.info('User and UserContact data written successfully...') - EVENT_ACTIVATE_ACCOUNT(user.id) + await EVENT_ACTIVATE_ACCOUNT(user.id) } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Error on writing User and User Contact data', e) @@ -810,7 +810,7 @@ export class UserResolver { logger.info(`Account confirmation link: ${activationLink}`) } else { // TODO: this event is used twice, why? - EVENT_SEND_CONFIRMATION_EMAIL(user.id) + await EVENT_SEND_CONFIRMATION_EMAIL(user.id) } return true From 362226a94fcf938976c86c7816eca9b377dc22d3 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 10 Feb 2023 03:44:34 +0100 Subject: [PATCH 03/18] completely dismiss class based approach, use EVENT function --- backend/src/event/Event.ts | 78 +++++++++----------- backend/src/graphql/resolver/UserResolver.ts | 10 +-- 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 310bf6601..09f2f7102 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -2,32 +2,26 @@ import { EventProtocol as DbEvent } from '@entity/EventProtocol' import Decimal from 'decimal.js-light' import { EventProtocolType } from './EventProtocolType' -export class Event { - event: DbEvent - constructor( - type: EventProtocolType, - userId: number, - xUserId: number | null = null, - xCommunityId: number | null = null, - transactionId: number | null = null, - contributionId: number | null = null, - amount: Decimal | null = null, - messageId: number | null = null, - ) { - this.event = new DbEvent() - this.event.type = type - this.event.userId = userId - this.event.xUserId = xUserId - this.event.xCommunityId = xCommunityId - this.event.transactionId = transactionId - this.event.contributionId = contributionId - this.event.amount = amount - this.event.messageId = messageId - } - - save(): Promise { - return this.event.save() - } +export const EVENT = ( + type: EventProtocolType, + userId: number, + xUserId: number | null = null, + xCommunityId: number | null = null, + transactionId: number | null = null, + contributionId: number | null = null, + amount: Decimal | null = null, + messageId: number | null = null, +): DbEvent => { + const event = new DbEvent() + event.type = type + event.userId = userId + event.xUserId = xUserId + event.xCommunityId = xCommunityId + event.transactionId = transactionId + event.contributionId = contributionId + event.amount = amount + event.messageId = messageId + return event } export const EVENT_CONTRIBUTION_CREATE = async ( @@ -35,7 +29,7 @@ export const EVENT_CONTRIBUTION_CREATE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.CONTRIBUTION_CREATE, userId, null, @@ -51,7 +45,7 @@ export const EVENT_CONTRIBUTION_DELETE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.CONTRIBUTION_DELETE, userId, null, @@ -67,7 +61,7 @@ export const EVENT_CONTRIBUTION_UPDATE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.CONTRIBUTION_UPDATE, userId, null, @@ -83,7 +77,7 @@ export const EVENT_ADMIN_CONTRIBUTION_CREATE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.ADMIN_CONTRIBUTION_CREATE, userId, null, @@ -99,7 +93,7 @@ export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, userId, null, @@ -115,7 +109,7 @@ export const EVENT_ADMIN_CONTRIBUTION_DELETE = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.ADMIN_CONTRIBUTION_DELETE, userId, null, @@ -131,7 +125,7 @@ export const EVENT_CONTRIBUTION_CONFIRM = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.CONTRIBUTION_CONFIRM, userId, null, @@ -147,7 +141,7 @@ export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( contributionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.ADMIN_CONTRIBUTION_DENY, userId, null, @@ -164,7 +158,7 @@ export const EVENT_TRANSACTION_SEND = async ( transactionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.TRANSACTION_SEND, userId, xUserId, @@ -181,7 +175,7 @@ export const EVENT_TRANSACTION_RECEIVE = async ( transactionId: number, amount: Decimal, ): Promise => - new Event( + EVENT( EventProtocolType.TRANSACTION_RECEIVE, userId, xUserId, @@ -193,12 +187,12 @@ export const EVENT_TRANSACTION_RECEIVE = async ( ).save() export const EVENT_LOGIN = async (userId: number): Promise => - new Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save() + EVENT(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save() export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( userId: number, ): Promise => - new Event( + EVENT( EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId, null, @@ -210,7 +204,7 @@ export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( ).save() export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - new Event( + EVENT( EventProtocolType.SEND_CONFIRMATION_EMAIL, userId, null, @@ -226,7 +220,7 @@ export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - new Event( + EVENT( EventProtocolType.REDEEM_REGISTER, userId, null, @@ -239,7 +233,7 @@ export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - new Event(EventProtocolType.REGISTER, userId, null, null, null, null, null, null).save() + EVENT(EventProtocolType.REGISTER, userId, null, null, null, null, null, null).save() export const EVENT_ACTIVATE_ACCOUNT = async (userId: number): Promise => - new Event(EventProtocolType.ACTIVATE_ACCOUNT, userId, null, null, null, null, null, null).save() + EVENT(EventProtocolType.ACTIVATE_ACCOUNT, userId, null, null, null, null, null, null).save() diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 96bb62aef..2aba1c538 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -49,7 +49,7 @@ import { klicktippSignIn } from '@/apis/KlicktippController' import { RIGHTS } from '@/auth/RIGHTS' import { hasElopageBuys } from '@/util/hasElopageBuys' import { - Event, + EVENT, EVENT_LOGIN, EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, EVENT_SEND_CONFIRMATION_EMAIL, @@ -265,7 +265,7 @@ export class UserResolver { const gradidoID = await newGradidoID() - const eventRegisterRedeem = new Event(EventProtocolType.REDEEM_REGISTER, 0) + const eventRegisterRedeem = EVENT(EventProtocolType.REDEEM_REGISTER, 0) let dbUser = new DbUser() dbUser.gradidoID = gradidoID dbUser.firstName = firstName @@ -282,14 +282,14 @@ export class UserResolver { logger.info('redeemCode found contributionLink=' + contributionLink) if (contributionLink) { dbUser.contributionLinkId = contributionLink.id - eventRegisterRedeem.event.contributionId = contributionLink.id + eventRegisterRedeem.contributionId = contributionLink.id } } else { const transactionLink = await DbTransactionLink.findOne({ code: redeemCode }) logger.info('redeemCode found transactionLink=' + transactionLink) if (transactionLink) { dbUser.referrerId = transactionLink.userId - eventRegisterRedeem.event.transactionId = transactionLink.id + eventRegisterRedeem.transactionId = transactionLink.id } } } @@ -346,7 +346,7 @@ export class UserResolver { logger.info('createUser() successful...') if (redeemCode) { - eventRegisterRedeem.event.userId = dbUser.id + eventRegisterRedeem.userId = dbUser.id await eventRegisterRedeem.save() } else { await EVENT_REGISTER(dbUser.id) From dac694e46f1f79c8434563fc2780f805a84a400a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 10 Feb 2023 03:49:45 +0100 Subject: [PATCH 04/18] require 79% backend coverage --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index da8521a76..41ea77400 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -526,7 +526,7 @@ jobs: report_name: Coverage Backend type: lcov result_path: ./backend/coverage/lcov.info - min_coverage: 78 + min_coverage: 79 token: ${{ github.token }} ########################################################################## From fb84abeb8353485e70db00c5095ecb3d2309634d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 10 Feb 2023 03:57:11 +0100 Subject: [PATCH 05/18] save some space --- backend/src/event/Event.ts | 39 ++++---------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 09f2f7102..196e997e2 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -37,7 +37,6 @@ export const EVENT_CONTRIBUTION_CREATE = async ( null, contributionId, amount, - null, ).save() export const EVENT_CONTRIBUTION_DELETE = async ( @@ -53,7 +52,6 @@ export const EVENT_CONTRIBUTION_DELETE = async ( null, contributionId, amount, - null, ).save() export const EVENT_CONTRIBUTION_UPDATE = async ( @@ -69,7 +67,6 @@ export const EVENT_CONTRIBUTION_UPDATE = async ( null, contributionId, amount, - null, ).save() export const EVENT_ADMIN_CONTRIBUTION_CREATE = async ( @@ -85,7 +82,6 @@ export const EVENT_ADMIN_CONTRIBUTION_CREATE = async ( null, contributionId, amount, - null, ).save() export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async ( @@ -101,7 +97,6 @@ export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async ( null, contributionId, amount, - null, ).save() export const EVENT_ADMIN_CONTRIBUTION_DELETE = async ( @@ -117,7 +112,6 @@ export const EVENT_ADMIN_CONTRIBUTION_DELETE = async ( null, contributionId, amount, - null, ).save() export const EVENT_CONTRIBUTION_CONFIRM = async ( @@ -133,7 +127,6 @@ export const EVENT_CONTRIBUTION_CONFIRM = async ( null, contributionId, amount, - null, ).save() export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( @@ -149,7 +142,6 @@ export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( null, contributionId, amount, - null, ).save() export const EVENT_TRANSACTION_SEND = async ( @@ -166,7 +158,6 @@ export const EVENT_TRANSACTION_SEND = async ( transactionId, null, amount, - null, ).save() export const EVENT_TRANSACTION_RECEIVE = async ( @@ -183,7 +174,6 @@ export const EVENT_TRANSACTION_RECEIVE = async ( transactionId, null, amount, - null, ).save() export const EVENT_LOGIN = async (userId: number): Promise => @@ -191,29 +181,10 @@ export const EVENT_LOGIN = async (userId: number): Promise => export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( userId: number, -): Promise => - EVENT( - EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, - userId, - null, - null, - null, - null, - null, - null, - ).save() +): Promise => EVENT(EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId).save() export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - EVENT( - EventProtocolType.SEND_CONFIRMATION_EMAIL, - userId, - null, - null, - null, - null, - null, - null, - ).save() + EVENT(EventProtocolType.SEND_CONFIRMATION_EMAIL, userId).save() /* export const EVENT_REDEEM_REGISTER = async ( userId: number, @@ -227,13 +198,11 @@ export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - EVENT(EventProtocolType.REGISTER, userId, null, null, null, null, null, null).save() + EVENT(EventProtocolType.REGISTER, userId).save() export const EVENT_ACTIVATE_ACCOUNT = async (userId: number): Promise => - EVENT(EventProtocolType.ACTIVATE_ACCOUNT, userId, null, null, null, null, null, null).save() + EVENT(EventProtocolType.ACTIVATE_ACCOUNT, userId).save() From 8424417cdeb62abd7f184412d26a678b78846a08 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 12:14:00 +0100 Subject: [PATCH 06/18] removed todos, separated events --- backend/src/event/Event.ts | 3 +++ backend/src/event/EventProtocolType.ts | 1 + backend/src/graphql/resolver/UserResolver.ts | 5 ++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 196e997e2..e2ae5863a 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -186,6 +186,9 @@ export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => EVENT(EventProtocolType.SEND_CONFIRMATION_EMAIL, userId).save() +export const EVENT_ADMIN_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => + EVENT(EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, userId).save() + /* export const EVENT_REDEEM_REGISTER = async ( userId: number, transactionId: number | null = null, diff --git a/backend/src/event/EventProtocolType.ts b/backend/src/event/EventProtocolType.ts index b3ade4c5c..4df32aa53 100644 --- a/backend/src/event/EventProtocolType.ts +++ b/backend/src/event/EventProtocolType.ts @@ -6,6 +6,7 @@ export enum EventProtocolType { // VERIFY_REDEEM = 'VERIFY_REDEEM', // INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT', SEND_CONFIRMATION_EMAIL = 'SEND_CONFIRMATION_EMAIL', + ADMIN_SEND_CONFIRMATION_EMAIL = 'ADMIN_SEND_CONFIRMATION_EMAIL', SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = 'SEND_ACCOUNT_MULTIREGISTRATION_EMAIL', // CONFIRM_EMAIL = 'CONFIRM_EMAIL', // REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP', diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 2aba1c538..d3397c720 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -55,6 +55,7 @@ import { EVENT_SEND_CONFIRMATION_EMAIL, EVENT_REGISTER, EVENT_ACTIVATE_ACCOUNT, + EVENT_ADMIN_SEND_CONFIRMATION_EMAIL, } from '@/event/Event' import { getUserCreations } from './util/creations' import { isValidPassword } from '@/password/EncryptorUtils' @@ -328,7 +329,6 @@ export class UserResolver { }) logger.info(`sendAccountActivationEmail of ${firstName}.${lastName} to ${email}`) - // TODO: this event is used twice, why? await EVENT_SEND_CONFIRMATION_EMAIL(dbUser.id) if (!emailSent) { @@ -809,8 +809,7 @@ export class UserResolver { if (!emailSent) { logger.info(`Account confirmation link: ${activationLink}`) } else { - // TODO: this event is used twice, why? - await EVENT_SEND_CONFIRMATION_EMAIL(user.id) + await EVENT_ADMIN_SEND_CONFIRMATION_EMAIL(user.id) } return true From 38c5f6ff5d8b28d8daa4aa48abb18a752209dca8 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 12:33:46 +0100 Subject: [PATCH 07/18] test login event --- backend/src/graphql/resolver/UserResolver.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 17eddca94..e3a1bacd8 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -647,6 +647,19 @@ describe('UserResolver', () => { it('sets the token in the header', () => { expect(headerPushMock).toBeCalledWith({ key: 'token', value: expect.any(String) }) }) + + it('stores the login event in the database', async () => { + const userConatct = await UserContact.findOneOrFail( + { email: 'bibi@bloxberg.de' }, + { relations: ['user'] }, + ) + expect(EventProtocol.find()).resolves.toContainEqual( + expect.objectContaining({ + type: EventProtocolType.LOGIN, + userId: userConatct.user.id, + }), + ) + }) }) describe('user is in database and wrong password', () => { From 1ac2e033bf51c41606b1d64c0f217c2c182ffa6c Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 12:37:16 +0100 Subject: [PATCH 08/18] test multi registration email event --- backend/src/graphql/resolver/UserResolver.test.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index e3a1bacd8..167cd2b4f 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -206,7 +206,7 @@ describe('UserResolver', () => { }) }) - describe('email already exists', () => { + describe('user already exists', () => { let mutation: User beforeAll(async () => { mutation = await mutate({ mutation: createUser, variables }) @@ -236,6 +236,19 @@ describe('UserResolver', () => { }), ) }) + + it('stores the send account multi registration email event in the database', async () => { + const userConatct = await UserContact.findOneOrFail( + { email: 'peter@lustig.de' }, + { relations: ['user'] }, + ) + expect(EventProtocol.find()).resolves.toContainEqual( + expect.objectContaining({ + type: EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, + userId: userConatct.user.id, + }), + ) + }) }) describe('unknown language', () => { From b12865abf8312bc012277dca70bcab4277672d9a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 12:41:59 +0100 Subject: [PATCH 09/18] test for event register --- backend/src/graphql/resolver/UserResolver.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 167cd2b4f..6e9a21b86 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -175,6 +175,19 @@ describe('UserResolver', () => { }) }) }) + + it('stores the register event in the database', async () => { + const userConatct = await UserContact.findOneOrFail( + { email: 'peter@lustig.de' }, + { relations: ['user'] }, + ) + expect(EventProtocol.find()).resolves.toContainEqual( + expect.objectContaining({ + type: EventProtocolType.REGISTER, + userId: userConatct.user.id, + }), + ) + }) }) describe('account activation email', () => { From a88585086c99d3d37291b4810ed1e6465a88d989 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:12:58 +0100 Subject: [PATCH 10/18] test sendActivationEmail --- .../src/graphql/resolver/UserResolver.test.ts | 146 +++++++++++++++++- backend/src/graphql/resolver/UserResolver.ts | 15 +- backend/src/seeds/graphql/mutations.ts | 6 + 3 files changed, 148 insertions(+), 19 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 6e9a21b86..36a22c386 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -19,6 +19,7 @@ import { setUserRole, deleteUser, unDeleteUser, + sendActivationEmail, } from '@/seeds/graphql/mutations' import { verifyLogin, queryOptIn, searchAdminUsers, searchUsers } from '@/seeds/graphql/queries' import { GraphQLError } from 'graphql' @@ -176,7 +177,7 @@ describe('UserResolver', () => { }) }) - it('stores the register event in the database', async () => { + it('stores the REGISTER event in the database', async () => { const userConatct = await UserContact.findOneOrFail( { email: 'peter@lustig.de' }, { relations: ['user'] }, @@ -209,7 +210,7 @@ describe('UserResolver', () => { }) }) - it('stores the send confirmation event in the database', () => { + it('stores the SEND_CONFIRMATION_EMAIL event in the database', () => { expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.SEND_CONFIRMATION_EMAIL, @@ -250,7 +251,7 @@ describe('UserResolver', () => { ) }) - it('stores the send account multi registration email event in the database', async () => { + it('stores the SEND_ACCOUNT_MULTIREGISTRATION_EMAIL event in the database', async () => { const userConatct = await UserContact.findOneOrFail( { email: 'peter@lustig.de' }, { relations: ['user'] }, @@ -354,7 +355,7 @@ describe('UserResolver', () => { ) }) - it('stores the account activated event in the database', () => { + it('stores the ACTIVATE_ACCOUNT event in the database', () => { expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.ACTIVATE_ACCOUNT, @@ -363,7 +364,7 @@ describe('UserResolver', () => { ) }) - it('stores the redeem register event in the database', () => { + it('stores the REDEEM_REGISTER event in the database', () => { expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.REDEEM_REGISTER, @@ -447,7 +448,7 @@ describe('UserResolver', () => { ) }) - it('stores the redeem register event in the database', async () => { + it('stores the REDEEM_REGISTER event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.REDEEM_REGISTER, @@ -674,7 +675,7 @@ describe('UserResolver', () => { expect(headerPushMock).toBeCalledWith({ key: 'token', value: expect.any(String) }) }) - it('stores the login event in the database', async () => { + it('stores the LOGIN event in the database', async () => { const userConatct = await UserContact.findOneOrFail( { email: 'bibi@bloxberg.de' }, { relations: ['user'] }, @@ -926,7 +927,7 @@ describe('UserResolver', () => { ) }) - it('stores the login event in the database', () => { + it('stores the LOGIN event in the database', () => { expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.LOGIN, @@ -1707,6 +1708,135 @@ describe('UserResolver', () => { }) }) + /// + + describe('sendActivationEmail', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + mutate({ mutation: sendActivationEmail, variables: { email: 'bibi@bloxberg.de' } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + describe('without admin rights', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + await mutate({ + mutation: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + it('returns an error', async () => { + await expect( + mutate({ mutation: sendActivationEmail, variables: { email: 'bibi@bloxberg.de' } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('with admin rights', () => { + beforeAll(async () => { + admin = await userFactory(testEnv, peterLustig) + await mutate({ + mutation: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('user does not exist', () => { + it('throws an error', async () => { + jest.clearAllMocks() + await expect( + mutate({ mutation: sendActivationEmail, variables: { email: 'INVALID' } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('No user with this credentials')], + }), + ) + }) + + it('logs the error thrown', () => { + expect(logger.error).toBeCalledWith('No user with this credentials', 'invalid') + }) + }) + + describe('user is deleted', () => { + it('throws an error', async () => { + jest.clearAllMocks() + await userFactory(testEnv, stephenHawking) + await expect( + mutate({ mutation: sendActivationEmail, variables: { email: 'stephen@hawking.uk' } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('User with given email contact is deleted')], + }), + ) + }) + + it('logs the error thrown', () => { + expect(logger.error).toBeCalledWith( + 'User with given email contact is deleted', + 'stephen@hawking.uk', + ) + }) + }) + + describe('sendActivationEmail with success', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + }) + + it('returns true', async () => { + const result = await mutate({ + mutation: sendActivationEmail, + variables: { email: 'bibi@bloxberg.de' }, + }) + expect(result).toEqual( + expect.objectContaining({ + data: { + sendActivationEmail: true, + }, + }), + ) + }) + + it('stores the ADMIN_SEND_CONFIRMATION_EMAIL event in the database', async () => { + const userConatct = await UserContact.findOneOrFail( + { email: 'bibi@bloxberg.de' }, + { relations: ['user'] }, + ) + expect(EventProtocol.find()).resolves.toContainEqual( + expect.objectContaining({ + type: EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, + userId: userConatct.user.id, + }), + ) + }) + }) + }) + }) + }) + describe('unDelete user', () => { describe('unauthenticated', () => { it('returns an error', async () => { diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index d3397c720..aa7a94f9a 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -781,19 +781,12 @@ export class UserResolver { email = email.trim().toLowerCase() // const user = await dbUser.findOne({ id: emailContact.userId }) const user = await findUserByEmail(email) - if (!user) { - throw new LogError('Could not find user to given email contact', email) - } - if (user.deletedAt) { + if (user.deletedAt || user.emailContact.deletedAt) { throw new LogError('User with given email contact is deleted', email) } - const emailContact = user.emailContact - if (emailContact.deletedAt) { - throw new LogError('The given email contact for this user is deleted', email) - } - emailContact.emailResendCount++ - await emailContact.save() + user.emailContact.emailResendCount++ + await user.emailContact.save() // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendAccountActivationEmail({ @@ -801,7 +794,7 @@ export class UserResolver { lastName: user.lastName, email, language: user.language, - activationLink: activationLink(emailContact.emailVerificationCode), + activationLink: activationLink(user.emailContact.emailVerificationCode), timeDurationObject: getTimeDurationObject(CONFIG.EMAIL_CODE_VALID_TIME), }) diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index 2b4ed6656..5c05a4de9 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -68,6 +68,12 @@ export const createUser = gql` } ` +export const sendActivationEmail = gql` + mutation ($email: String!) { + sendActivationEmail(email: $email) + } +` + export const sendCoins = gql` mutation ($email: String!, $amount: Decimal!, $memo: String!) { sendCoins(email: $email, amount: $amount, memo: $memo) From 973630e5fbd952fd0e172b160c1f44efb3ba6407 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:20:31 +0100 Subject: [PATCH 11/18] also test the emeil going out --- .../src/graphql/resolver/UserResolver.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 36a22c386..19eb04b34 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1820,6 +1820,28 @@ describe('UserResolver', () => { ) }) + it('sends an account activation email', async () => { + const userConatct = await UserContact.findOneOrFail( + { email: 'bibi@bloxberg.de' }, + { relations: ['user'] }, + ) + const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( + /{optin}/g, + userConatct.emailVerificationCode.toString(), + ).replace(/{code}/g, '') + expect(sendAccountActivationEmail).toBeCalledWith({ + firstName: 'Bibi', + lastName: 'Bloxberg', + email: 'bibi@bloxberg.de', + language: 'de', + activationLink, + timeDurationObject: expect.objectContaining({ + hours: expect.any(Number), + minutes: expect.any(Number), + }), + }) + }) + it('stores the ADMIN_SEND_CONFIRMATION_EMAIL event in the database', async () => { const userConatct = await UserContact.findOneOrFail( { email: 'bibi@bloxberg.de' }, From dd69330e39253d5b8204ecc1f72f4f616a583f5e Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:23:13 +0100 Subject: [PATCH 12/18] 80% coverage backend --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 41ea77400..bb812c7f4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -526,7 +526,7 @@ jobs: report_name: Coverage Backend type: lcov result_path: ./backend/coverage/lcov.info - min_coverage: 79 + min_coverage: 80 token: ${{ github.token }} ########################################################################## From 20509b8a112a6e95a1744ad84bd419212e7b01fe Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:34:21 +0100 Subject: [PATCH 13/18] remove basic event --- backend/src/event/EventProtocolType.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/event/EventProtocolType.ts b/backend/src/event/EventProtocolType.ts index 4df32aa53..3a4c914c1 100644 --- a/backend/src/event/EventProtocolType.ts +++ b/backend/src/event/EventProtocolType.ts @@ -1,5 +1,4 @@ export enum EventProtocolType { - // BASIC = 'BASIC', // VISIT_GRADIDO = 'VISIT_GRADIDO', REGISTER = 'REGISTER', REDEEM_REGISTER = 'REDEEM_REGISTER', From 5ffa2a4d8e85a71732da236beb3abb773541ddd9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:34:34 +0100 Subject: [PATCH 14/18] refactor message for test event --- .../resolver/ContributionResolver.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.test.ts b/backend/src/graphql/resolver/ContributionResolver.test.ts index 4a74029ad..085fb74a1 100644 --- a/backend/src/graphql/resolver/ContributionResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionResolver.test.ts @@ -244,7 +244,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the create contribution event in the database', async () => { + it('stores the CONTRIBUTION_CREATE event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.CONTRIBUTION_CREATE, @@ -696,7 +696,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the update contribution event in the database', async () => { + it('stores the CONTRIBUTION_UPDATE event in the database', async () => { bibi = await query({ query: login, variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, @@ -1263,7 +1263,7 @@ describe('ContributionResolver', () => { ).resolves.toBeTruthy() }) - it('stores the delete contribution event in the database', async () => { + it('stores the CONTRIBUTION_DELETE event in the database', async () => { const contribution = await mutate({ mutation: createContribution, variables: { @@ -1780,7 +1780,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the admin create contribution event in the database', async () => { + it('stores the ADMIN_CONTRIBUTION_CREATE event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.ADMIN_CONTRIBUTION_CREATE, @@ -2045,7 +2045,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the admin update contribution event in the database', async () => { + it('stores the ADMIN_CONTRIBUTION_UPDATE event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, @@ -2085,7 +2085,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the admin update contribution event in the database', async () => { + it('stores the ADMIN_CONTRIBUTION_UPDATE event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, @@ -2229,7 +2229,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the admin delete contribution event in the database', async () => { + it('stores the ADMIN_CONTRIBUTION_DELETE event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.ADMIN_CONTRIBUTION_DELETE, @@ -2371,7 +2371,7 @@ describe('ContributionResolver', () => { ) }) - it('stores the contribution confirm event in the database', async () => { + it('stores the CONTRIBUTION_CONFIRM event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.CONTRIBUTION_CONFIRM, @@ -2403,7 +2403,7 @@ describe('ContributionResolver', () => { }) }) - it('stores the send confirmation email event in the database', async () => { + it('stores the SEND_CONFIRMATION_EMAIL event in the database', async () => { await expect(EventProtocol.find()).resolves.toContainEqual( expect.objectContaining({ type: EventProtocolType.SEND_CONFIRMATION_EMAIL, From 31168c3aff74f07b8d8f4b70466f51a21f29b1b1 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 13 Feb 2023 13:36:06 +0100 Subject: [PATCH 15/18] refactor event names --- backend/src/graphql/resolver/TransactionResolver.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index 50b2b3690..b0e9f34c2 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -334,7 +334,7 @@ describe('send coins', () => { ) }) - it('stores the send transaction event in the database', async () => { + it('stores the TRANSACTION_SEND event in the database', async () => { // Find the exact transaction (sent one is the one with user[1] as user) const transaction = await Transaction.find({ userId: user[1].id, @@ -351,7 +351,7 @@ describe('send coins', () => { ) }) - it('stores the receive event in the database', async () => { + it('stores the TRANSACTION_RECEIVE event in the database', async () => { // Find the exact transaction (received one is the one with user[0] as user) const transaction = await Transaction.find({ userId: user[0].id, From 2a1cb037c73a90c5d5fe338cb30f498f7c910246 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 14 Feb 2023 01:47:07 +0100 Subject: [PATCH 16/18] log moderator who denies contribution instead of user --- backend/src/graphql/resolver/ContributionResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index fa39ad60d..53026abe7 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -693,7 +693,7 @@ export class ContributionResolver { const res = await contributionToUpdate.save() await EVENT_ADMIN_CONTRIBUTION_DENY( - contributionToUpdate.userId, + moderator.id, contributionToUpdate.id, contributionToUpdate.amount, ) From 9101c3f74d9864ac8592664ecf128160c1789771 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 14 Feb 2023 15:39:41 +0100 Subject: [PATCH 17/18] save moderator & user_id for EVENT_ADMIN_CONTRIBUTION_DENY --- backend/src/event/Event.ts | 3 ++- backend/src/graphql/resolver/ContributionResolver.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index e2ae5863a..90e28fbb4 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -131,13 +131,14 @@ export const EVENT_CONTRIBUTION_CONFIRM = async ( export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( userId: number, + xUserId: number, contributionId: number, amount: Decimal, ): Promise => EVENT( EventProtocolType.ADMIN_CONTRIBUTION_DENY, userId, - null, + xUserId, null, null, contributionId, diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 53026abe7..f070fade5 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -693,6 +693,7 @@ export class ContributionResolver { const res = await contributionToUpdate.save() await EVENT_ADMIN_CONTRIBUTION_DENY( + contributionToUpdate.userId, moderator.id, contributionToUpdate.id, contributionToUpdate.amount, From d0ff8ffb2c2b1d477a4f607f8d46fd8a652da9f1 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 14 Feb 2023 15:50:25 +0100 Subject: [PATCH 18/18] diferentiate between saving and not saving event --- backend/src/event/Event.ts | 36 ++++++++++---------- backend/src/graphql/resolver/UserResolver.ts | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/backend/src/event/Event.ts b/backend/src/event/Event.ts index 90e28fbb4..8e65d85f2 100644 --- a/backend/src/event/Event.ts +++ b/backend/src/event/Event.ts @@ -2,7 +2,7 @@ import { EventProtocol as DbEvent } from '@entity/EventProtocol' import Decimal from 'decimal.js-light' import { EventProtocolType } from './EventProtocolType' -export const EVENT = ( +export const Event = ( type: EventProtocolType, userId: number, xUserId: number | null = null, @@ -29,7 +29,7 @@ export const EVENT_CONTRIBUTION_CREATE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.CONTRIBUTION_CREATE, userId, null, @@ -44,7 +44,7 @@ export const EVENT_CONTRIBUTION_DELETE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.CONTRIBUTION_DELETE, userId, null, @@ -59,7 +59,7 @@ export const EVENT_CONTRIBUTION_UPDATE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.CONTRIBUTION_UPDATE, userId, null, @@ -74,7 +74,7 @@ export const EVENT_ADMIN_CONTRIBUTION_CREATE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.ADMIN_CONTRIBUTION_CREATE, userId, null, @@ -89,7 +89,7 @@ export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.ADMIN_CONTRIBUTION_UPDATE, userId, null, @@ -104,7 +104,7 @@ export const EVENT_ADMIN_CONTRIBUTION_DELETE = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.ADMIN_CONTRIBUTION_DELETE, userId, null, @@ -119,7 +119,7 @@ export const EVENT_CONTRIBUTION_CONFIRM = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.CONTRIBUTION_CONFIRM, userId, null, @@ -135,7 +135,7 @@ export const EVENT_ADMIN_CONTRIBUTION_DENY = async ( contributionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.ADMIN_CONTRIBUTION_DENY, userId, xUserId, @@ -151,7 +151,7 @@ export const EVENT_TRANSACTION_SEND = async ( transactionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.TRANSACTION_SEND, userId, xUserId, @@ -167,7 +167,7 @@ export const EVENT_TRANSACTION_RECEIVE = async ( transactionId: number, amount: Decimal, ): Promise => - EVENT( + Event( EventProtocolType.TRANSACTION_RECEIVE, userId, xUserId, @@ -178,24 +178,24 @@ export const EVENT_TRANSACTION_RECEIVE = async ( ).save() export const EVENT_LOGIN = async (userId: number): Promise => - EVENT(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save() + Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save() export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async ( userId: number, -): Promise => EVENT(EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId).save() +): Promise => Event(EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId).save() export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - EVENT(EventProtocolType.SEND_CONFIRMATION_EMAIL, userId).save() + Event(EventProtocolType.SEND_CONFIRMATION_EMAIL, userId).save() export const EVENT_ADMIN_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise => - EVENT(EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, userId).save() + Event(EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, userId).save() /* export const EVENT_REDEEM_REGISTER = async ( userId: number, transactionId: number | null = null, contributionId: number | null = null, ): Promise => - EVENT( + Event( EventProtocolType.REDEEM_REGISTER, userId, null, @@ -206,7 +206,7 @@ export const EVENT_ADMIN_SEND_CONFIRMATION_EMAIL = async (userId: number): Promi */ export const EVENT_REGISTER = async (userId: number): Promise => - EVENT(EventProtocolType.REGISTER, userId).save() + Event(EventProtocolType.REGISTER, userId).save() export const EVENT_ACTIVATE_ACCOUNT = async (userId: number): Promise => - EVENT(EventProtocolType.ACTIVATE_ACCOUNT, userId).save() + Event(EventProtocolType.ACTIVATE_ACCOUNT, userId).save() diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index aa7a94f9a..f9617b0df 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -49,7 +49,7 @@ import { klicktippSignIn } from '@/apis/KlicktippController' import { RIGHTS } from '@/auth/RIGHTS' import { hasElopageBuys } from '@/util/hasElopageBuys' import { - EVENT, + Event, EVENT_LOGIN, EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, EVENT_SEND_CONFIRMATION_EMAIL, @@ -266,7 +266,7 @@ export class UserResolver { const gradidoID = await newGradidoID() - const eventRegisterRedeem = EVENT(EventProtocolType.REDEEM_REGISTER, 0) + const eventRegisterRedeem = Event(EventProtocolType.REDEEM_REGISTER, 0) let dbUser = new DbUser() dbUser.gradidoID = gradidoID dbUser.firstName = firstName