diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 34883a9..7b0354e 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -3,6 +3,7 @@ import { Request, Response } from 'express'; import userRepository from '../repositories/user'; import catchAsync from '../utils/catchAsync'; import JwtService from '../services/jwt.service'; +import EmailService from '../services/email.service'; import { NotFound, Unauthorized } from '../utils/ApiError'; import exclude from '../utils/exclude'; import { UserReturn } from '../types/user'; @@ -12,6 +13,8 @@ const register = catchAsync(async (req: Request, res: Response) => { const user = await userRepository.createUser(username, email, password); const tokens = JwtService.generateAuthTokenForUser(user.id); + await EmailService.sendOnboardingEmail(user.email, user.name ?? ''); + return res.status(CREATED).send({ user: exclude(user, ['id', 'password', 'signedOut']), tokens }); }); diff --git a/src/core/config.ts b/src/core/config.ts index d74732d..df3c160 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -17,6 +17,7 @@ const envVarsSchema = Joi.object() SHOW_SQL_QUERIES: Joi.bool().default(false), SENTRY_DSN: Joi.string().default(''), SENTRY_ENVIRONMENT: Joi.string().default('development'), + COMPANY_SENDER_EMAIL: Joi.string().email().default('no-reply@company.com'), QUEUE_REDIS_HOST: Joi.string().default(''), QUEUE_REDIS_PORT: Joi.number().default(6379), QUEUE_CONCURRENCY: Joi.number().default(1), @@ -51,10 +52,13 @@ export default { dsn: envVars.SENTRY_DSN, environment: envVars.SENTRY_ENVIRONMENT, }, - queue: { - redisHost: envVars.QUEUE_REDIS_HOST, - redisPort: envVars.QUEUE_REDIS_PORT, - concurrency: envVars.QUEUE_CONCURRENCY, + emailService: { + companySenderEmail: envVars.COMPANY_SENDER_EMAIL, + queue: { + redisHost: envVars.QUEUE_REDIS_HOST, + redisPort: envVars.QUEUE_REDIS_PORT, + concurrency: envVars.QUEUE_CONCURRENCY, + }, }, aws: { region: envVars.AWS_REGION, diff --git a/src/queues/email/emai.queue.ts b/src/queues/email/email.queue.ts similarity index 72% rename from src/queues/email/emai.queue.ts rename to src/queues/email/email.queue.ts index 3ebb4ca..39e5ee4 100644 --- a/src/queues/email/emai.queue.ts +++ b/src/queues/email/email.queue.ts @@ -6,7 +6,7 @@ export const EMAIL_QUEUE_NAME = 'mail-queue'; export const emailQueue = new Queue(EMAIL_QUEUE_NAME, { connection: { - host: config.queue.redisHost, - port: config.queue.redisPort, + host: config.emailService.queue.redisHost, + port: config.emailService.queue.redisPort, }, }); diff --git a/src/queues/email/email.worker.ts b/src/queues/email/email.worker.ts index 1965b39..ab41ceb 100644 --- a/src/queues/email/email.worker.ts +++ b/src/queues/email/email.worker.ts @@ -5,10 +5,10 @@ const MAIL_WORKER_NAME = 'MailWorker'; const EmailWorker = new Worker(MAIL_WORKER_NAME, __dirname + 'email.processor.ts', { connection: { - host: config.queue.redisHost, - port: config.queue.redisPort, + host: config.emailService.queue.redisHost, + port: config.emailService.queue.redisPort, }, - concurrency: config.queue.concurrency, + concurrency: config.emailService.queue.concurrency, }); export default EmailWorker; diff --git a/src/services/email.service.ts b/src/services/email.service.ts new file mode 100644 index 0000000..24c43e9 --- /dev/null +++ b/src/services/email.service.ts @@ -0,0 +1,15 @@ +import { emailQueue, EMAIL_QUEUE_NAME } from '../queues/email/email.queue'; +import config from '../core/config'; +import { Email } from '../types/email'; + +const sendOnboardingEmail = async (recipient: string, name: string) => { + const emailData: Email = { + recipient: recipient, + sender: config.emailService.companySenderEmail, + html: `

Welcome ${name}

`, + subject: `Welcome to the app, ${name}`, + }; + await emailQueue.add(EMAIL_QUEUE_NAME, emailData); +}; + +export default { sendOnboardingEmail };