Skip to content

Commit

Permalink
chore: refactored queue mail provider
Browse files Browse the repository at this point in the history
  • Loading branch information
demmorou committed Sep 29, 2021
1 parent c05e240 commit 6f17f73
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 47 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"scripts": {
"build": "rimraf build; babel src --extensions \".js,.ts\" --out-dir build --copy-files --no-copy-ignored",
"dev": "tsnd -r tsconfig-paths/register --transpile-only --ignore-watch node_modules --respawn src/app.ts",
"dev:queue": "tsnd -r tsconfig-paths/register --transpile-only --ignore-watch node_modules --respawn src/infra/queue/worker.ts",
"dev:queue": "tsnd -r tsconfig-paths/register --transpile-only --ignore-watch node_modules --respawn src/infra/poller/QueuePoller.ts",
"lint": "eslint src --ext .ts --fix"
},
"dependencies": {
Expand Down
4 changes: 2 additions & 2 deletions src/infra/queue/worker.ts → src/infra/poller/QueuePoller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import IMailProvider from '~infra/providers/MailProvider/models/IMailProvider';
import IMailQueueProvider from '~infra/providers/QueueProvider/models/IMailQueueProvider';
import { Logger } from '~infra/tools/log/types';

const worker = async (container: AwilixContainer): Promise<void> => {
const queuePoller = async (container: AwilixContainer): Promise<void> => {
const mailQueueProvider =
container.resolve<IMailQueueProvider>('mailQueueProvider');
const mailProvider = container.resolve<IMailProvider>('mailProvider');
Expand Down Expand Up @@ -37,5 +37,5 @@ const worker = async (container: AwilixContainer): Promise<void> => {
(async () => {
const container = await setupContainer(config);

await worker(container);
await queuePoller(container);
})();
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import { Queue, Processor, Worker, QueueScheduler } from 'bullmq';

import { AppContainer } from '~infra/bootstrap/container';
import { Config } from '~infra/config';
import SendMailDTO from '~infra/providers/MailProvider/dtos/SendMailDTO';
import { Logger } from '~infra/tools/log/types';

import IMailQueueProvider from '../models/IMailQueueProvider';
import IMailQueueProvider, { IJob } from '../models/IMailQueueProvider';

class BullQueueProvider implements IMailQueueProvider {
private logger: Logger;
Expand All @@ -25,38 +26,21 @@ class BullQueueProvider implements IMailQueueProvider {
defaultJobOptions: {
removeOnComplete: true,
attempts: 5,
backoff: {
type: 'exponential',
delay: 5000,
},
},
});
}

async addManyJobs(jobs: string[]): Promise<void> {
const parsedJobs = jobs.map((jobData) => {
return { name: 'message', data: jobData };
});

await this.queue.addBulk(parsedJobs);
}

async addJob(job: string): Promise<void> {
async addJob(job: IJob): Promise<void> {
await this.queue.add('message', job);
}

process(processFunction: Processor<string>): void {
process(processFunction: Processor<SendMailDTO>): void {
new Worker('mail-queue', processFunction, {
connection: {
host: this.config.redis.host,
password: this.config.redis.password,
port: this.config.redis.port,
},
concurrency: 100,
limiter: {
max: 400,
duration: 1000,
},
});

new QueueScheduler('mail-queue', {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import SendMailDTO from '~infra/providers/MailProvider/dtos/SendMailDTO';

export interface IJob {
data: string;
data: SendMailDTO;
}

interface IMailQueueProvider {
addJob(job: string): Promise<void>;
addManyJobs(jobs: string[]): Promise<void>;
addJob(job: IJob): Promise<void>;
process(processFunction: (job: IJob) => Promise<void>): void;
}

Expand Down
38 changes: 17 additions & 21 deletions src/useCases/SendMail/SendMail.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,31 @@
import { AppContainer } from '~infra/bootstrap/container';
import IMailProvider from '~infra/providers/MailProvider/models/IMailProvider';
import IMailQueueProvider from '~infra/providers/QueueProvider/models/IMailQueueProvider';
import { Logger } from '~infra/tools/log/types';

class SendMail {
private logger: Logger;
private mailQueueProvider: IMailQueueProvider;

constructor(params: AppContainer) {
this.logger = params.logger;
this.mailQueueProvider = params.mailQueueProvider;
}

public async execute(input: string): Promise<void> {
// await this.mailProvider.sendMail({
// from: {
// email: '[email protected]',
// name: 'deusimar',
// },
// html: '<div><p>Olá {{name}}</p></div>',
// subject: 'Ola test',
// to: {
// email: '[email protected]',
// name: 'deusimar',
// },
// variables: {
// name: input,
// },
// });

await this.mailQueueProvider.addJob('Oi');
await this.mailQueueProvider.addJob({
data: {
from: {
email: 'deusimar@deusimar.com',
name: 'deusimar',
},
html: '<div><strong>Olá {{name}}</strong></div>',
subject: 'Ola test',
to: {
email: 'deusimar@deusimar.com',
name: 'deusimar',
},
variables: {
name: input,
},
},
});
}
}

Expand Down

0 comments on commit 6f17f73

Please sign in to comment.