Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/better directory structure #5

Merged
merged 2 commits into from
Nov 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 };