import express from 'express' const { Pool } = require('pg') import jwt from 'jsonwebtoken' import bcrypt from 'bcryptjs' const router = express.Router() // Database connection pool const pool = new Pool({ user: process.env.DB_USER, host: process.env.DB_HOST, database: process.env.DB_NAME, password: process.env.DB_PASS, port: process.env.DB_PORT, }) // Route to handle login and issue JWT token router.post('/login', async (req, res) => { const { username, password } = req.body try { const client = await pool.connect() const queryText = 'SELECT * FROM users WHERE username = $1' const result = await client.query(queryText, [username]) if (!result.rows.length) { return res.status(401).json({ message: 'Invalid credentials' }) } const user = result.rows[0] // Compare passwords const passwordMatch = await bcrypt.compare(password, user.password) if (!passwordMatch) { return res.status(401).json({ message: 'Invalid credentials' }) } // Issue JWT token const token = jwt.sign({ id: user.id, username: user.username }, process.env.JWT_SECRET, { expiresIn: '1h' }) res.json({ token }) } catch (error) { console.error(error) res.status(500).json({ message: 'Internal server error' }) } }) // Route to refresh JWT token router.post('/refresh-token', async (req, res) => { const { refreshToken } = req.body if (!refreshToken) { return res.status(401).json({ message: 'Refresh token is required' }) } try { // Verify the refresh token const decoded = jwt.verify(refreshToken, process.env.JWT_SECRET) // Create a new access token (JWT) const token = jwt.sign({ id: decoded.id, username: decoded.username }, process.env.JWT_SECRET, { expiresIn: '1h' }) res.json({ token }) } catch (error) { console.error(error) res.status(403).json({ message: 'Invalid refresh token' }) } }) export default router