imkrish commited on
Commit
ec15943
·
verified ·
1 Parent(s): 8e71870

Upload folder using huggingface_hub

Browse files
Dockerfile CHANGED
@@ -10,6 +10,10 @@ RUN npm ci --production
10
  # Copy source code
11
  COPY . .
12
 
 
 
 
 
13
  # Expose port (HF default)
14
  EXPOSE 7860
15
 
 
10
  # Copy source code
11
  COPY . .
12
 
13
+ # Set environment variables
14
+ ENV NODE_ENV=production
15
+ ENV PORT=7860
16
+
17
  # Expose port (HF default)
18
  EXPOSE 7860
19
 
app.js CHANGED
@@ -12,9 +12,10 @@ const { connectDB } = require('./db');
12
  const destinationRoutes = require('./routes/destinations.routes');
13
  const providerRoutes = require('./routes/providers.routes');
14
  const complaintRoutes = require('./routes/complaints.routes');
 
15
 
16
  const app = express();
17
- const PORT = process.env.PORT || 3004;
18
 
19
  // Middleware
20
  app.use(cors({ origin: '*' }));
@@ -33,6 +34,7 @@ app.get('/health', async (req, res) => {
33
  app.use('/api/v1/destinations', destinationRoutes);
34
  app.use('/api/v1/providers', providerRoutes);
35
  app.use('/api/v1/complaints', complaintRoutes);
 
36
 
37
  // Start server
38
  async function start() {
 
12
  const destinationRoutes = require('./routes/destinations.routes');
13
  const providerRoutes = require('./routes/providers.routes');
14
  const complaintRoutes = require('./routes/complaints.routes');
15
+ const authRoutes = require('./routes/auth.routes');
16
 
17
  const app = express();
18
+ const PORT = 7860; // Enforce 7860 for Hugging Face Spaces Compatibility
19
 
20
  // Middleware
21
  app.use(cors({ origin: '*' }));
 
34
  app.use('/api/v1/destinations', destinationRoutes);
35
  app.use('/api/v1/providers', providerRoutes);
36
  app.use('/api/v1/complaints', complaintRoutes);
37
+ app.use('/api/v1/auth', authRoutes);
38
 
39
  // Start server
40
  async function start() {
controllers/auth.controller.js ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Admin Auth Controller - Independent Admin Authentication
3
+ */
4
+ const bcrypt = require('bcryptjs');
5
+ const jwt = require('jsonwebtoken');
6
+ const { getPool } = require('../db');
7
+
8
+ const ADMIN_JWT_SECRET = process.env.ADMIN_JWT_SECRET || 'admin-secret-key-123';
9
+ const JWT_EXPIRES_IN = '8h'; // Longer session for admins
10
+
11
+ /**
12
+ * Generate JWT for Admin
13
+ */
14
+ function generateToken(admin) {
15
+ return jwt.sign(
16
+ {
17
+ id: admin.id,
18
+ username: admin.username,
19
+ email: admin.email,
20
+ role: 'admin',
21
+ permissions: admin.permissions
22
+ },
23
+ ADMIN_JWT_SECRET,
24
+ { expiresIn: JWT_EXPIRES_IN }
25
+ );
26
+ }
27
+
28
+ /**
29
+ * Register Admin
30
+ */
31
+ async function register(req, res) {
32
+ const { username, email, password, name } = req.body;
33
+ const pool = getPool();
34
+
35
+ if (!pool) return res.status(500).json({ error: 'Database not connected' });
36
+
37
+ try {
38
+ const existing = await pool.query('SELECT id FROM admins WHERE email = $1 OR username = $2', [email, username]);
39
+ if (existing.rows.length > 0) {
40
+ return res.status(400).json({ error: 'Admin already exists' });
41
+ }
42
+
43
+ const hashedPassword = await bcrypt.hash(password, 12);
44
+ const result = await pool.query(
45
+ 'INSERT INTO admins (username, email, password_hash, name, permissions) VALUES ($1, $2, $3, $4, $5) RETURNING id, username, email, name, permissions',
46
+ [username, email, hashedPassword, name, JSON.stringify(['all'])]
47
+ );
48
+
49
+ const admin = result.rows[0];
50
+ const token = generateToken(admin);
51
+
52
+ res.status(201).json({ admin, token });
53
+ } catch (error) {
54
+ console.error('[Admin Register Error]', error.message);
55
+ res.status(500).json({ error: 'Failed to register admin' });
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Login Admin
61
+ */
62
+ async function login(req, res) {
63
+ const { email, password } = req.body;
64
+ const pool = getPool();
65
+
66
+ if (!pool) return res.status(500).json({ error: 'Database not connected' });
67
+
68
+ try {
69
+ const result = await pool.query('SELECT * FROM admins WHERE email = $1', [email]);
70
+ if (result.rows.length === 0) {
71
+ return res.status(401).json({ error: 'Invalid credentials' });
72
+ }
73
+
74
+ const admin = result.rows[0];
75
+ const valid = await bcrypt.compare(password, admin.password_hash);
76
+ if (!valid) {
77
+ return res.status(401).json({ error: 'Invalid credentials' });
78
+ }
79
+
80
+ const token = generateToken(admin);
81
+ delete admin.password_hash;
82
+
83
+ res.json({ admin, token });
84
+ } catch (error) {
85
+ console.error('[Admin Login Error]', error.message);
86
+ res.status(500).json({ error: 'Login failed' });
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Get current admin profile
92
+ */
93
+ async function getMe(req, res) {
94
+ const pool = getPool();
95
+ try {
96
+ const result = await pool.query('SELECT id, username, email, name, permissions FROM admins WHERE id = $1', [req.user.id]);
97
+ if (result.rows.length === 0) return res.status(404).json({ error: 'Admin not found' });
98
+ res.json({ admin: result.rows[0] });
99
+ } catch (error) {
100
+ res.status(500).json({ error: 'Failed to fetch profile' });
101
+ }
102
+ }
103
+
104
+ module.exports = { register, login, getMe };
middlewares/auth.js CHANGED
@@ -5,7 +5,7 @@
5
  */
6
  const jwt = require('jsonwebtoken');
7
 
8
- const JWT_SECRET = process.env.JWT_SECRET || 'your-jwt-secret-here';
9
 
10
  /**
11
  * Authenticate Admin
@@ -20,7 +20,7 @@ function authenticateAdmin(req, res, next) {
20
  const token = authHeader.split(' ')[1];
21
 
22
  try {
23
- const decoded = jwt.verify(token, JWT_SECRET);
24
 
25
  if (decoded.role !== 'admin') {
26
  return res.status(403).json({ error: 'Access denied. Administrator privileges required.' });
 
5
  */
6
  const jwt = require('jsonwebtoken');
7
 
8
+ const ADMIN_JWT_SECRET = process.env.ADMIN_JWT_SECRET || 'admin-secret-key-123';
9
 
10
  /**
11
  * Authenticate Admin
 
20
  const token = authHeader.split(' ')[1];
21
 
22
  try {
23
+ const decoded = jwt.verify(token, ADMIN_JWT_SECRET);
24
 
25
  if (decoded.role !== 'admin') {
26
  return res.status(403).json({ error: 'Access denied. Administrator privileges required.' });
routes/auth.routes.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const express = require('express');
2
+ const { register, login, getMe } = require('../controllers/auth.controller');
3
+ const { authenticateAdmin } = require('../middlewares/auth');
4
+
5
+ const router = express.Router();
6
+
7
+ router.post('/register', register);
8
+ router.post('/login', login);
9
+ router.get('/me', authenticateAdmin, getMe);
10
+
11
+ module.exports = router;