From 9589c46f2fff53514e156caae291c774bbd4a845 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 15 Jan 2024 23:28:19 -0500 Subject: [PATCH 1/6] setup notification center disabling and reduce notifications --- config/example.env | 10 +++++ config/test.env | 12 ++++++ .../NotificationCenterAdapter.ts | 43 +++++++------------ src/resolvers/projectResolver.ts | 14 +----- src/resolvers/reactionResolver.ts | 4 -- src/services/donationService.ts | 10 +---- 6 files changed, 39 insertions(+), 54 deletions(-) diff --git a/config/example.env b/config/example.env index bbb004a54..4b2264f19 100644 --- a/config/example.env +++ b/config/example.env @@ -234,3 +234,13 @@ DISABLE_SERVER_RATE_LIMITER=false DISABLE_SERVER_CORS=false SOLANA_NODE_RPC_URL= +SOLANA_MAINNET_NODE_RPC_URL= +SOLANA_DEVNET_NODE_RPC_URL= +SOLANA_TEST_NODE_RPC_URL= +ENABLE_IMPORT_LOST_DONATIONS= +IMPORT_LOST_DONATIONS_CRONJOB_EXPRESSION= +LOST_DONATIONS_TX_HASHES= +LOST_DONATIONS_QF_ROUND= +LOST_DONATIONS_NETWORK_ID= + +DISABLE_NOTIFICATION_CENTER= diff --git a/config/test.env b/config/test.env index db5f9b131..8f059ca91 100644 --- a/config/test.env +++ b/config/test.env @@ -196,3 +196,15 @@ MATCHING_FUND_DONATIONS_FROM_ADDRESS=0x6e8873085530406995170Da467010565968C7C62 DISABLE_SERVER_RATE_LIMITER=false DISABLE_SERVER_CORS=false SOLANA_NODE_RPC_URL= + +SOLANA_MAINNET_NODE_RPC_URL= +SOLANA_DEVNET_NODE_RPC_URL= +SOLANA_TEST_NODE_RPC_URL= + +ENABLE_IMPORT_LOST_DONATIONS=false +IMPORT_LOST_DONATIONS_CRONJOB_EXPRESSION= +LOST_DONATIONS_TX_HASHES=0x4012421fbc2cecc85804f3b98bdd31bef04589dbac8292deca33e699868af01f,0x067e91368272dc73bc715a21a2af863a333cde20f410189fa53bceaa9cb8c86b +LOST_DONATIONS_QF_ROUND= +LOST_DONATIONS_NETWORK_ID=10 + +DISABLE_NOTIFICATION_CENTER=false diff --git a/src/adapters/notifications/NotificationCenterAdapter.ts b/src/adapters/notifications/NotificationCenterAdapter.ts index ebff3cdf7..939bdc5c9 100644 --- a/src/adapters/notifications/NotificationCenterAdapter.ts +++ b/src/adapters/notifications/NotificationCenterAdapter.ts @@ -24,6 +24,7 @@ import { buildProjectLink } from './NotificationCenterUtils'; const notificationCenterUsername = process.env.NOTIFICATION_CENTER_USERNAME; const notificationCenterPassword = process.env.NOTIFICATION_CENTER_PASSWORD; const notificationCenterBaseUrl = process.env.NOTIFICATION_CENTER_BASE_URL; +const disableNotificationCenter = process.env.DISABLE_NOTIFICATION_CENTER; const numberOfSendNotificationsConcurrentJob = Number( @@ -697,7 +698,6 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { async projectReactivated(params: { project: Project }): Promise { const { project } = params; - const projectOwner = project?.adminUser as User; const now = Date.now(); const supporters = await findUsersWhoSupportProject(project.id); await sendProjectRelatedNotificationsQueue.addBulk( @@ -713,23 +713,6 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { }, })), ); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_ACTIVATED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-reactivated-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); } async projectSavedAsDraft(params: { project: Project }): Promise { @@ -954,11 +937,13 @@ const callSendNotification = async ( data: SendNotificationBody, ): Promise => { try { - await axios.post(`${notificationCenterBaseUrl}/notifications`, data, { - headers: { - Authorization: authorizationHeader(), - }, - }); + if (disableNotificationCenter !== 'true') { + await axios.post(`${notificationCenterBaseUrl}/notifications`, data, { + headers: { + Authorization: authorizationHeader(), + }, + }); + } } catch (e) { logger.error('callSendNotification error', { errorResponse: e?.response?.data, @@ -973,11 +958,13 @@ const callBatchNotification = async ( data: SendBatchNotificationBody, ): Promise => { try { - await axios.post(`${notificationCenterBaseUrl}/notificationsBulk`, data, { - headers: { - Authorization: authorizationHeader(), - }, - }); + if (disableNotificationCenter !== 'true') { + await axios.post(`${notificationCenterBaseUrl}/notificationsBulk`, data, { + headers: { + Authorization: authorizationHeader(), + }, + }); + } } catch (e) { logger.error('callBatchNotification error', { errorResponse: e?.response?.data, diff --git a/src/resolvers/projectResolver.ts b/src/resolvers/projectResolver.ts index b21ed5f69..02f3f4e08 100644 --- a/src/resolvers/projectResolver.ts +++ b/src/resolvers/projectResolver.ts @@ -1054,10 +1054,6 @@ export class ProjectResolver { project.addresses = await findProjectRecipientAddressByProjectId({ projectId, }); - - // Edit emails - await getNotificationAdapter().projectEdited({ project }); - return project; } @@ -1331,10 +1327,6 @@ export class ProjectResolver { await getNotificationAdapter().projectSavedAsDraft({ project, }); - } else { - await getNotificationAdapter().projectPublished({ - project, - }); } return project; @@ -1977,11 +1969,7 @@ export class ProjectResolver { await project.save(); - if (project.prevStatusId === ProjStatus.drafted) { - await getNotificationAdapter().projectPublished({ - project, - }); - } else { + if (project.prevStatusId !== ProjStatus.drafted) { await getNotificationAdapter().projectReactivated({ project, }); diff --git a/src/resolvers/reactionResolver.ts b/src/resolvers/reactionResolver.ts index 11b4352ed..5cc0df298 100644 --- a/src/resolvers/reactionResolver.ts +++ b/src/resolvers/reactionResolver.ts @@ -213,10 +213,6 @@ export class ReactionResolver { // commit transaction now: await queryRunner.commitTransaction(); - await getNotificationAdapter().projectReceivedHeartReaction({ - project, - userId: user.userId, - }); return reaction; } catch (e) { logger.error('like project error', e); diff --git a/src/services/donationService.ts b/src/services/donationService.ts index c1929278c..f753ef941 100644 --- a/src/services/donationService.ts +++ b/src/services/donationService.ts @@ -462,20 +462,12 @@ export const sendSegmentEventForDonation = async (params: { } const donorUser = await findUserById(donation.userId); const projectOwner = project.adminUser; - if (projectOwner) { + if (projectOwner && donation.valueUsd > 1) { await getNotificationAdapter().donationReceived({ donation, project, }); } - - if (donorUser) { - await getNotificationAdapter().donationSent({ - donation, - project, - donor: donorUser, - }); - } }; export const insertDonationsFromQfRoundHistory = async (): Promise => { From b9f848840d6fe5d04599d6755330b562f1fae48e Mon Sep 17 00:00:00 2001 From: Carlos Date: Tue, 16 Jan 2024 10:26:21 -0500 Subject: [PATCH 2/6] comment out notification center methods interface --- .../NotificationCenterAdapter.ts | 1348 +++++++++-------- 1 file changed, 687 insertions(+), 661 deletions(-) diff --git a/src/adapters/notifications/NotificationCenterAdapter.ts b/src/adapters/notifications/NotificationCenterAdapter.ts index 939bdc5c9..ef6c510aa 100644 --- a/src/adapters/notifications/NotificationCenterAdapter.ts +++ b/src/adapters/notifications/NotificationCenterAdapter.ts @@ -86,27 +86,28 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { donation: Donation; project: Project; }): Promise { - const { project, donation } = params; - const user = project.adminUser as User; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_RECEIVED, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentDonationAttributes({ - donation, - project, - user, - }), - }, - trackId: - 'donation-received-' + - donation.transactionNetworkId + - '-' + - donation.transactionId, - }); + return; + // const { project, donation } = params; + // const user = project.adminUser as User; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_RECEIVED, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentDonationAttributes({ + // donation, + // project, + // user, + // }), + // }, + // trackId: + // 'donation-received-' + + // donation.transactionNetworkId + + // '-' + + // donation.transactionId, + // }); } async donationSent(params: { @@ -114,311 +115,323 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { project: Project; donor: User; }): Promise { - const { project, donor, donation } = params; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.MADE_DONATION, - user: { - email: donor.email, - walletAddress: donor.walletAddress as string, - }, - sendEmail: true, - segment: { - analyticsUserId: donor.segmentUserId(), - anonymousId: donor.segmentUserId(), - payload: { - ...getSegmentDonationAttributes({ - donation, - project, - user: donor, - }), - - // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() - // see https://github.com/Giveth/impact-graph/pull/716 - fromWalletAddress: donation.fromWalletAddress.toLowerCase(), - }, - }, - trackId: - 'donation-sent-' + - donation.transactionNetworkId + - '-' + - donation.transactionId, - }); + return; + // const { project, donor, donation } = params; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.MADE_DONATION, + // user: { + // email: donor.email, + // walletAddress: donor.walletAddress as string, + // }, + // sendEmail: true, + // segment: { + // analyticsUserId: donor.segmentUserId(), + // anonymousId: donor.segmentUserId(), + // payload: { + // ...getSegmentDonationAttributes({ + // donation, + // project, + // user: donor, + // }), + + // // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() + // // see https://github.com/Giveth/impact-graph/pull/716 + // fromWalletAddress: donation.fromWalletAddress.toLowerCase(), + // }, + // }, + // trackId: + // 'donation-sent-' + + // donation.transactionNetworkId + + // '-' + + // donation.transactionId, + // }); } async projectVerified(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project.adminUser as User; - const now = new Date(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED_USERS_WHO_SUPPORT, - user, - trackId: `project-verified-${ - project.id - }-${user.walletAddress.toLowerCase()}-${now}`, - }, - })), - ); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED, - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-verified-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project.adminUser as User; + // const now = new Date(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED_USERS_WHO_SUPPORT, + // user, + // trackId: `project-verified-${ + // project.id + // }-${user.walletAddress.toLowerCase()}-${now}`, + // }, + // })), + // ); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED, + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-verified-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectBoosted(params: { projectId: number; userId: number; }): Promise { - const { projectId, userId } = params; - const project = (await findProjectById(projectId)) as Project; - sendProjectRelatedNotificationsQueue.add({ - project: project as Project, - eventName: - project.adminUser?.id === userId - ? // We send different notifications when project owner or someone else boost the project https://github.com/Giveth/notification-center/issues/41 - NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED_BY_PROJECT_OWNER - : NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED, - - // With adding trackId to notification, notification-center would not create new notification - // If there is already a notification with this trackId in DB - trackId: generateTrackId({ - userId, - projectId: project?.id as number, - action: 'boostProject', - }), - }); + return; + // const { projectId, userId } = params; + // const project = (await findProjectById(projectId)) as Project; + // sendProjectRelatedNotificationsQueue.add({ + // project: project as Project, + // eventName: + // project.adminUser?.id === userId + // ? // We send different notifications when project owner or someone else boost the project https://github.com/Giveth/notification-center/issues/41 + // NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED_BY_PROJECT_OWNER + // : NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED, + + // // With adding trackId to notification, notification-center would not create new notification + // // If there is already a notification with this trackId in DB + // trackId: generateTrackId({ + // userId, + // projectId: project?.id as number, + // action: 'boostProject', + // }), + // }); } async projectBoostedBatch(params: { projectIds: number[]; userId: number; }): Promise { - const { userId, projectIds } = params; - for (const projectId of projectIds) { - await this.projectBoosted({ - userId, - projectId, - }); - } + return; + // const { userId, projectIds } = params; + // for (const projectId of projectIds) { + // await this.projectBoosted({ + // userId, + // projectId, + // }); + // } } async projectBadgeRevoked(params: { project: Project }): Promise { - const { project } = params; - const user = project.adminUser as User; - const supporters = await findUsersWhoSupportProject(project.id); - const now = new Date(); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(u => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, - user: u, - trackId: `project-unverified-${ - project.id - }-${u.walletAddress.toLowerCase()}-${now}}`, - }, - })), - ); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKED, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-badge-revoked-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const supporters = await findUsersWhoSupportProject(project.id); + // const now = new Date(); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(u => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, + // user: u, + // trackId: `project-unverified-${ + // project.id + // }-${u.walletAddress.toLowerCase()}-${now}}`, + // }, + // })), + // ); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKED, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-badge-revoked-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectBadgeRevokeReminder(params: { project: Project; }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = new Date(); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_REMINDER, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-badge-revoke-reminder-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = new Date(); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_REMINDER, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-badge-revoke-reminder-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectBadgeRevokeWarning(params: { project: Project }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = new Date(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_WARNING, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-badge-revoke-warning-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = new Date(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_WARNING, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-badge-revoke-warning-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectBadgeRevokeLastWarning(params: { project: Project; }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = Date.now(); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_LAST_WARNING, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-badge-revoke-last-warning-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = Date.now(); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_LAST_WARNING, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-badge-revoke-last-warning-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectBadgeUpForRevoking(params: { project: Project }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_UP_FOR_REVOKING, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-badge-up-for-revoking-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_UP_FOR_REVOKING, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-badge-up-for-revoking-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectUnVerified(params: { project: Project }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = Date.now(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(u => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, - user: u, - trackId: `project-unverified-${ - project.id - }-${u.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-unverified-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = Date.now(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(u => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, + // user: u, + // trackId: `project-unverified-${ + // project.id + // }-${u.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-unverified-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async verificationFormRejected(params: { project: Project }): Promise { - const { project } = params; - const user = project.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_REJECTED, - sendEmail: true, - segment: { - analyticsUserId: user.segmentUserId(), - anonymousId: user.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `verification-form-rejected-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const user = project.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_REJECTED, + // sendEmail: true, + // segment: { + // analyticsUserId: user.segmentUserId(), + // anonymousId: user.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `verification-form-rejected-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectReceivedHeartReaction(params: { project: Project; userId: number; }): Promise { - const { project } = params; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, - - // With adding trackId to notification, notification-center would not create new notification - // If there is already a notification with this trackId in DB - trackId: generateTrackId({ - userId: params.userId, - projectId: project?.id as number, - action: 'likeProject', - }), - }); + return; + // const { project } = params; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, + + // // With adding trackId to notification, notification-center would not create new notification + // // If there is already a notification with this trackId in DB + // trackId: generateTrackId({ + // userId: params.userId, + // projectId: project?.id as number, + // action: 'likeProject', + // }), + // }); } ProfileIsCompleted(params: { user: User }): Promise { @@ -430,433 +443,446 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { } async projectCancelled(params: { project: Project }): Promise { - const { project } = params; - const now = Date.now(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED_USERS_WHO_SUPPORT, - user, - trackId: `project-cancelled-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); - - const projectOwner = project?.adminUser as User; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED, - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-cancelled-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const now = Date.now(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED_USERS_WHO_SUPPORT, + // user, + // trackId: `project-cancelled-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); + + // const projectOwner = project?.adminUser as User; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED, + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-cancelled-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectUpdateAdded(params: { project: Project; update: string; }): Promise { - const { project, update } = params; - const now = Date.now(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_ADD_AN_UPDATE_USERS_WHO_SUPPORT, - user, - trackId: `project-update-added-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); - - const projectOwner = project?.adminUser as User; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UPDATE_ADDED_OWNER, - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: { - ...getSegmentProjectAttributes({ - project, - }), - update, - }, - }, - trackId: `project-update-added-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project, update } = params; + // const now = Date.now(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_ADD_AN_UPDATE_USERS_WHO_SUPPORT, + // user, + // trackId: `project-update-added-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); + + // const projectOwner = project?.adminUser as User; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UPDATE_ADDED_OWNER, + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: { + // ...getSegmentProjectAttributes({ + // project, + // }), + // update, + // }, + // }, + // trackId: `project-update-added-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectDeListed(params: { project: Project }): Promise { - const { project } = params; - const now = Date.now(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED_SUPPORTED, - user, - trackId: `project-unlisted-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); - - const projectOwner = project?.adminUser as User; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-unlisted-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const now = Date.now(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED_SUPPORTED, + // user, + // trackId: `project-unlisted-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); + + // const projectOwner = project?.adminUser as User; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-unlisted-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectDeactivated(params: { project: Project; reason?: string; }): Promise { - const { project, reason } = params; - const metadata = { - reason, - }; - const now = Date.now(); - - const projectOwner = project?.adminUser as User; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED, - metadata, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-deactivated-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED_USERS_WHO_SUPPORT, - user, - metadata, - trackId: `project-deactivated-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); + return; + // const { project, reason } = params; + // const metadata = { + // reason, + // }; + // const now = Date.now(); + + // const projectOwner = project?.adminUser as User; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED, + // metadata, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-deactivated-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED_USERS_WHO_SUPPORT, + // user, + // metadata, + // trackId: `project-deactivated-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); } async projectListed(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED_SUPPORTED, - user, - trackId: `project-listed-${ - project.id - }-${user.walletAddress?.toLowerCase()}-${now}`, - }, - })), - ); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-listed-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED_SUPPORTED, + // user, + // trackId: `project-listed-${ + // project.id + // }-${user.walletAddress?.toLowerCase()}-${now}`, + // }, + // })), + // ); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-listed-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectEdited(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-edited-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-edited-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectGotDraftByAdmin(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_GOT_DRAFT_BY_ADMIN, - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-got-draft-by-admin-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_GOT_DRAFT_BY_ADMIN, + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-got-draft-by-admin-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectPublished(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-published-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-published-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectReactivated(params: { project: Project }): Promise { - const { project } = params; - const now = Date.now(); - const supporters = await findUsersWhoSupportProject(project.id); - await sendProjectRelatedNotificationsQueue.addBulk( - supporters.map(user => ({ - data: { - project, - eventName: - NOTIFICATIONS_EVENT_NAMES.PROJECT_ACTIVATED_USERS_WHO_SUPPORT, - user, - trackId: `project-reactivated-${ - project.id - }-${user.walletAddress.toLowerCase()}-${now}`, - }, - })), - ); + return; + // const { project } = params; + // const now = Date.now(); + // const supporters = await findUsersWhoSupportProject(project.id); + // await sendProjectRelatedNotificationsQueue.addBulk( + // supporters.map(user => ({ + // data: { + // project, + // eventName: + // NOTIFICATIONS_EVENT_NAMES.PROJECT_ACTIVATED_USERS_WHO_SUPPORT, + // user, + // trackId: `project-reactivated-${ + // project.id + // }-${user.walletAddress.toLowerCase()}-${now}`, + // }, + // })), + // ); } async projectSavedAsDraft(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CREATED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-saved-as-draft-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CREATED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-saved-as-draft-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async donationGetPriceFailed(params: { project: Project; donationInfo: { txLink: string; reason: string }; }): Promise { - const { project, donationInfo } = params; - const { txLink, reason } = donationInfo; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_GET_PRICE_FAILED, - metadata: { - txLink, - reason, - }, - sendEmail: false, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `donation-get-price-failed-${project.id}-${donationInfo.txLink}-${now}`, - }); + return; + // const { project, donationInfo } = params; + // const { txLink, reason } = donationInfo; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_GET_PRICE_FAILED, + // metadata: { + // txLink, + // reason, + // }, + // sendEmail: false, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `donation-get-price-failed-${project.id}-${donationInfo.txLink}-${now}`, + // }); } async broadcastNotification( params: BroadCastNotificationInputParams, ): Promise { - const { html, broadCastNotificationId } = params; - let allUserFetched = false; - const take = 100; - let skip = 0; - const trackIdPrefix = `broadCast-${broadCastNotificationId}`; - while (!allUserFetched) { - const { users } = await findAllUsers({ take, skip }); - if (users.length === 0) { - allUserFetched = true; - break; - } - skip += users.length; - const queueData: SendBatchNotificationBody = { notifications: [] }; - for (const user of users) { - // with adding .toLowerCase() to wallet address we make sure if two wallet address with different case - // exist we would set same trackId for them - const trackId = `${trackIdPrefix}-${user.walletAddress?.toLowerCase()}`; - if ( - queueData.notifications.find( - notificationData => notificationData.trackId === trackId, - ) - ) { - // We should not have items with repetitive trackIds in sending bulk notifications - // and we may have some users with same wallet address, so we need to add this checking - // https://github.com/Giveth/giveth-dapps-v2/issues/2084 - continue; - } - queueData.notifications.push({ - email: user.email as string, - eventName: NOTIFICATIONS_EVENT_NAMES.RAW_HTML_BROADCAST, - sendEmail: false, - sendSegment: false, - metadata: { - html, - }, - userWalletAddress: user.walletAddress as string, - trackId, - }); - } - sendBroadcastNotificationsQueue.add(queueData); - } + return; + // const { html, broadCastNotificationId } = params; + // let allUserFetched = false; + // const take = 100; + // let skip = 0; + // const trackIdPrefix = `broadCast-${broadCastNotificationId}`; + // while (!allUserFetched) { + // const { users } = await findAllUsers({ take, skip }); + // if (users.length === 0) { + // allUserFetched = true; + // break; + // } + // skip += users.length; + // const queueData: SendBatchNotificationBody = { notifications: [] }; + // for (const user of users) { + // // with adding .toLowerCase() to wallet address we make sure if two wallet address with different case + // // exist we would set same trackId for them + // const trackId = `${trackIdPrefix}-${user.walletAddress?.toLowerCase()}`; + // if ( + // queueData.notifications.find( + // notificationData => notificationData.trackId === trackId, + // ) + // ) { + // // We should not have items with repetitive trackIds in sending bulk notifications + // // and we may have some users with same wallet address, so we need to add this checking + // // https://github.com/Giveth/giveth-dapps-v2/issues/2084 + // continue; + // } + // queueData.notifications.push({ + // email: user.email as string, + // eventName: NOTIFICATIONS_EVENT_NAMES.RAW_HTML_BROADCAST, + // sendEmail: false, + // sendSegment: false, + // metadata: { + // html, + // }, + // userWalletAddress: user.walletAddress as string, + // trackId, + // }); + // } + // sendBroadcastNotificationsQueue.add(queueData); + // } } async projectsHaveNewRank(params: ProjectsHaveNewRankingInputParam) { - for (const param of params.projectRanks) { - const project = await findProjectById(param.projectId); - if (!project) { - continue; - } - const projectOwner = project.adminUser; - let eventName; - - // https://github.com/Giveth/impact-graph/issues/774#issuecomment-1542337083 - if ( - param.oldRank === params.oldBottomRank && - param.newRank === params.newBottomRank - ) { - // We dont send any notification in this case, because project has no givPower so rank change doesnt matter - continue; - } else if (param.oldRank === params.oldBottomRank) { - eventName = NOTIFICATIONS_EVENT_NAMES.YOUR_PROJECT_GOT_A_RANK; - } else if (param.newRank < param.oldRank) { - eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_RISEN_IN_THE_RANK; - } else if (param.newRank > param.oldRank) { - eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_A_NEW_RANK; - } - logger.info('send rank changed notification ', { - eventName, - slug: project.slug, - newRank: param.newRank, - oldRank: param.oldRank, - oldBottomRank: params.oldBottomRank, - newBottomRank: params.newBottomRank, - }); - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName, - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-has-new-rank-${param.round}-${param.projectId}`, - }); - } + return; + // for (const param of params.projectRanks) { + // const project = await findProjectById(param.projectId); + // if (!project) { + // continue; + // } + // const projectOwner = project.adminUser; + // let eventName; + + // // https://github.com/Giveth/impact-graph/issues/774#issuecomment-1542337083 + // if ( + // param.oldRank === params.oldBottomRank && + // param.newRank === params.newBottomRank + // ) { + // // We dont send any notification in this case, because project has no givPower so rank change doesnt matter + // continue; + // } else if (param.oldRank === params.oldBottomRank) { + // eventName = NOTIFICATIONS_EVENT_NAMES.YOUR_PROJECT_GOT_A_RANK; + // } else if (param.newRank < param.oldRank) { + // eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_RISEN_IN_THE_RANK; + // } else if (param.newRank > param.oldRank) { + // eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_A_NEW_RANK; + // } + // logger.info('send rank changed notification ', { + // eventName, + // slug: project.slug, + // newRank: param.newRank, + // oldRank: param.oldRank, + // oldBottomRank: params.oldBottomRank, + // newBottomRank: params.newBottomRank, + // }); + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName, + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-has-new-rank-${param.round}-${param.projectId}`, + // }); + // } } } From 492f2534d27b44f9f063b2d1dfbc30a38637a23e Mon Sep 17 00:00:00 2001 From: Amin Latifi Date: Tue, 16 Jan 2024 19:57:08 +0330 Subject: [PATCH 3/6] Revert "comment out notification center methods interface" This reverts commit 4a6dd8c4082fceee0b822c1f14a9c0a0b6968d41. --- .../NotificationCenterAdapter.ts | 1348 ++++++++--------- 1 file changed, 661 insertions(+), 687 deletions(-) diff --git a/src/adapters/notifications/NotificationCenterAdapter.ts b/src/adapters/notifications/NotificationCenterAdapter.ts index ef6c510aa..939bdc5c9 100644 --- a/src/adapters/notifications/NotificationCenterAdapter.ts +++ b/src/adapters/notifications/NotificationCenterAdapter.ts @@ -86,28 +86,27 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { donation: Donation; project: Project; }): Promise { - return; - // const { project, donation } = params; - // const user = project.adminUser as User; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_RECEIVED, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentDonationAttributes({ - // donation, - // project, - // user, - // }), - // }, - // trackId: - // 'donation-received-' + - // donation.transactionNetworkId + - // '-' + - // donation.transactionId, - // }); + const { project, donation } = params; + const user = project.adminUser as User; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_RECEIVED, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentDonationAttributes({ + donation, + project, + user, + }), + }, + trackId: + 'donation-received-' + + donation.transactionNetworkId + + '-' + + donation.transactionId, + }); } async donationSent(params: { @@ -115,323 +114,311 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { project: Project; donor: User; }): Promise { - return; - // const { project, donor, donation } = params; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.MADE_DONATION, - // user: { - // email: donor.email, - // walletAddress: donor.walletAddress as string, - // }, - // sendEmail: true, - // segment: { - // analyticsUserId: donor.segmentUserId(), - // anonymousId: donor.segmentUserId(), - // payload: { - // ...getSegmentDonationAttributes({ - // donation, - // project, - // user: donor, - // }), - - // // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() - // // see https://github.com/Giveth/impact-graph/pull/716 - // fromWalletAddress: donation.fromWalletAddress.toLowerCase(), - // }, - // }, - // trackId: - // 'donation-sent-' + - // donation.transactionNetworkId + - // '-' + - // donation.transactionId, - // }); + const { project, donor, donation } = params; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.MADE_DONATION, + user: { + email: donor.email, + walletAddress: donor.walletAddress as string, + }, + sendEmail: true, + segment: { + analyticsUserId: donor.segmentUserId(), + anonymousId: donor.segmentUserId(), + payload: { + ...getSegmentDonationAttributes({ + donation, + project, + user: donor, + }), + + // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() + // see https://github.com/Giveth/impact-graph/pull/716 + fromWalletAddress: donation.fromWalletAddress.toLowerCase(), + }, + }, + trackId: + 'donation-sent-' + + donation.transactionNetworkId + + '-' + + donation.transactionId, + }); } async projectVerified(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project.adminUser as User; - // const now = new Date(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED_USERS_WHO_SUPPORT, - // user, - // trackId: `project-verified-${ - // project.id - // }-${user.walletAddress.toLowerCase()}-${now}`, - // }, - // })), - // ); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED, - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-verified-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project.adminUser as User; + const now = new Date(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED_USERS_WHO_SUPPORT, + user, + trackId: `project-verified-${ + project.id + }-${user.walletAddress.toLowerCase()}-${now}`, + }, + })), + ); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_VERIFIED, + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-verified-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectBoosted(params: { projectId: number; userId: number; }): Promise { - return; - // const { projectId, userId } = params; - // const project = (await findProjectById(projectId)) as Project; - // sendProjectRelatedNotificationsQueue.add({ - // project: project as Project, - // eventName: - // project.adminUser?.id === userId - // ? // We send different notifications when project owner or someone else boost the project https://github.com/Giveth/notification-center/issues/41 - // NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED_BY_PROJECT_OWNER - // : NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED, - - // // With adding trackId to notification, notification-center would not create new notification - // // If there is already a notification with this trackId in DB - // trackId: generateTrackId({ - // userId, - // projectId: project?.id as number, - // action: 'boostProject', - // }), - // }); + const { projectId, userId } = params; + const project = (await findProjectById(projectId)) as Project; + sendProjectRelatedNotificationsQueue.add({ + project: project as Project, + eventName: + project.adminUser?.id === userId + ? // We send different notifications when project owner or someone else boost the project https://github.com/Giveth/notification-center/issues/41 + NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED_BY_PROJECT_OWNER + : NOTIFICATIONS_EVENT_NAMES.PROJECT_BOOSTED, + + // With adding trackId to notification, notification-center would not create new notification + // If there is already a notification with this trackId in DB + trackId: generateTrackId({ + userId, + projectId: project?.id as number, + action: 'boostProject', + }), + }); } async projectBoostedBatch(params: { projectIds: number[]; userId: number; }): Promise { - return; - // const { userId, projectIds } = params; - // for (const projectId of projectIds) { - // await this.projectBoosted({ - // userId, - // projectId, - // }); - // } + const { userId, projectIds } = params; + for (const projectId of projectIds) { + await this.projectBoosted({ + userId, + projectId, + }); + } } async projectBadgeRevoked(params: { project: Project }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const supporters = await findUsersWhoSupportProject(project.id); - // const now = new Date(); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(u => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, - // user: u, - // trackId: `project-unverified-${ - // project.id - // }-${u.walletAddress.toLowerCase()}-${now}}`, - // }, - // })), - // ); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKED, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-badge-revoked-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const supporters = await findUsersWhoSupportProject(project.id); + const now = new Date(); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(u => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, + user: u, + trackId: `project-unverified-${ + project.id + }-${u.walletAddress.toLowerCase()}-${now}}`, + }, + })), + ); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKED, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-badge-revoked-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectBadgeRevokeReminder(params: { project: Project; }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = new Date(); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_REMINDER, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-badge-revoke-reminder-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = new Date(); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_REMINDER, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-badge-revoke-reminder-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectBadgeRevokeWarning(params: { project: Project }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = new Date(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_WARNING, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-badge-revoke-warning-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = new Date(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_WARNING, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-badge-revoke-warning-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectBadgeRevokeLastWarning(params: { project: Project; }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = Date.now(); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_LAST_WARNING, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-badge-revoke-last-warning-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = Date.now(); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_REVOKE_LAST_WARNING, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-badge-revoke-last-warning-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectBadgeUpForRevoking(params: { project: Project }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_UP_FOR_REVOKING, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-badge-up-for-revoking-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_BADGE_UP_FOR_REVOKING, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-badge-up-for-revoking-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectUnVerified(params: { project: Project }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = Date.now(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(u => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, - // user: u, - // trackId: `project-unverified-${ - // project.id - // }-${u.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-unverified-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = Date.now(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(u => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED_USERS_WHO_SUPPORT, + user: u, + trackId: `project-unverified-${ + project.id + }-${u.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNVERIFIED, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-unverified-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async verificationFormRejected(params: { project: Project }): Promise { - return; - // const { project } = params; - // const user = project.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_REJECTED, - // sendEmail: true, - // segment: { - // analyticsUserId: user.segmentUserId(), - // anonymousId: user.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `verification-form-rejected-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const user = project.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_REJECTED, + sendEmail: true, + segment: { + analyticsUserId: user.segmentUserId(), + anonymousId: user.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `verification-form-rejected-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }); } async projectReceivedHeartReaction(params: { project: Project; userId: number; }): Promise { - return; - // const { project } = params; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, - - // // With adding trackId to notification, notification-center would not create new notification - // // If there is already a notification with this trackId in DB - // trackId: generateTrackId({ - // userId: params.userId, - // projectId: project?.id as number, - // action: 'likeProject', - // }), - // }); + const { project } = params; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, + + // With adding trackId to notification, notification-center would not create new notification + // If there is already a notification with this trackId in DB + trackId: generateTrackId({ + userId: params.userId, + projectId: project?.id as number, + action: 'likeProject', + }), + }); } ProfileIsCompleted(params: { user: User }): Promise { @@ -443,446 +430,433 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { } async projectCancelled(params: { project: Project }): Promise { - return; - // const { project } = params; - // const now = Date.now(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED_USERS_WHO_SUPPORT, - // user, - // trackId: `project-cancelled-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); - - // const projectOwner = project?.adminUser as User; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED, - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-cancelled-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const now = Date.now(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED_USERS_WHO_SUPPORT, + user, + trackId: `project-cancelled-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); + + const projectOwner = project?.adminUser as User; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED, + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-cancelled-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectUpdateAdded(params: { project: Project; update: string; }): Promise { - return; - // const { project, update } = params; - // const now = Date.now(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_ADD_AN_UPDATE_USERS_WHO_SUPPORT, - // user, - // trackId: `project-update-added-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); - - // const projectOwner = project?.adminUser as User; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UPDATE_ADDED_OWNER, - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: { - // ...getSegmentProjectAttributes({ - // project, - // }), - // update, - // }, - // }, - // trackId: `project-update-added-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project, update } = params; + const now = Date.now(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_ADD_AN_UPDATE_USERS_WHO_SUPPORT, + user, + trackId: `project-update-added-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); + + const projectOwner = project?.adminUser as User; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UPDATE_ADDED_OWNER, + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: { + ...getSegmentProjectAttributes({ + project, + }), + update, + }, + }, + trackId: `project-update-added-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectDeListed(params: { project: Project }): Promise { - return; - // const { project } = params; - // const now = Date.now(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED_SUPPORTED, - // user, - // trackId: `project-unlisted-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); - - // const projectOwner = project?.adminUser as User; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-unlisted-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const now = Date.now(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED_SUPPORTED, + user, + trackId: `project-unlisted-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); + + const projectOwner = project?.adminUser as User; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_UNLISTED, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-unlisted-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectDeactivated(params: { project: Project; reason?: string; }): Promise { - return; - // const { project, reason } = params; - // const metadata = { - // reason, - // }; - // const now = Date.now(); - - // const projectOwner = project?.adminUser as User; - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED, - // metadata, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-deactivated-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED_USERS_WHO_SUPPORT, - // user, - // metadata, - // trackId: `project-deactivated-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); + const { project, reason } = params; + const metadata = { + reason, + }; + const now = Date.now(); + + const projectOwner = project?.adminUser as User; + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED, + metadata, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-deactivated-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_DEACTIVATED_USERS_WHO_SUPPORT, + user, + metadata, + trackId: `project-deactivated-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); } async projectListed(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED_SUPPORTED, - // user, - // trackId: `project-listed-${ - // project.id - // }-${user.walletAddress?.toLowerCase()}-${now}`, - // }, - // })), - // ); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-listed-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED_SUPPORTED, + user, + trackId: `project-listed-${ + project.id + }-${user.walletAddress?.toLowerCase()}-${now}`, + }, + })), + ); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_LISTED, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-listed-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectEdited(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-edited-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-edited-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectGotDraftByAdmin(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_GOT_DRAFT_BY_ADMIN, - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-got-draft-by-admin-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.VERIFICATION_FORM_GOT_DRAFT_BY_ADMIN, + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-got-draft-by-admin-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectPublished(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-published-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-published-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async projectReactivated(params: { project: Project }): Promise { - return; - // const { project } = params; - // const now = Date.now(); - // const supporters = await findUsersWhoSupportProject(project.id); - // await sendProjectRelatedNotificationsQueue.addBulk( - // supporters.map(user => ({ - // data: { - // project, - // eventName: - // NOTIFICATIONS_EVENT_NAMES.PROJECT_ACTIVATED_USERS_WHO_SUPPORT, - // user, - // trackId: `project-reactivated-${ - // project.id - // }-${user.walletAddress.toLowerCase()}-${now}`, - // }, - // })), - // ); + const { project } = params; + const now = Date.now(); + const supporters = await findUsersWhoSupportProject(project.id); + await sendProjectRelatedNotificationsQueue.addBulk( + supporters.map(user => ({ + data: { + project, + eventName: + NOTIFICATIONS_EVENT_NAMES.PROJECT_ACTIVATED_USERS_WHO_SUPPORT, + user, + trackId: `project-reactivated-${ + project.id + }-${user.walletAddress.toLowerCase()}-${now}`, + }, + })), + ); } async projectSavedAsDraft(params: { project: Project }): Promise { - return; - // const { project } = params; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CREATED, - - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-saved-as-draft-${ - // project.id - // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - // }); + const { project } = params; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_CREATED, + + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-saved-as-draft-${ + project.id + }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + }); } async donationGetPriceFailed(params: { project: Project; donationInfo: { txLink: string; reason: string }; }): Promise { - return; - // const { project, donationInfo } = params; - // const { txLink, reason } = donationInfo; - // const projectOwner = project?.adminUser as User; - // const now = Date.now(); - - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_GET_PRICE_FAILED, - // metadata: { - // txLink, - // reason, - // }, - // sendEmail: false, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `donation-get-price-failed-${project.id}-${donationInfo.txLink}-${now}`, - // }); + const { project, donationInfo } = params; + const { txLink, reason } = donationInfo; + const projectOwner = project?.adminUser as User; + const now = Date.now(); + + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName: NOTIFICATIONS_EVENT_NAMES.DONATION_GET_PRICE_FAILED, + metadata: { + txLink, + reason, + }, + sendEmail: false, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `donation-get-price-failed-${project.id}-${donationInfo.txLink}-${now}`, + }); } async broadcastNotification( params: BroadCastNotificationInputParams, ): Promise { - return; - // const { html, broadCastNotificationId } = params; - // let allUserFetched = false; - // const take = 100; - // let skip = 0; - // const trackIdPrefix = `broadCast-${broadCastNotificationId}`; - // while (!allUserFetched) { - // const { users } = await findAllUsers({ take, skip }); - // if (users.length === 0) { - // allUserFetched = true; - // break; - // } - // skip += users.length; - // const queueData: SendBatchNotificationBody = { notifications: [] }; - // for (const user of users) { - // // with adding .toLowerCase() to wallet address we make sure if two wallet address with different case - // // exist we would set same trackId for them - // const trackId = `${trackIdPrefix}-${user.walletAddress?.toLowerCase()}`; - // if ( - // queueData.notifications.find( - // notificationData => notificationData.trackId === trackId, - // ) - // ) { - // // We should not have items with repetitive trackIds in sending bulk notifications - // // and we may have some users with same wallet address, so we need to add this checking - // // https://github.com/Giveth/giveth-dapps-v2/issues/2084 - // continue; - // } - // queueData.notifications.push({ - // email: user.email as string, - // eventName: NOTIFICATIONS_EVENT_NAMES.RAW_HTML_BROADCAST, - // sendEmail: false, - // sendSegment: false, - // metadata: { - // html, - // }, - // userWalletAddress: user.walletAddress as string, - // trackId, - // }); - // } - // sendBroadcastNotificationsQueue.add(queueData); - // } + const { html, broadCastNotificationId } = params; + let allUserFetched = false; + const take = 100; + let skip = 0; + const trackIdPrefix = `broadCast-${broadCastNotificationId}`; + while (!allUserFetched) { + const { users } = await findAllUsers({ take, skip }); + if (users.length === 0) { + allUserFetched = true; + break; + } + skip += users.length; + const queueData: SendBatchNotificationBody = { notifications: [] }; + for (const user of users) { + // with adding .toLowerCase() to wallet address we make sure if two wallet address with different case + // exist we would set same trackId for them + const trackId = `${trackIdPrefix}-${user.walletAddress?.toLowerCase()}`; + if ( + queueData.notifications.find( + notificationData => notificationData.trackId === trackId, + ) + ) { + // We should not have items with repetitive trackIds in sending bulk notifications + // and we may have some users with same wallet address, so we need to add this checking + // https://github.com/Giveth/giveth-dapps-v2/issues/2084 + continue; + } + queueData.notifications.push({ + email: user.email as string, + eventName: NOTIFICATIONS_EVENT_NAMES.RAW_HTML_BROADCAST, + sendEmail: false, + sendSegment: false, + metadata: { + html, + }, + userWalletAddress: user.walletAddress as string, + trackId, + }); + } + sendBroadcastNotificationsQueue.add(queueData); + } } async projectsHaveNewRank(params: ProjectsHaveNewRankingInputParam) { - return; - // for (const param of params.projectRanks) { - // const project = await findProjectById(param.projectId); - // if (!project) { - // continue; - // } - // const projectOwner = project.adminUser; - // let eventName; - - // // https://github.com/Giveth/impact-graph/issues/774#issuecomment-1542337083 - // if ( - // param.oldRank === params.oldBottomRank && - // param.newRank === params.newBottomRank - // ) { - // // We dont send any notification in this case, because project has no givPower so rank change doesnt matter - // continue; - // } else if (param.oldRank === params.oldBottomRank) { - // eventName = NOTIFICATIONS_EVENT_NAMES.YOUR_PROJECT_GOT_A_RANK; - // } else if (param.newRank < param.oldRank) { - // eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_RISEN_IN_THE_RANK; - // } else if (param.newRank > param.oldRank) { - // eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_A_NEW_RANK; - // } - // logger.info('send rank changed notification ', { - // eventName, - // slug: project.slug, - // newRank: param.newRank, - // oldRank: param.oldRank, - // oldBottomRank: params.oldBottomRank, - // newBottomRank: params.newBottomRank, - // }); - // await sendProjectRelatedNotificationsQueue.add({ - // project, - // eventName, - // sendEmail: true, - // segment: { - // analyticsUserId: projectOwner.segmentUserId(), - // anonymousId: projectOwner.segmentUserId(), - // payload: getSegmentProjectAttributes({ - // project, - // }), - // }, - // trackId: `project-has-new-rank-${param.round}-${param.projectId}`, - // }); - // } + for (const param of params.projectRanks) { + const project = await findProjectById(param.projectId); + if (!project) { + continue; + } + const projectOwner = project.adminUser; + let eventName; + + // https://github.com/Giveth/impact-graph/issues/774#issuecomment-1542337083 + if ( + param.oldRank === params.oldBottomRank && + param.newRank === params.newBottomRank + ) { + // We dont send any notification in this case, because project has no givPower so rank change doesnt matter + continue; + } else if (param.oldRank === params.oldBottomRank) { + eventName = NOTIFICATIONS_EVENT_NAMES.YOUR_PROJECT_GOT_A_RANK; + } else if (param.newRank < param.oldRank) { + eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_RISEN_IN_THE_RANK; + } else if (param.newRank > param.oldRank) { + eventName = NOTIFICATIONS_EVENT_NAMES.PROJECT_HAS_A_NEW_RANK; + } + logger.info('send rank changed notification ', { + eventName, + slug: project.slug, + newRank: param.newRank, + oldRank: param.oldRank, + oldBottomRank: params.oldBottomRank, + newBottomRank: params.newBottomRank, + }); + await sendProjectRelatedNotificationsQueue.add({ + project, + eventName, + sendEmail: true, + segment: { + analyticsUserId: projectOwner.segmentUserId(), + anonymousId: projectOwner.segmentUserId(), + payload: getSegmentProjectAttributes({ + project, + }), + }, + trackId: `project-has-new-rank-${param.round}-${param.projectId}`, + }); + } } } From c7e09c4ef4551f724cbf812a01a7333a38ac6b15 Mon Sep 17 00:00:00 2001 From: Carlos Date: Tue, 16 Jan 2024 11:42:52 -0500 Subject: [PATCH 4/6] set logic as before, comment notification center methods not required --- .../NotificationCenterAdapter.ts | 170 +++++++++--------- src/resolvers/projectResolver.ts | 14 +- src/resolvers/reactionResolver.ts | 5 + src/services/donationService.ts | 8 + 4 files changed, 113 insertions(+), 84 deletions(-) diff --git a/src/adapters/notifications/NotificationCenterAdapter.ts b/src/adapters/notifications/NotificationCenterAdapter.ts index 939bdc5c9..7a031f420 100644 --- a/src/adapters/notifications/NotificationCenterAdapter.ts +++ b/src/adapters/notifications/NotificationCenterAdapter.ts @@ -114,36 +114,37 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { project: Project; donor: User; }): Promise { - const { project, donor, donation } = params; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.MADE_DONATION, - user: { - email: donor.email, - walletAddress: donor.walletAddress as string, - }, - sendEmail: true, - segment: { - analyticsUserId: donor.segmentUserId(), - anonymousId: donor.segmentUserId(), - payload: { - ...getSegmentDonationAttributes({ - donation, - project, - user: donor, - }), - - // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() - // see https://github.com/Giveth/impact-graph/pull/716 - fromWalletAddress: donation.fromWalletAddress.toLowerCase(), - }, - }, - trackId: - 'donation-sent-' + - donation.transactionNetworkId + - '-' + - donation.transactionId, - }); + return; + // const { project, donor, donation } = params; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: projectEdited.MADE_DONATION, + // user: { + // email: donor.email, + // walletAddress: donor.walletAddress as string, + // }, + // sendEmail: true, + // segment: { + // analyticsUserId: donor.segmentUserId(), + // anonymousId: donor.segmentUserId(), + // payload: { + // ...getSegmentDonationAttributes({ + // donation, + // project, + // user: donor, + // }), + + // // We just want this to be donation sent event not made donation, so don put it in getSegmentDonationAttributes() + // // see https://github.com/Giveth/impact-graph/pull/716 + // fromWalletAddress: donation.fromWalletAddress.toLowerCase(), + // }, + // }, + // trackId: + // 'donation-sent-' + + // donation.transactionNetworkId + + // '-' + + // donation.transactionId, + // }); } async projectVerified(params: { project: Project }): Promise { @@ -406,19 +407,20 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { project: Project; userId: number; }): Promise { - const { project } = params; - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, - - // With adding trackId to notification, notification-center would not create new notification - // If there is already a notification with this trackId in DB - trackId: generateTrackId({ - userId: params.userId, - projectId: project?.id as number, - action: 'likeProject', - }), - }); + return; + // const { project } = params; + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_RECEIVED_HEART, + + // // With adding trackId to notification, notification-center would not create new notification + // // If there is already a notification with this trackId in DB + // trackId: generateTrackId({ + // userId: params.userId, + // projectId: project?.id as number, + // action: 'likeProject', + // }), + // }); } ProfileIsCompleted(params: { user: User }): Promise { @@ -630,26 +632,27 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { } async projectEdited(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-edited-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.PROJECT_EDITED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-edited-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectGotDraftByAdmin(params: { project: Project }): Promise { const { project } = params; @@ -674,26 +677,27 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { } async projectPublished(params: { project: Project }): Promise { - const { project } = params; - const projectOwner = project?.adminUser as User; - const now = Date.now(); - - await sendProjectRelatedNotificationsQueue.add({ - project, - eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, - - sendEmail: true, - segment: { - analyticsUserId: projectOwner.segmentUserId(), - anonymousId: projectOwner.segmentUserId(), - payload: getSegmentProjectAttributes({ - project, - }), - }, - trackId: `project-published-${ - project.id - }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, - }); + return; + // const { project } = params; + // const projectOwner = project?.adminUser as User; + // const now = Date.now(); + + // await sendProjectRelatedNotificationsQueue.add({ + // project, + // eventName: NOTIFICATIONS_EVENT_NAMES.DRAFTED_PROJECT_ACTIVATED, + + // sendEmail: true, + // segment: { + // analyticsUserId: projectOwner.segmentUserId(), + // anonymousId: projectOwner.segmentUserId(), + // payload: getSegmentProjectAttributes({ + // project, + // }), + // }, + // trackId: `project-published-${ + // project.id + // }-${projectOwner.walletAddress?.toLowerCase()}-${now}`, + // }); } async projectReactivated(params: { project: Project }): Promise { diff --git a/src/resolvers/projectResolver.ts b/src/resolvers/projectResolver.ts index 02f3f4e08..b21ed5f69 100644 --- a/src/resolvers/projectResolver.ts +++ b/src/resolvers/projectResolver.ts @@ -1054,6 +1054,10 @@ export class ProjectResolver { project.addresses = await findProjectRecipientAddressByProjectId({ projectId, }); + + // Edit emails + await getNotificationAdapter().projectEdited({ project }); + return project; } @@ -1327,6 +1331,10 @@ export class ProjectResolver { await getNotificationAdapter().projectSavedAsDraft({ project, }); + } else { + await getNotificationAdapter().projectPublished({ + project, + }); } return project; @@ -1969,7 +1977,11 @@ export class ProjectResolver { await project.save(); - if (project.prevStatusId !== ProjStatus.drafted) { + if (project.prevStatusId === ProjStatus.drafted) { + await getNotificationAdapter().projectPublished({ + project, + }); + } else { await getNotificationAdapter().projectReactivated({ project, }); diff --git a/src/resolvers/reactionResolver.ts b/src/resolvers/reactionResolver.ts index 5cc0df298..b38b89d66 100644 --- a/src/resolvers/reactionResolver.ts +++ b/src/resolvers/reactionResolver.ts @@ -213,6 +213,11 @@ export class ReactionResolver { // commit transaction now: await queryRunner.commitTransaction(); + await getNotificationAdapter().projectReceivedHeartReaction({ + project, + userId: user.userId, + }); + return reaction; } catch (e) { logger.error('like project error', e); diff --git a/src/services/donationService.ts b/src/services/donationService.ts index f753ef941..61de30b16 100644 --- a/src/services/donationService.ts +++ b/src/services/donationService.ts @@ -468,6 +468,14 @@ export const sendSegmentEventForDonation = async (params: { project, }); } + + if (donorUser) { + await getNotificationAdapter().donationSent({ + donation, + project, + donor: donorUser, + }); + } }; export const insertDonationsFromQfRoundHistory = async (): Promise => { From e9124d2660fcefb383d92a3ec5ea076dfe988e4d Mon Sep 17 00:00:00 2001 From: Carlos Date: Tue, 16 Jan 2024 12:02:03 -0500 Subject: [PATCH 5/6] move donation received logic to notification adapter --- src/adapters/notifications/NotificationCenterAdapter.ts | 3 +++ src/services/donationService.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/adapters/notifications/NotificationCenterAdapter.ts b/src/adapters/notifications/NotificationCenterAdapter.ts index 7a031f420..aeccaed47 100644 --- a/src/adapters/notifications/NotificationCenterAdapter.ts +++ b/src/adapters/notifications/NotificationCenterAdapter.ts @@ -86,6 +86,8 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { donation: Donation; project: Project; }): Promise { + if (params.donation.valueUsd <= 1) return; + const { project, donation } = params; const user = project.adminUser as User; await sendProjectRelatedNotificationsQueue.add({ @@ -631,6 +633,7 @@ export class NotificationCenterAdapter implements NotificationAdapterInterface { }); } + // commenting for now to test load of notification center. async projectEdited(params: { project: Project }): Promise { return; // const { project } = params; diff --git a/src/services/donationService.ts b/src/services/donationService.ts index 61de30b16..c1929278c 100644 --- a/src/services/donationService.ts +++ b/src/services/donationService.ts @@ -462,7 +462,7 @@ export const sendSegmentEventForDonation = async (params: { } const donorUser = await findUserById(donation.userId); const projectOwner = project.adminUser; - if (projectOwner && donation.valueUsd > 1) { + if (projectOwner) { await getNotificationAdapter().donationReceived({ donation, project, From 0934dfd2472882ee9cf1ced722595b19e95c2af9 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 17 Jan 2024 08:47:18 -0500 Subject: [PATCH 6/6] 1.19.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1da9b952..0b239f8f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "giveth-graphql-api", - "version": "1.18.0", + "version": "1.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "giveth-graphql-api", - "version": "1.18.0", + "version": "1.19.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7edc59e8f..1630dcfb4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "giveth-graphql-api", - "version": "1.18.0", + "version": "1.19.0", "description": "Backend GraphQL server for Giveth originally forked from Topia", "main": "./dist/index.js", "dependencies": {