42 lines
1.5 KiB
JavaScript
42 lines
1.5 KiB
JavaScript
|
|
const express = require('express');
|
||
|
|
const router = express.Router();
|
||
|
|
const bcrypt = require('bcryptjs');
|
||
|
|
const { getDb, logAudit } = require('../../db');
|
||
|
|
|
||
|
|
// POST /api/spa/auth/login — JSON login, zet sessie
|
||
|
|
router.post('/login', (req, res) => {
|
||
|
|
const { username, password } = req.body || {};
|
||
|
|
if (!username || !password) {
|
||
|
|
return res.status(400).json({ error: 'Gebruikersnaam en wachtwoord zijn verplicht' });
|
||
|
|
}
|
||
|
|
const db = getDb();
|
||
|
|
const user = db.prepare('SELECT * FROM users WHERE username = ?').get(username);
|
||
|
|
if (!user || !bcrypt.compareSync(password, user.password_hash)) {
|
||
|
|
return res.status(401).json({ error: 'Ongeldige gebruikersnaam of wachtwoord' });
|
||
|
|
}
|
||
|
|
req.session.userId = user.id;
|
||
|
|
req.session.username = user.username;
|
||
|
|
logAudit(user.id, user.username, 'user_login', 'user', user.id, `${user.username} ingelogd via SPA`);
|
||
|
|
res.json({ id: user.id, username: user.username, role: user.role, email: user.email || '' });
|
||
|
|
});
|
||
|
|
|
||
|
|
// POST /api/spa/auth/logout
|
||
|
|
router.post('/logout', (req, res) => {
|
||
|
|
req.session.destroy(() => {
|
||
|
|
res.json({ ok: true });
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
// GET /api/spa/auth/me — huidige gebruiker (ook voor sessie-check bij opstarten SPA)
|
||
|
|
router.get('/me', (req, res) => {
|
||
|
|
if (!req.session || !req.session.userId) {
|
||
|
|
return res.status(401).json({ error: 'Niet ingelogd' });
|
||
|
|
}
|
||
|
|
const db = getDb();
|
||
|
|
const user = db.prepare('SELECT id, username, email, role FROM users WHERE id = ?').get(req.session.userId);
|
||
|
|
if (!user) return res.status(401).json({ error: 'Niet ingelogd' });
|
||
|
|
res.json(user);
|
||
|
|
});
|
||
|
|
|
||
|
|
module.exports = router;
|