mirror of
http://forgejo-oa09toasww4dgii9cj3gpzda.187.127.164.61.sslip.io/iamcoolvivek007/bharath.git
synced 2026-06-11 00:06:51 +00:00
- 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
102 lines
3.3 KiB
JavaScript
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;
|