js-mvc-app
Version:
A CLI tool to scaffold complete Node.js MVC projects with TypeScript, just like Laravel
368 lines (307 loc) • 10.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getJavaScriptExpressApp = getJavaScriptExpressApp;
exports.getJavaScriptExpressController = getJavaScriptExpressController;
exports.getJavaScriptExpressRoutes = getJavaScriptExpressRoutes;
exports.getJavaScriptUserRoutes = getJavaScriptUserRoutes;
exports.getJavaScriptAuthMiddleware = getJavaScriptAuthMiddleware;
exports.getJavaScriptErrorHandler = getJavaScriptErrorHandler;
exports.getJavaScriptUserValidator = getJavaScriptUserValidator;
function getJavaScriptExpressApp() {
return `const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
require('dotenv').config();
const userRoutes = require('./routes/userRoutes');
const authRoutes = require('./routes/authRoutes');
const errorHandler = require('./middlewares/errorHandler');
const connectDB = require('./config/database');
const app = express();
// Connect to database
connectDB();
// Security middleware
app.use(helmet());
app.use(cors());
// Rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.use(limiter);
// Body parsing middleware
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));
// Routes
app.use('/api/auth', authRoutes);
app.use('/api/users', userRoutes);
// Health check
app.get('/health', (req, res) => {
res.status(200).json({ message: 'Server is healthy!' });
});
// Error handling middleware
app.use(errorHandler);
// 404 handler
app.use('*', (req, res) => {
res.status(404).json({ message: 'Route not found' });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(\`Server running on port \${PORT}\`);
});
module.exports = app;
`;
}
function getJavaScriptExpressController() {
return `const User = require('../models/User');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { validateUser, validateLogin } = require('../validators/userValidator');
class UserController {
async register(req, res) {
try {
const { error, value } = validateUser(req.body);
if (error) {
return res.status(400).json({ message: error.details[0].message });
}
const { email, password, name } = value;
// Check if user already exists
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(409).json({ message: 'User already exists' });
}
// Hash password
const hashedPassword = await bcrypt.hash(password, 12);
// Create user
const user = new User({
name,
email,
password: hashedPassword
});
await user.save();
// Generate JWT token
const token = jwt.sign(
{ userId: user._id },
process.env.JWT_SECRET,
{ expiresIn: '24h' }
);
res.status(201).json({
message: 'User created successfully',
token,
user: {
id: user._id,
name: user.name,
email: user.email
}
});
} catch (error) {
console.error('Registration error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
async login(req, res) {
try {
const { error, value } = validateLogin(req.body);
if (error) {
return res.status(400).json({ message: error.details[0].message });
}
const { email, password } = value;
// Find user
const user = await User.findOne({ email });
if (!user) {
return res.status(401).json({ message: 'Invalid credentials' });
}
// Check password
const isValidPassword = await bcrypt.compare(password, user.password);
if (!isValidPassword) {
return res.status(401).json({ message: 'Invalid credentials' });
}
// Generate JWT token
const token = jwt.sign(
{ userId: user._id },
process.env.JWT_SECRET,
{ expiresIn: '24h' }
);
res.status(200).json({
message: 'Login successful',
token,
user: {
id: user._id,
name: user.name,
email: user.email
}
});
} catch (error) {
console.error('Login error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
async getProfile(req, res) {
try {
const user = await User.findById(req.user.userId).select('-password');
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
res.status(200).json({ user });
} catch (error) {
console.error('Get profile error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
async updateProfile(req, res) {
try {
const { name, email } = req.body;
const userId = req.user.userId;
const user = await User.findById(userId);
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
// Check if email is being changed and if it's already taken
if (email !== user.email) {
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(409).json({ message: 'Email already taken' });
}
}
user.name = name || user.name;
user.email = email || user.email;
await user.save();
res.status(200).json({
message: 'Profile updated successfully',
user: {
id: user._id,
name: user.name,
email: user.email
}
});
} catch (error) {
console.error('Update profile error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
async getAllUsers(req, res) {
try {
const users = await User.find().select('-password');
res.status(200).json({ users });
} catch (error) {
console.error('Get users error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
async deleteUser(req, res) {
try {
const { id } = req.params;
const user = await User.findById(id);
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
await User.findByIdAndDelete(id);
res.status(200).json({ message: 'User deleted successfully' });
} catch (error) {
console.error('Delete user error:', error);
res.status(500).json({ message: 'Internal server error' });
}
}
}
module.exports = new UserController();
`;
}
function getJavaScriptExpressRoutes() {
return `const express = require('express');
const router = express.Router();
const UserController = require('../controllers/UserController');
const authMiddleware = require('../middlewares/auth');
// Public routes
router.post('/register', UserController.register);
router.post('/login', UserController.login);
module.exports = router;
`;
}
function getJavaScriptUserRoutes() {
return `const express = require('express');
const router = express.Router();
const UserController = require('../controllers/UserController');
const authMiddleware = require('../middlewares/auth');
// Protected routes
router.get('/profile', authMiddleware, UserController.getProfile);
router.put('/profile', authMiddleware, UserController.updateProfile);
router.get('/', authMiddleware, UserController.getAllUsers);
router.delete('/:id', authMiddleware, UserController.deleteUser);
module.exports = router;
`;
}
function getJavaScriptAuthMiddleware() {
return `const jwt = require('jsonwebtoken');
const User = require('../models/User');
const authMiddleware = async (req, res, next) => {
try {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ message: 'No token, authorization denied' });
}
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// Check if user still exists
const user = await User.findById(decoded.userId);
if (!user) {
return res.status(401).json({ message: 'Token is not valid' });
}
req.user = decoded;
next();
} catch (error) {
console.error('Auth middleware error:', error);
res.status(401).json({ message: 'Token is not valid' });
}
};
module.exports = authMiddleware;
`;
}
function getJavaScriptErrorHandler() {
return `const logger = require('../utils/logger');
const errorHandler = (err, req, res, next) => {
logger.error(err.stack);
// Mongoose bad ObjectId
if (err.name === 'CastError') {
const message = 'Resource not found';
return res.status(404).json({ message });
}
// Mongoose duplicate key
if (err.code === 11000) {
const message = 'Duplicate field value entered';
return res.status(400).json({ message });
}
// Mongoose validation error
if (err.name === 'ValidationError') {
const message = Object.values(err.errors).map(val => val.message);
return res.status(400).json({ message });
}
res.status(err.statusCode || 500).json({
message: err.message || 'Internal Server Error'
});
};
module.exports = errorHandler;
`;
}
function getJavaScriptUserValidator() {
return `const Joi = require('joi');
const userSchema = Joi.object({
name: Joi.string().min(2).max(50).required(),
email: Joi.string().email().required(),
password: Joi.string().min(6).required()
});
const loginSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().required()
});
const validateUser = (data) => {
return userSchema.validate(data);
};
const validateLogin = (data) => {
return loginSchema.validate(data);
};
module.exports = {
validateUser,
validateLogin
};
`;
}
//# sourceMappingURL=express.js.map