bharath/webapp/src/routes/auth.js
Vivek 394117dd74 BharathTrucks MVP - 6 sprints complete
- Govt-app styled freight marketplace
- Role-based auth (driver/shipper/broker/admin)
- Load board with bidding system
- Trip tracking with status flow
- In-app messaging
- Admin panel
- Mobile bottom nav + PWA
- Docker + Coolify ready
2026-05-31 06:21:13 +00:00

102 lines
3.3 KiB
JavaScript

const express = require('express');
const bcrypt = require('bcryptjs');
const router = express.Router();
const supabase = require('../services/supabase');
const { ROLES } = require('../config/constants');
// GET /login
router.get('/login', (req, res) => {
if (req.session.user) return res.redirect('/');
res.render('pages/login', { error: null });
});
// POST /login
router.post('/login', async (req, res) => {
const { username, password } = req.body;
if (!username || !password) {
return res.render('pages/login', { error: 'यूज़रनेम और पासवर्ड आवश्यक है' });
}
const { data: user, error } = await supabase
.from('app_users')
.select('*')
.eq('username', username.toLowerCase().trim())
.single();
if (error || !user) {
return res.render('pages/login', { error: 'गलत यूज़रनेम या पासवर्ड' });
}
const valid = await bcrypt.compare(password, user.password_hash);
if (!valid) {
return res.render('pages/login', { error: 'गलत यूज़रनेम या पासवर्ड' });
}
req.session.user = {
id: user.id, username: user.username, name: user.name,
role: user.role, phone: user.phone,
};
res.redirect('/');
});
// GET /register
router.get('/register', (req, res) => {
if (req.session.user) return res.redirect('/');
res.render('pages/register', { error: null, role: req.query.role || '' });
});
// POST /register
router.post('/register', async (req, res) => {
const { name, username, password, password_confirm, role, phone } = req.body;
if (!name || !username || !password || !role) {
return res.render('pages/register', { error: 'सभी फ़ील्ड भरें', role });
}
if (password.length < 4) {
return res.render('pages/register', { error: 'पासवर्ड कम से कम 4 अक्षर का होना चाहिए', role });
}
if (password !== password_confirm) {
return res.render('pages/register', { error: 'पासवर्ड मेल नहीं खाता', role });
}
if (![ROLES.DRIVER, ROLES.SHIPPER, ROLES.BROKER].includes(role)) {
return res.render('pages/register', { error: 'कृपया भूमिका चुनें', role });
}
const cleanUsername = username.toLowerCase().trim().replace(/\s/g, '');
// Check existing
const { data: existing } = await supabase
.from('app_users')
.select('id')
.eq('username', cleanUsername)
.single();
if (existing) {
return res.render('pages/register', { error: 'यह यूज़रनेम पहले से लिया हुआ है', role });
}
const password_hash = await bcrypt.hash(password, 10);
const { data: user, error } = await supabase
.from('app_users')
.insert([{ username: cleanUsername, name: name.trim(), password_hash, role, phone: phone || null }])
.select()
.single();
if (error) {
return res.render('pages/register', { error: 'पंजीकरण विफल: ' + error.message, role });
}
req.session.user = {
id: user.id, username: user.username, name: user.name,
role: user.role, phone: user.phone,
};
res.redirect('/');
});
// GET /logout
router.get('/logout', (req, res) => {
req.session.destroy(() => res.redirect('/'));
});
module.exports = router;