Skip to content

Commit

Permalink
Fix/better directory structure (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
genzyy committed Nov 12, 2023
1 parent 066b01d commit e0beab0
Show file tree
Hide file tree
Showing 13 changed files with 58 additions and 36 deletions.
13 changes: 6 additions & 7 deletions src/controllers/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -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 ?? '');
Expand All @@ -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');
Expand All @@ -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 });
});

Expand Down
3 changes: 3 additions & 0 deletions src/controllers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import AuthController from './auth.controller';

export { AuthController };
10 changes: 5 additions & 5 deletions src/queues/email/email.queue.ts
Original file line number Diff line number Diff line change
@@ -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>(EMAIL_QUEUE_IDENTIFIER, {
connection: redisConfig,
export const EmailQueue = new Queue<Email>(EMAIL_QUEUE_IDENTIFIER, {
connection: queueRedisConfig,
});

EmailWorker.on('ready', () => {
Expand All @@ -17,7 +17,7 @@ EmailWorker.on('completed', (job: Job<Email>) => {
logger.info(`Email sent to ${job.data.recipient} from ${job.data.sender}.`);
});

EmailWorker.on('failed', (job: Job<Email> | undefined, error) => {
EmailWorker.on('failed', (job: Job<Email> | undefined, error: any) => {
logger.warn(`Sending email failed to ${job?.data.recipient} with error ${error}`);
captureException(error, {
recipient: job?.data.recipient,
Expand Down
8 changes: 3 additions & 5 deletions src/queues/email/email.worker.ts
Original file line number Diff line number Diff line change
@@ -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;
4 changes: 4 additions & 0 deletions src/queues/email/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { EmailQueue } from './email.queue';
import { EmailWorker } from './email.worker';

export { EmailQueue, EmailWorker };
13 changes: 13 additions & 0 deletions src/queues/email/queueRedisConfig.ts
Original file line number Diff line number Diff line change
@@ -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.');
});
12 changes: 0 additions & 12 deletions src/queues/email/redisConfig.ts

This file was deleted.

4 changes: 4 additions & 0 deletions src/repositories/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import UserRepository from './user';
import ApiMetadataRepository from './apiMetadata';

export { UserRepository, ApiMetadataRepository };
8 changes: 4 additions & 4 deletions src/routes/v1/auth.route.ts
Original file line number Diff line number Diff line change
@@ -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;
4 changes: 2 additions & 2 deletions src/services/email.service.ts
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -9,7 +9,7 @@ const sendOnboardingEmail = async (recipient: string, name: string) => {
html: `<h1>Welcome ${name}</h1>`,
subject: `Welcome to the app, ${name}`,
};
await emailQueue.add('onboarding-email', emailData);
await EmailQueue.add('onboarding-email', emailData);
};

export default { sendOnboardingEmail };
4 changes: 4 additions & 0 deletions src/services/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import EmailService from './email.service';
import JwtService from './jwt.service';

export { EmailService, JwtService };
2 changes: 1 addition & 1 deletion src/types/user.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
9 changes: 9 additions & 0 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -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 };

0 comments on commit e0beab0

Please sign in to comment.