From e0beab067116ce6e07199c92640a24ddc251cf77 Mon Sep 17 00:00:00 2001 From: Rishit Date: Sun, 12 Nov 2023 23:04:56 +0530 Subject: [PATCH] Fix/better directory structure (#5) --- src/controllers/auth.controller.ts | 13 ++++++------- src/controllers/index.ts | 3 +++ src/queues/email/email.queue.ts | 10 +++++----- src/queues/email/email.worker.ts | 8 +++----- src/queues/email/index.ts | 4 ++++ src/queues/email/queueRedisConfig.ts | 13 +++++++++++++ src/queues/email/redisConfig.ts | 12 ------------ src/repositories/index.ts | 4 ++++ src/routes/v1/auth.route.ts | 8 ++++---- src/services/email.service.ts | 4 ++-- src/services/index.ts | 4 ++++ src/types/user.ts | 2 +- src/utils/index.ts | 9 +++++++++ 13 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 src/controllers/index.ts create mode 100644 src/queues/email/index.ts create mode 100644 src/queues/email/queueRedisConfig.ts delete mode 100644 src/queues/email/redisConfig.ts create mode 100644 src/repositories/index.ts create mode 100644 src/services/index.ts create mode 100644 src/utils/index.ts diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index b8b1d5f..547d42d 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -1,16 +1,15 @@ import { CREATED, OK } from 'http-status'; import { Request, Response } from 'express'; -import userRepository from '../repositories/user'; -import catchAsync from '../utils/catchAsync'; -import JwtService from '../services/jwt.service'; +import { UserRepository } from '../repositories'; +import { catchAsync, exclude } from '../utils'; +import { JwtService } from '../services'; import EmailService from '../services/email.service'; import { NotFound, Unauthorized } from '../utils/ApiError'; -import exclude from '../utils/exclude'; import { UserReturn } from '../types/user'; const register = catchAsync(async (req: Request, res: Response) => { const { email, username, password } = req.body; - const user = await userRepository.createUser(username, email, password); + const user = await UserRepository.createUser(username, email, password); const tokens = JwtService.generateAuthTokenForUser(user.id); await EmailService.sendOnboardingEmail(user.email, user.name ?? ''); @@ -22,7 +21,7 @@ const login = catchAsync(async (req: Request, res: Response) => { const { email, password } = req.body; const accessToken = await getUserAccessToken(req); const userId = JwtService.verifyToken(accessToken); - const user = await userRepository.getUserByEmailAndId(email, userId); + const user = await UserRepository.getUserByEmailAndId(email, userId); if (!user) { throw new NotFound('User not found'); @@ -36,7 +35,7 @@ const login = catchAsync(async (req: Request, res: Response) => { const getMe = catchAsync(async (req: Request, res: Response) => { const accessToken = await getUserAccessToken(req); const userId = JwtService.verifyToken(accessToken); - const dbUser = await userRepository.getUser(userId, UserReturn); + const dbUser = await UserRepository.getUser(userId, UserReturn); return res.status(OK).send({ ...dbUser }); }); diff --git a/src/controllers/index.ts b/src/controllers/index.ts new file mode 100644 index 0000000..ef0d4cb --- /dev/null +++ b/src/controllers/index.ts @@ -0,0 +1,3 @@ +import AuthController from './auth.controller'; + +export { AuthController }; diff --git a/src/queues/email/email.queue.ts b/src/queues/email/email.queue.ts index 158774c..7b767f0 100644 --- a/src/queues/email/email.queue.ts +++ b/src/queues/email/email.queue.ts @@ -1,12 +1,12 @@ import { EMAIL_QUEUE_IDENTIFIER, Email } from '../../types/email'; import { Queue, Job } from 'bullmq'; -import { redisConfig } from './redisConfig'; -import EmailWorker from './email.worker'; +import { queueRedisConfig } from './queueRedisConfig'; +import { EmailWorker } from './email.worker'; import logger from '../../core/logger'; import { captureException } from '../../core/sentry'; -export const emailQueue = new Queue(EMAIL_QUEUE_IDENTIFIER, { - connection: redisConfig, +export const EmailQueue = new Queue(EMAIL_QUEUE_IDENTIFIER, { + connection: queueRedisConfig, }); EmailWorker.on('ready', () => { @@ -17,7 +17,7 @@ EmailWorker.on('completed', (job: Job) => { logger.info(`Email sent to ${job.data.recipient} from ${job.data.sender}.`); }); -EmailWorker.on('failed', (job: Job | undefined, error) => { +EmailWorker.on('failed', (job: Job | undefined, error: any) => { logger.warn(`Sending email failed to ${job?.data.recipient} with error ${error}`); captureException(error, { recipient: job?.data.recipient, diff --git a/src/queues/email/email.worker.ts b/src/queues/email/email.worker.ts index fff5e0e..562d709 100644 --- a/src/queues/email/email.worker.ts +++ b/src/queues/email/email.worker.ts @@ -1,9 +1,7 @@ import { Worker } from 'bullmq'; -import { redisConfig } from './redisConfig'; +import { queueRedisConfig } from './queueRedisConfig'; import { EMAIL_QUEUE_IDENTIFIER } from '../../types/email'; -const EmailWorker = new Worker(EMAIL_QUEUE_IDENTIFIER, __dirname + '/email.processor.ts', { - connection: redisConfig, +export const EmailWorker = new Worker(EMAIL_QUEUE_IDENTIFIER, __dirname + '/email.processor.ts', { + connection: queueRedisConfig, }); - -export default EmailWorker; diff --git a/src/queues/email/index.ts b/src/queues/email/index.ts new file mode 100644 index 0000000..9d3b0a9 --- /dev/null +++ b/src/queues/email/index.ts @@ -0,0 +1,4 @@ +import { EmailQueue } from './email.queue'; +import { EmailWorker } from './email.worker'; + +export { EmailQueue, EmailWorker }; diff --git a/src/queues/email/queueRedisConfig.ts b/src/queues/email/queueRedisConfig.ts new file mode 100644 index 0000000..129d78e --- /dev/null +++ b/src/queues/email/queueRedisConfig.ts @@ -0,0 +1,13 @@ +import Redis from 'ioredis'; +import logger from '../../core/logger'; +import config from '../../core/config'; + +export const queueRedisConfig = new Redis({ + port: config.emailService.queue.redisPort, + host: config.emailService.queue.redisHost, + maxRetriesPerRequest: null, +}); + +queueRedisConfig.connect(() => { + logger.info('Connected to queue redis.'); +}); diff --git a/src/queues/email/redisConfig.ts b/src/queues/email/redisConfig.ts deleted file mode 100644 index e87ca29..0000000 --- a/src/queues/email/redisConfig.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Redis from 'ioredis'; -import logger from '../../core/logger'; - -export const redisConfig = new Redis({ - port: 6380, - host: '127.0.0.1', - maxRetriesPerRequest: null, -}); - -redisConfig.connect(() => { - logger.info('Connected to queue redis.'); -}); diff --git a/src/repositories/index.ts b/src/repositories/index.ts new file mode 100644 index 0000000..0379283 --- /dev/null +++ b/src/repositories/index.ts @@ -0,0 +1,4 @@ +import UserRepository from './user'; +import ApiMetadataRepository from './apiMetadata'; + +export { UserRepository, ApiMetadataRepository }; diff --git a/src/routes/v1/auth.route.ts b/src/routes/v1/auth.route.ts index b62cbb4..3b39c2a 100644 --- a/src/routes/v1/auth.route.ts +++ b/src/routes/v1/auth.route.ts @@ -1,14 +1,14 @@ import express from 'express'; import validate from '../../core/middlewares/validator'; import authValidation from '../../validations/auth.validation'; -import authController from '../../controllers/auth.controller'; +import { AuthController } from '../../controllers/'; const router = express.Router(); -router.post('/register', validate(authValidation.register), authController.register); -router.post('/login', validate(authValidation.login), authController.login); +router.post('/register', validate(authValidation.register), AuthController.register); +router.post('/login', validate(authValidation.login), AuthController.login); router.post('/logout'); -router.get('/me', validate(authValidation.getMe), authController.getMe); +router.get('/me', validate(authValidation.getMe), AuthController.getMe); router.post('/refresh-tokens'); export default router; diff --git a/src/services/email.service.ts b/src/services/email.service.ts index a66aa6f..be1f703 100644 --- a/src/services/email.service.ts +++ b/src/services/email.service.ts @@ -1,4 +1,4 @@ -import { emailQueue } from '../queues/email/email.queue'; +import { EmailQueue } from '../queues/email/email.queue'; import config from '../core/config'; import { Email } from '../types/email'; @@ -9,7 +9,7 @@ const sendOnboardingEmail = async (recipient: string, name: string) => { html: `

Welcome ${name}

`, subject: `Welcome to the app, ${name}`, }; - await emailQueue.add('onboarding-email', emailData); + await EmailQueue.add('onboarding-email', emailData); }; export default { sendOnboardingEmail }; diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 0000000..c082898 --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1,4 @@ +import EmailService from './email.service'; +import JwtService from './jwt.service'; + +export { EmailService, JwtService }; diff --git a/src/types/user.ts b/src/types/user.ts index 3465b0d..ddec5b7 100644 --- a/src/types/user.ts +++ b/src/types/user.ts @@ -1,6 +1,6 @@ import { User as UserModel } from '@prisma/client'; import Joi from 'joi'; -import include from '../utils/include'; +import { include } from '../utils'; export type Key = keyof UserModel; diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..6d6e65a --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,9 @@ +import ApiError from './ApiError'; +import exclude from './exclude'; +import include from './include'; +import catchAsync from './catchAsync'; +import filter from './filter'; +import getKeys from './getKeys'; +import { TupleUnion } from './TupleUnion'; + +export { ApiError, exclude, include, catchAsync, filter, getKeys, TupleUnion };