Files
Puechberty Arthur 1fcb1c2b88 refactor: migrate from SQLite to PostgreSQL for session management and data storage
- Updated package dependencies to replace SQLite with PostgreSQL.
- Modified privacy policy to reflect the change in database technology.
- Adjusted session management in server.js to use connect-pg-simple.
- Enhanced docker-compose.yml to include PostgreSQL service with health checks.
- Added Dockerfile for multi-stage builds for development and production environments.
- Introduced .dockerignore to exclude unnecessary files from the Docker context.
2026-04-01 14:49:44 +02:00

98 lines
2.7 KiB
JavaScript

require("dotenv").config(); // charge les variables depuis .env
const express = require("express");
const session = require("express-session");
const PgSession = require("connect-pg-simple")(session);
const fetch = require("cross-fetch"); // fetch compatible Node
const path = require("path");
// importer la DB
const db = require("./db");
// importer le bot
const client = require("./bot");
const app = express();
const PORT = process.env.PORT || 3000;
const CLIENT_ID = process.env.CLIENT_ID;
const CLIENT_SECRET = process.env.CLIENT_SECRET;
const REDIRECT_URI = process.env.REDIRECT_URI;
// --- Session setup ---
app.use(session({
store: new PgSession({
pool: db.pool,
tableName: "user_sessions",
createTableIfMissing: true
}),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: { maxAge: 7*24*60*60*1000 } // 7 jours
}));
// --- Servir le dossier public ---
app.use(express.static(path.join(__dirname, "public")));
// --- Routes ---
require("./routes/auth")(app, db, client);
require("./routes/api")(app, db, client);
app.get("/invite-bot", (req, res) => {
const permissions = 8; // Permissions administrateur
const scopes = [
"bot",
"applications.commands",
"identify",
"guilds"
].join(" ");
const url =
"https://discord.com/oauth2/authorize" +
`?client_id=${CLIENT_ID}` +
`&redirect_uri=${encodeURIComponent(REDIRECT_URI)}` +
"&response_type=code" +
`&scope=${encodeURIComponent(scopes)}` +
`&permissions=${permissions}`;
// Tu peux juste renvoyer le lien
res.json({ url });
});
// Servir le dashboard par serveur
app.get("/guild/:guildId", (req, res) => {
const guildId = req.params.guildId;
const userGuilds = req.session.guilds;
// Vérifie que l'utilisateur est connecté et a admin sur ce serveur
if (!userGuilds) return res.redirect("/auth/discord"); // ou une page de connexion
const guildValid = userGuilds.find(
g => g.id === guildId && (BigInt(g.permissions) & 0x8n) === 0x8n
);
if (!guildValid) return res.send("Accès interdit : vous n'êtes pas admin sur ce serveur.");
// Redirige vers la page HTML statique du dashboard
res.sendFile(path.join(__dirname, "public", "guild.html"));
});
app.get("/dashboard", (req, res) => {
if (!req.session.user) {
return res.redirect("/auth/discord");
}
res.sendFile(path.join(__dirname, "public", "dashboard.html"));
});
app.get("/tos", (req, res) => {
res.sendFile(path.join(__dirname, "public", "tos.html"));
});
app.get("/privacy", (req, res) => {
res.sendFile(path.join(__dirname, "public", "privacy.html"));
});
// --- Lancement du serveur ---
app.listen(PORT, () => console.log(`Serveur lancé sur http://localhost:${PORT}`));