UNPKG

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
"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