2024-03-29 20:08:34 -04:00
|
|
|
// Import API
|
|
|
|
|
const express = require("express");
|
|
|
|
|
const http = require("http");
|
2024-10-29 10:10:13 -04:00
|
|
|
const dotenv = require('dotenv');
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
// Import Sockets
|
2024-04-05 20:10:59 -04:00
|
|
|
const { setupWebsocket } = require("./socket/socket");
|
2024-03-29 20:08:34 -04:00
|
|
|
const { Server } = require("socket.io");
|
|
|
|
|
|
2024-10-02 10:23:56 -04:00
|
|
|
// instantiate the db
|
|
|
|
|
const db = require('./config/db.js');
|
|
|
|
|
// instantiate the models
|
|
|
|
|
const quiz = require('./models/quiz.js');
|
|
|
|
|
const quizModel = new quiz(db);
|
2025-02-19 18:56:37 -05:00
|
|
|
const room = require('./models/room.js');
|
|
|
|
|
const roomModel = new room(db);
|
2024-10-02 10:23:56 -04:00
|
|
|
const folders = require('./models/folders.js');
|
|
|
|
|
const foldersModel = new folders(db, quizModel);
|
2024-10-02 10:32:01 -04:00
|
|
|
const users = require('./models/users.js');
|
|
|
|
|
const userModel = new users(db, foldersModel);
|
2024-10-02 10:23:56 -04:00
|
|
|
const images = require('./models/images.js');
|
|
|
|
|
const imageModel = new images(db);
|
|
|
|
|
|
|
|
|
|
// instantiate the controllers
|
|
|
|
|
const usersController = require('./controllers/users.js');
|
|
|
|
|
const usersControllerInstance = new usersController(userModel);
|
2025-02-19 18:56:37 -05:00
|
|
|
const roomsController = require('./controllers/room.js');
|
|
|
|
|
const roomsControllerInstance = new roomsController(roomModel);
|
2024-10-02 10:23:56 -04:00
|
|
|
const foldersController = require('./controllers/folders.js');
|
|
|
|
|
const foldersControllerInstance = new foldersController(foldersModel);
|
|
|
|
|
const quizController = require('./controllers/quiz.js');
|
|
|
|
|
const quizControllerInstance = new quizController(quizModel, foldersModel);
|
|
|
|
|
const imagesController = require('./controllers/images.js');
|
|
|
|
|
const imagesControllerInstance = new imagesController(imageModel);
|
|
|
|
|
|
|
|
|
|
// export the controllers
|
|
|
|
|
module.exports.users = usersControllerInstance;
|
2025-02-19 18:56:37 -05:00
|
|
|
module.exports.rooms = roomsControllerInstance;
|
2024-10-02 10:23:56 -04:00
|
|
|
module.exports.folders = foldersControllerInstance;
|
|
|
|
|
module.exports.quizzes = quizControllerInstance;
|
|
|
|
|
module.exports.images = imagesControllerInstance;
|
|
|
|
|
|
|
|
|
|
//import routers (instantiate controllers as side effect)
|
2024-03-29 20:08:34 -04:00
|
|
|
const userRouter = require('./routers/users.js');
|
2025-02-19 18:56:37 -05:00
|
|
|
const roomRouter = require('./routers/room.js');
|
2024-03-29 20:08:34 -04:00
|
|
|
const folderRouter = require('./routers/folders.js');
|
|
|
|
|
const quizRouter = require('./routers/quiz.js');
|
2025-02-21 14:48:21 -05:00
|
|
|
const imagesRouter = require('./routers/images.js')
|
|
|
|
|
const AuthManager = require('./auth/auth-manager.js')
|
|
|
|
|
const authRouter = require('./routers/auth.js')
|
2024-03-29 20:08:34 -04:00
|
|
|
|
2024-10-28 12:53:13 -04:00
|
|
|
// Setup environment
|
2024-03-29 20:08:34 -04:00
|
|
|
dotenv.config();
|
2025-02-21 14:48:21 -05:00
|
|
|
|
|
|
|
|
// Setup urls from configs
|
|
|
|
|
const use_ports = (process.env['USE_PORTS'] || 'false').toLowerCase() == "true"
|
|
|
|
|
process.env['FRONTEND_URL'] = process.env['SITE_URL'] + (use_ports ? `:${process.env['FRONTEND_PORT']}`:"")
|
|
|
|
|
process.env['BACKEND_URL'] = process.env['SITE_URL'] + (use_ports ? `:${process.env['PORT']}`:"")
|
|
|
|
|
|
2024-03-29 20:08:34 -04:00
|
|
|
const errorHandler = require("./middleware/errorHandler.js");
|
|
|
|
|
|
|
|
|
|
// Start app
|
|
|
|
|
const app = express();
|
|
|
|
|
const cors = require("cors");
|
|
|
|
|
const bodyParser = require('body-parser');
|
2025-02-21 14:48:21 -05:00
|
|
|
let isDev = process.env.NODE_ENV === 'development';
|
2024-03-29 20:08:34 -04:00
|
|
|
|
2024-10-29 10:10:13 -04:00
|
|
|
const configureServer = (httpServer, isDev) => {
|
2025-01-11 11:30:01 -05:00
|
|
|
console.log(`Configuring server with isDev: ${isDev}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
return new Server(httpServer, {
|
2024-04-05 17:34:39 -04:00
|
|
|
path: "/socket.io",
|
2024-03-29 20:08:34 -04:00
|
|
|
cors: {
|
|
|
|
|
origin: "*",
|
|
|
|
|
methods: ["GET", "POST"],
|
|
|
|
|
credentials: true,
|
|
|
|
|
},
|
2024-10-29 10:10:13 -04:00
|
|
|
secure: !isDev, // true for https, false for http
|
2024-03-29 20:08:34 -04:00
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2024-10-25 15:31:48 -04:00
|
|
|
// Start sockets (depending on the dev or prod environment)
|
2025-01-10 23:43:15 -05:00
|
|
|
const server = http.createServer(app);
|
2024-10-29 10:10:13 -04:00
|
|
|
|
|
|
|
|
console.log(`Environnement: ${process.env.NODE_ENV} (${isDev ? 'dev' : 'prod'})`);
|
|
|
|
|
|
2025-01-11 11:30:01 -05:00
|
|
|
const io = configureServer(server, isDev);
|
2025-01-10 23:43:15 -05:00
|
|
|
console.log(`Server configured with cors.origin: ${io.opts.cors.origin} and secure: ${io.opts.secure}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
setupWebsocket(io);
|
2024-10-30 17:19:11 -04:00
|
|
|
console.log(`Websocket setup with on() listeners.`);
|
|
|
|
|
|
2024-03-29 20:08:34 -04:00
|
|
|
app.use(cors());
|
|
|
|
|
app.use(bodyParser.urlencoded({ extended: true }));
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
|
|
|
|
|
|
// Create routes
|
|
|
|
|
app.use('/api/user', userRouter);
|
2025-02-19 18:56:37 -05:00
|
|
|
app.use('/api/room', roomRouter);
|
2024-03-29 20:08:34 -04:00
|
|
|
app.use('/api/folder', folderRouter);
|
|
|
|
|
app.use('/api/quiz', quizRouter);
|
|
|
|
|
app.use('/api/image', imagesRouter);
|
2025-02-21 14:48:21 -05:00
|
|
|
app.use('/api/auth', authRouter);
|
|
|
|
|
|
|
|
|
|
// Add Auths methods
|
|
|
|
|
const session = require('express-session');
|
|
|
|
|
app.use(session({
|
|
|
|
|
secret: process.env['SESSION_Secret'],
|
|
|
|
|
resave: false,
|
|
|
|
|
saveUninitialized: false,
|
|
|
|
|
cookie: { secure: process.env.NODE_ENV === 'production' }
|
|
|
|
|
}));
|
|
|
|
|
|
2025-03-04 14:24:36 -05:00
|
|
|
let _authManager = new AuthManager(app,null,userModel);
|
2025-02-03 18:44:31 -05:00
|
|
|
app.use(errorHandler);
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
// Start server
|
|
|
|
|
async function start() {
|
2024-04-05 20:10:59 -04:00
|
|
|
const port = process.env.PORT || 4400;
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
// Check DB connection
|
2025-03-14 00:42:49 -04:00
|
|
|
|
|
|
|
|
await db.getConnection();
|
2024-03-29 20:08:34 -04:00
|
|
|
console.log(`Connexion MongoDB établie`);
|
|
|
|
|
|
|
|
|
|
server.listen(port, () => {
|
|
|
|
|
console.log(`Serveur écoutant sur le port ${port}`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-10 15:20:07 -04:00
|
|
|
// Graceful shutdown on SIGINT (Ctrl+C)
|
|
|
|
|
process.on('SIGINT', async () => {
|
|
|
|
|
console.log('Shutting down...');
|
|
|
|
|
await db.closeConnection();
|
|
|
|
|
process.exit(0);
|
|
|
|
|
});
|
|
|
|
|
|
2024-03-29 20:08:34 -04:00
|
|
|
start();
|