Spaces:
Paused
Paused
Download src/controllers/auth.controller.js from imkrish/yatra-x-booking: direct link, hf CLI and curl.
- Browser
- Download file 3.62 kB
-
https://huggingface.co/spaces/imkrish/yatra-x-booking/resolve/main/src/controllers/auth.controller.js
- Command line
-
hf download hf://spaces/imkrish/yatra-x-booking/src/controllers/auth.controller.js
-
curl -L -o auth.controller.js https://huggingface.co/spaces/imkrish/yatra-x-booking/resolve/main/src/controllers/auth.controller.js
3.62 kB
| /** | |
| * Provider Auth Controller - Independent Authentication for Hotel & Service Providers | |
| */ | |
| const bcrypt = require('bcryptjs'); | |
| const jwt = require('jsonwebtoken'); | |
| const { getPool } = require('../db'); | |
| const PROVIDER_JWT_SECRET = process.env.PROVIDER_JWT_SECRET; | |
| const JWT_EXPIRES_IN = '12h'; | |
| // Security check: Ensure PROVIDER_JWT_SECRET is configured | |
| if (!PROVIDER_JWT_SECRET) { | |
| console.error('⚠️ SECURITY WARNING: PROVIDER_JWT_SECRET environment variable is not set!'); | |
| if (process.env.NODE_ENV === 'production') { | |
| console.error('❌ FATAL: Cannot run in production without PROVIDER_JWT_SECRET'); | |
| process.exit(1); | |
| } | |
| } | |
| /** | |
| * Generate JWT for Hotel/Service Provider | |
| */ | |
| function generateToken(provider) { | |
| return jwt.sign( | |
| { | |
| id: provider.id, | |
| username: provider.username, | |
| email: provider.email, | |
| role: 'hotel_provider', | |
| provider_type: provider.provider_type | |
| }, | |
| PROVIDER_JWT_SECRET, | |
| { expiresIn: JWT_EXPIRES_IN } | |
| ); | |
| } | |
| /** | |
| * Register Hotel/Service Provider | |
| */ | |
| async function register(req, res) { | |
| const { username, email, password, name, provider_type = 'hotel' } = req.body; | |
| const pool = getPool(); | |
| if (!pool) return res.status(500).json({ error: 'Database not connected' }); | |
| try { | |
| const existing = await pool.query('SELECT id FROM service_providers WHERE email = $1 OR username = $2', [email, username]); | |
| if (existing.rows.length > 0) { | |
| return res.status(400).json({ error: 'Provider account already exists' }); | |
| } | |
| const hashedPassword = await bcrypt.hash(password, 12); | |
| const result = await pool.query( | |
| 'INSERT INTO service_providers (username, email, password_hash, name, provider_type) VALUES ($1, $2, $3, $4, $5) RETURNING id, username, email, name, provider_type', | |
| [username, email, hashedPassword, name, provider_type] | |
| ); | |
| const provider = result.rows[0]; | |
| const token = generateToken(provider); | |
| res.status(201).json({ user: provider, token }); | |
| } catch (error) { | |
| console.error('[Provider Register Error]', error.message); | |
| res.status(500).json({ error: 'Failed to register provider staff' }); | |
| } | |
| } | |
| /** | |
| * Login Hotel/Service Provider | |
| */ | |
| async function login(req, res) { | |
| const { email, password } = req.body; | |
| const pool = getPool(); | |
| if (!pool) return res.status(500).json({ error: 'Database not connected' }); | |
| try { | |
| const result = await pool.query('SELECT * FROM service_providers WHERE email = $1', [email]); | |
| if (result.rows.length === 0) { | |
| return res.status(401).json({ error: 'Invalid credentials' }); | |
| } | |
| const provider = result.rows[0]; | |
| const valid = await bcrypt.compare(password, provider.password_hash); | |
| if (!valid) { | |
| return res.status(401).json({ error: 'Invalid credentials' }); | |
| } | |
| const token = generateToken(provider); | |
| delete provider.password_hash; | |
| res.json({ user: provider, token }); | |
| } catch (error) { | |
| console.error('[Provider Login Error]', error.message); | |
| res.status(500).json({ error: 'Login failed' }); | |
| } | |
| } | |
| /** | |
| * Get current provider profile | |
| */ | |
| async function getMe(req, res) { | |
| const pool = getPool(); | |
| try { | |
| const result = await pool.query('SELECT id, username, email, name, provider_type FROM service_providers WHERE id = $1', [req.user.id]); | |
| if (result.rows.length === 0) return res.status(404).json({ error: 'Provider not found' }); | |
| res.json({ user: result.rows[0] }); | |
| } catch (error) { | |
| res.status(500).json({ error: 'Failed to fetch profile' }); | |
| } | |
| } | |
| module.exports = { register, login, getMe }; | |