-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
84 lines (74 loc) · 5.57 KB
/
Copy pathserver.js
File metadata and controls
84 lines (74 loc) · 5.57 KB
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
// ─────────────────────────────────────────────────────────────────────────────
// Express server setup with robust, environment-driven CORS.
// ─────────────────────────────────────────────────────────────────────────────
const express = require("express");
const cors = require("cors");
const mongoose = require("mongoose");
require("dotenv").config();
const app = express();
const port = process.env.PORT || 5000;
const MONGO_URI = process.env.MONGO_URI;
// ─────────────────────────────────────────────────────────────────────────────
// 1. CORS Configuration
// - Allowed origins read from .env: ALLOWED_ORIGINS="https://a,https://b"
// - Normalizes incoming origin via URL parsing
// - Allows non-browser clients (no Origin header)
// - Enables credentials (cookies, auth headers)
// ─────────────────────────────────────────────────────────────────────────────
const allowedOrigins = [process.env.ALLOWED_ORIGINS];
app.use(cors({
origin: function (origin, callback) {
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error("CORS policy: origin not allowed"));
}
},
credentials: true,
}));
// ─────────────────────────────────────────────────────────────────────────────
// 2. Built-in Middleware
// ─────────────────────────────────────────────────────────────────────────────
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// ─────────────────────────────────────────────────────────────────────────────
// 3. MongoDB Connection
// ─────────────────────────────────────────────────────────────────────────────
mongoose
.connect(MONGO_URI)
.then(() => console.log("✅ MongoDB connected"))
.catch((err) => console.error("❌ MongoDB connection error:", err));
// ─────────────────────────────────────────────────────────────────────────────
// 4. Route Definitions
// ─────────────────────────────────────────────────────────────────────────────
const authRoutes = require("./routes/authRoutes");
const coupleRoutes = require("./routes/coupleRoutes");
const activityRoutes = require("./routes/activityRoutes");
const tokenRoutes = require("./routes/tokenRoutes");
const postRoutes = require("./routes/postRoutes");
const uploadRoutes = require("./routes/uploadRoutes");
const streakRoutes = require("./routes/streakRoutes");
app.use("/api/auth", authRoutes); // → /api/auth/
app.use("/api/couple", coupleRoutes); // → /api/couple/:coupleId
app.use("/api/activity", activityRoutes); // → /api/activity/:coupleId
app.use("/api/tokens", tokenRoutes); // → /api/tokens/:coupleId
app.use("/api/posts", postRoutes); // → /api/posts?coupleId=...&visibility=...
app.use("/api/upload", uploadRoutes); // → /api/upload
app.use("/api/streak", streakRoutes); // → /api/streak
// ─────────────────────────────────────────────────────────────────────────────
// 5. Health Check Endpoint
// ─────────────────────────────────────────────────────────────────────────────
app.get("/health", (req, res) => {
res.status(200).json({
status: "ok",
uptime: `${process.uptime().toFixed(0)}s`,
timestamp: new Date().toISOString(),
message: "Backend is healthy",
});
});
// ─────────────────────────────────────────────────────────────────────────────
// 6. Start Server
// ─────────────────────────────────────────────────────────────────────────────
app.listen(port, () => {
console.log(`Server listening on http://localhost:${port}`);
});