diff --git a/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts b/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts index 7fbd8a9de..1add200e8 100644 --- a/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts +++ b/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts @@ -8,7 +8,8 @@ import { UserEntity } from '../../user/user.entity.js'; import { UserActionEntity } from '../user-action.entity.js'; import { buildNewConnectionNotFinishedEmailSentAction } from '../utils/build-new-user-action-entity.js'; import { ICheckUsersActionsAndMailingUsers } from './use-cases-interfaces.js'; - +import PQueue from 'p-queue'; +import Sentry from '@sentry/minimal'; @Injectable() export class CheckUsersActionsAndMailingUsersUseCase implements ICheckUsersActionsAndMailingUsers { constructor( @@ -18,26 +19,30 @@ export class CheckUsersActionsAndMailingUsersUseCase implements ICheckUsersActio private readonly userRepository: Repository, ) {} public async execute(): Promise> { - console.info('Updating actions with mailing started'); - const nonFinishedUsersActions = await this.findAllNonFinishedActionsTwoWeeksOld(); - const usersWithoutLogs = await this.findUsersWithoutLogs(); - const usersFromActions: Array = nonFinishedUsersActions.map((action: UserActionEntity) => action.user); - const allUsersArray: Array = usersWithoutLogs.concat(usersFromActions); - const filteredUsers: Array<{ id: string; email: string }> = Array.from(new Set(allUsersArray.map((u) => u.id))).map( - (id) => { + try { + const nonFinishedUsersActions = await this.findAllNonFinishedActionsTwoWeeksOld(); + const usersWithoutLogs = await this.findUsersWithoutLogs(); + const usersFromActions: Array = nonFinishedUsersActions.map( + (action: UserActionEntity) => action.user, + ); + const allUsersArray: Array = usersWithoutLogs.concat(usersFromActions); + const filteredUsers: Array<{ id: string; email: string }> = Array.from( + new Set(allUsersArray.map((u) => u.id)), + ).map((id) => { return { id: id, email: allUsersArray.find((u) => u.id === id).email, }; - }, - ); - await Promise.allSettled( - filteredUsers.map(async (u) => { - await this.updateOrCreateActionForUser(u); - }), - ); - const userEmails = filteredUsers.map((u) => u.email?.toLowerCase()); - return getUniqArrayStrings(userEmails); + }); + const queue = new PQueue({ concurrency: 3 }); + await Promise.all(filteredUsers.map((u) => queue.add(() => this.updateOrCreateActionForUser(u)))); + const userEmails = filteredUsers.map((u) => u.email?.toLowerCase()); + return getUniqArrayStrings(userEmails); + } catch (e) { + Sentry.captureException(e); + console.error(e); + return []; + } } private async updateOrCreateActionForUser(u: { id: string; email: string }): Promise {