first commit
Some checks failed
Build Images and Deploy / Update-PROD-Stack (push) Failing after 14s
Some checks failed
Build Images and Deploy / Update-PROD-Stack (push) Failing after 14s
This commit is contained in:
82
src/routes/auth.js
Normal file
82
src/routes/auth.js
Normal file
@@ -0,0 +1,82 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { Users } = require('../models');
|
||||
|
||||
router.get('/login', (req, res) => {
|
||||
res.render('auth/login', { title: 'Login', error: null });
|
||||
});
|
||||
|
||||
router.post('/login', (req, res) => {
|
||||
const { username, password } = req.body;
|
||||
|
||||
if (!username || !password) {
|
||||
return res.render('auth/login', { title: 'Login', error: 'Username and password are required.' });
|
||||
}
|
||||
|
||||
const user = Users.findByUsername(username);
|
||||
if (!user || !Users.verifyPassword(user, password)) {
|
||||
return res.render('auth/login', { title: 'Login', error: 'Invalid username or password.' });
|
||||
}
|
||||
|
||||
req.session.userId = user.id;
|
||||
req.session.username = user.username;
|
||||
req.session.isAdmin = !!user.is_admin;
|
||||
|
||||
const returnTo = req.session.returnTo || '/';
|
||||
delete req.session.returnTo;
|
||||
res.redirect(returnTo);
|
||||
});
|
||||
|
||||
router.get('/register', (req, res) => {
|
||||
res.render('auth/register', { title: 'Register', error: null });
|
||||
});
|
||||
|
||||
router.post('/register', (req, res) => {
|
||||
const { username, password, password_confirm } = req.body;
|
||||
|
||||
if (!username || !password) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Username and password are required.' });
|
||||
}
|
||||
|
||||
if (username.length < 3 || username.length > 24) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Username must be 3-24 characters.' });
|
||||
}
|
||||
|
||||
if (!/^[a-zA-Z0-9_-]+$/.test(username)) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Username can only contain letters, numbers, hyphens and underscores.' });
|
||||
}
|
||||
|
||||
if (password.length < 6) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Password must be at least 6 characters.' });
|
||||
}
|
||||
|
||||
if (password !== password_confirm) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Passwords do not match.' });
|
||||
}
|
||||
|
||||
if (Users.findByUsername(username)) {
|
||||
return res.render('auth/register', { title: 'Register', error: 'Username is already taken.' });
|
||||
}
|
||||
|
||||
try {
|
||||
const userId = Users.create(username, password);
|
||||
req.session.userId = userId;
|
||||
req.session.username = username;
|
||||
req.session.isAdmin = false;
|
||||
|
||||
const returnTo = req.session.returnTo || '/';
|
||||
delete req.session.returnTo;
|
||||
res.redirect(returnTo);
|
||||
} catch (err) {
|
||||
console.error('Registration error:', err);
|
||||
res.render('auth/register', { title: 'Register', error: 'Registration failed. Try a different username.' });
|
||||
}
|
||||
});
|
||||
|
||||
router.get('/logout', (req, res) => {
|
||||
req.session.destroy(() => {
|
||||
res.redirect('/');
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user