set-up-node-mvc
Version:
A NPM package for set up mvc architecture for node and express with selected language and database
138 lines (120 loc) • 3.6 kB
JavaScript
// TypeScript template content
const tsTemplates = {
userController: `
const { Request, Response } = require('express');
const { registerUser, loginUser } = require('../services/userService');
const create = async (req: Request, res: Response): Promise<Response> => {
try {
const response = await registerUser({
email: req.body.email,
password: req.body.password
});
return res.status(201).json({
success: true,
message: 'Successfully created a new user',
data: response,
err: {}
});
} catch (error: any) {
return res.status(error.statusCode || 500).json({
message: error.message,
data: {},
success: false,
err: error.explanation || error
});
}
};
const signIn = async (req: Request, res: Response): Promise<Response> => {
try {
const response = await loginUser(req.body.email, req.body.password);
return res.status(200).json({
success: true,
data: response,
err: {},
message: 'Successfully signed in'
});
} catch (error: any) {
return res.status(error.statusCode || 500).json({
message: error.message,
data: {},
success: false,
err: error.explanation || error
});
}
};
module.exports = {
create,
signIn
};
`,
userService: `
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const { createUser, findUserByEmail } = require('../repositories/userRepository');
require('dotenv').config();
const JWT_KEY = process.env.JWT_KEY;
interface UserData {
email: string;
password: string;
}
const registerUser = async (userData: UserData): Promise<any> => {
const existingUser = await findUserByEmail(userData.email);
if (existingUser) {
throw new Error('User already exists');
}
const hashedPassword = await bcrypt.hash(userData.password, 10);
const newUser = await createUser({
...userData,
password: hashedPassword
});
return newUser;
};
const loginUser = async (email: string, plainPassword: string): Promise<string> => {
const user = await findUserByEmail(email);
if (!user) {
throw new Error('User not found');
}
const isMatch = await bcrypt.compare(plainPassword, user.password);
if (!isMatch) {
throw new Error('Invalid credentials');
}
const token = jwt.sign({ id: user.id }, JWT_KEY, { expiresIn: '1h' });
return token;
};
module.exports = {
registerUser,
loginUser
};
`,
userRepository: `
const { User } = require('../models/user');
interface UserAttributes {
email: string;
password: string;
}
const createUser = async (data: UserAttributes): Promise<any> => {
try {
const user = await User.create(data);
return user;
} catch (error) {
throw { error };
}
};
const findUserByEmail = async (email: string): Promise<any> => {
return await User.findOne({ where: { email } });
};
module.exports = {
createUser,
findUserByEmail
};
`,
userRoute: `
import express, { Router } from 'express';
const { create, signIn } = require('../controllers/userController');
const router: Router = express.Router();
router.post('/signup', create);
router.post('/signin', signIn);
module.exports = router;
`,
};
module.exports = tsTemplates;