2.2.4.4 Controllers & Routes

User Controller:

// src/controllers/userController.js
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../models/User');

exports.register = async (req, res) => {
  try {
    const { username, email, password } = req.body;
    const existingUser = await User.findOne({ where: { email } });
    if (existingUser) return res.status(400).json({ error: 'User already exists' });

    const salt = await bcrypt.genSalt(10);
    const hashedPw = await bcrypt.hash(password, salt);

    const newUser = await User.create({ username, email, passwordHash: hashedPw });

    return res.status(201).json({ id: newUser.id, username: newUser.username });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Registration failed' });
  }
};

exports.login = async (req, res) => {
  try {
    const { email, password } = req.body;
    const user = await User.findOne({ where: { email } });
    if (!user) return res.status(401).json({ error: 'Invalid credentials' });

    const match = await bcrypt.compare(password, user.passwordHash);
    if (!match) return res.status(401).json({ error: 'Invalid credentials' });

    const token = jwt.sign({ id: user.id, role: user.role }, process.env.JWT_SECRET, {
      expiresIn: '1d'
    });

    return res.json({ user: { id: user.id, username: user.username }, token });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Login failed' });
  }
};

User Routes:

// src/routes/userRoutes.js
const router = require('express').Router();
const userController = require('../controllers/userController');
const auth = require('../middleware/auth');

router.post('/register', userController.register);
router.post('/login', userController.login);
router.get('/profile', auth, async (req, res) => {
  // example protected route
  // fetch user from DB using req.user.id
});

module.exports = router;

index.js (register routes):

// src/index.js
const express = require('express');
const cors = require('cors');
const userRoutes = require('./routes/userRoutes');
const socketServer = require('./socket/socketServer');

const app = express();
app.use(cors());
app.use(express.json());

app.use('/api/users', userRoutes);
// Additional routes (tradeRoutes, marketRoutes, etc.)

// Socket.io setup
const httpServer = require('http').createServer(app);
socketServer(httpServer);

const PORT = process.env.PORT || 4000;
httpServer.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`);
});

Last updated