File size: 3,410 Bytes
2070fe3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo');
const cors = require('cors');
const passport = require('./config/passport');
const connectDB = require('./config/database');
const authRoutes = require('./routes/auth');
const roomRoutes = require('./routes/room');

const app = express();
const http = require('http').createServer(app);

// 1. Trust Proxy (Required for Hugging Face HTTPS)
app.set('trust proxy', 1);

// Define allowed origins
const allowedOrigins = [
  process.env.FRONTEND_URL,              // https://popcorn-ping.vercel.app
  "https://popcorn-ping.vercel.app",
  "http://localhost:3000"
].filter(Boolean);

// 2. Middleware
app.use(cors({
  origin: allowedOrigins,
  credentials: true,
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Debug Middleware: Log every request to see what's hitting the server
app.use((req, res, next) => {
  console.log(`[REQUEST] ${req.method} ${req.path}`);
  next();
});

// 3. Session Configuration
app.use(session({
  secret: process.env.SESSION_SECRET || 'fallback_secret',
  resave: false,
  saveUninitialized: false,
  store: MongoStore.create({
    mongoUrl: process.env.MONGODB_URI,
    mongoOptions: { serverSelectionTimeoutMS: 5000 }
  }),
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week
    httpOnly: true,
    secure: true, // MUST be true for Hugging Face
    sameSite: 'none' // MUST be 'none' for Google redirect
  },
}));

// 4. Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

// 5. Basic Routes
app.get('/', (req, res) => {
  res.status(200).send(`<h1>🍿 PopcornPing Backend is Live!</h1><p>Running on: ${process.env.BACKEND_URL}</p>`);
});

app.get('/health', (req, res) => res.status(200).json({ status: 'OK' }));
app.get('/api/health', (req, res) => res.status(200).json({ status: 'OK' }));

// 6. API Routes
// Mount Auth Routes at /api/auth
// This matches: /api/auth/google/callback
console.log('Mounting Auth Routes at /api/auth');
app.use('/api/auth', authRoutes);

// Mount Room Routes at /api/rooms
console.log('Mounting Room Routes at /api/rooms');
app.use('/api/rooms', roomRoutes);

// 7. Socket Logic (Your existing logic)
const io = require('socket.io')(http, {
  cors: { origin: allowedOrigins, methods: ["GET", "POST"], credentials: true },
});
const rooms = {};
io.on('connection', (socket) => {
  /* ... Your socket logic (unchanged) ... */
  socket.on('disconnect', () => {}); // Shortened for brevity
});

// 8. 404 Handler (MUST BE LAST)
// Only catch requests that didn't match any route above
app.use('/api/*', (req, res) => {
  console.error(`[404] Route not found: ${req.method} ${req.originalUrl}`);
  res.status(404).json({ message: `API endpoint not found: ${req.originalUrl}` });
});

// 9. Global Error Handler
app.use((err, req, res, next) => {
  console.error('SERVER ERROR:', err.stack);
  res.status(500).json({ message: 'Something went wrong!', error: err.message });
});

// 10. Start Server
const PORT = process.env.PORT || 7860;
connectDB().then(() => {
  http.listen(PORT, '0.0.0.0', () => {
    console.log(`🚀 Backend running on port ${PORT}`);
    console.log(`🔗 Backend URL: ${process.env.BACKEND_URL}`);
  });
}).catch(err => {
  console.error('FATAL: MongoDB Connection Failed', err);
  process.exit(1);
});