diff --git a/docker-compose.yml b/docker-compose.yml index 54e261b..d279484 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,3 +11,4 @@ services: MAX_PARTY_LINES: '1' INITIAL_RUMOR: '...nothing has been said, yet.' ENVIRONMENT: 'production' + DOCKER: 'true' diff --git a/server/src/server.ts b/server/src/server.ts index 698eb1a..c85a33f 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -1,9 +1,9 @@ import express from 'express'; -import { body, query, validationResult } from 'express-validator'; +import {body, query, validationResult} from 'express-validator'; import rateLimit from 'express-rate-limit'; import cors from 'cors'; import bodyParser from 'body-parser'; -import { v4 as uuidv4 } from 'uuid'; +import {v4 as uuidv4} from 'uuid'; import dotenv from 'dotenv'; import helmet from 'helmet'; import path from 'path'; @@ -43,7 +43,7 @@ app.get('*', (_req, res) => { }); // Force HTTPS redirection in production -if(process.env.ENVIRONMENT !== 'development') { +if (process.env.ENVIRONMENT !== 'development') { app.use((req, res, next) => { if (req.headers['x-forwarded-proto'] !== 'https') { return res.redirect(`https://${req.headers.host}${req.url}`); @@ -83,18 +83,18 @@ app.get('/joinPartyLine', [ ], (req: any, res: any) => { const errors = validationResult(req); if (!errors.isEmpty()) { - return res.status(400).json({ errors: errors.array() }); + return res.status(400).json({errors: errors.array()}); } try { const currentPartyLine = req.query.partyLine; const partyLine = partyLines[currentPartyLine]; if (!partyLine) { - return res.status(404).send({ status: 'Party line not found' }); + return res.status(404).send({status: 'Party line not found'}); } - res.status(200).send({ status: 'Connection to party line authorized' }); + res.status(200).send({status: 'Connection to party line authorized'}); } catch (error) { console.error('ERROR: Failed to join party line', error); - res.status(500).send({ status: 'Internal server error' }); + res.status(500).send({status: 'Internal server error'}); } }); @@ -104,13 +104,13 @@ app.get('/connectPartyLine', [ ], (req: any, res: any) => { const errors = validationResult(req); if (!errors.isEmpty()) { - return res.status(400).json({ errors: errors.array() }); + return res.status(400).json({errors: errors.array()}); } try { const connectedPartyLine = req.query.partyLine; const partyLine = partyLines[connectedPartyLine]; if (!partyLine) { - return res.status(404).send({ status: 'Party line not found' }); + return res.status(404).send({status: 'Party line not found'}); } // Set headers for Server-Sent Events (SSE) @@ -119,7 +119,7 @@ app.get('/connectPartyLine', [ res.setHeader('Connection', 'keep-alive'); const clientId = `${uuidv4()}`; - const client = { clientId, response: res }; + const client = {clientId, response: res}; // Add client to the party line partyLine.clients.push(client); @@ -162,7 +162,7 @@ app.get('/connectPartyLine', [ }); } catch (error) { console.error('ERROR: Failed to connect to party line', error); - res.status(500).send({ status: 'Internal server error' }); + res.status(500).send({status: 'Internal server error'}); } }); @@ -187,15 +187,15 @@ app.post('/createPartyLine', [ ], (req: any, res: any) => { const errors = validationResult(req); if (!errors.isEmpty()) { - return res.status(400).json({ errors: errors.array() }); + return res.status(400).json({errors: errors.array()}); } try { - const { partyLine: currentPartyLine } = req.body; + const {partyLine: currentPartyLine} = req.body; if (Object.keys(partyLines).length >= MAX_PARTY_LINES) { - return res.status(400).send({ status: 'Maximum number of party lines reached' }); + return res.status(400).send({status: 'Maximum number of party lines reached'}); } if (partyLines[currentPartyLine]) { - return res.status(400).send({ status: 'Party line already exists' }); + return res.status(400).send({status: 'Party line already exists'}); } // Create a new party line @@ -206,10 +206,10 @@ app.post('/createPartyLine', [ }; console.log(`CREATE: Created party line: ${currentPartyLine}`); - res.status(200).send({ status: 'Party line created', currentPartyLine }); + res.status(200).send({status: 'Party line created', currentPartyLine}); } catch (error) { console.error('ERROR: Failed to create party line', error); - res.status(500).send({ status: 'Internal server error' }); + res.status(500).send({status: 'Internal server error'}); } }); @@ -220,13 +220,13 @@ app.post('/rumor', [ ], (req: any, res: any) => { const errors = validationResult(req); if (!errors.isEmpty()) { - return res.status(400).json({ errors: errors.array() }); + return res.status(400).json({errors: errors.array()}); } try { - const { partyLine: connectedPartyLine, rumor } = req.body; + const {partyLine: connectedPartyLine, rumor} = req.body; const partyLine = partyLines[connectedPartyLine]; if (!partyLine) { - return res.status(404).send({ status: 'Party line not found' }); + return res.status(404).send({status: 'Party line not found'}); } console.log(`RECEIVE: Received rumor for party line ${connectedPartyLine}: ${rumor}`); @@ -236,17 +236,17 @@ app.post('/rumor', [ partyLine.clients.forEach((client: any) => { client.response.write(`data: ${rumor}\n\n`); }); - res.status(200).send({ status: 'Rumor broadcast' }); + res.status(200).send({status: 'Rumor broadcast'}); } catch (error) { console.error('ERROR: Failed to send event', error); - res.status(500).send({ status: 'Internal server error' }); + res.status(500).send({status: 'Internal server error'}); } }); // Route to get all party lines app.get('/partyLines', (_req: any, res: any) => { const allPartyLines = Object.keys(partyLines); - res.status(200).send({ allPartyLines }); + res.status(200).send({allPartyLines}); }); // Route to delete a party line @@ -255,13 +255,13 @@ app.delete('/deletePartyLine', [ ], (req: any, res: any) => { const errors = validationResult(req); if (!errors.isEmpty()) { - return res.status(400).json({ errors: errors.array() }); + return res.status(400).json({errors: errors.array()}); } try { - const { partyLine: currentPartyLine } = req.body; + const {partyLine: currentPartyLine} = req.body; const partyLine = partyLines[currentPartyLine]; if (!partyLine) { - return res.status(404).send({ status: 'Party line not found' }); + return res.status(404).send({status: 'Party line not found'}); } // Broadcast deletion message to all clients @@ -276,14 +276,18 @@ app.delete('/deletePartyLine', [ // Delete the party line delete partyLines[currentPartyLine]; console.log(`DELETE: Deleted party line: ${currentPartyLine}`); - res.status(200).send({ status: 'Party line deleted', currentPartyLine }); + res.status(200).send({status: 'Party line deleted', currentPartyLine}); } catch (error) { console.error('ERROR: Failed to delete party line', error); - res.status(500).send({ status: 'Internal server error' }); + res.status(500).send({status: 'Internal server error'}); } }); // Start the server app.listen(PORT, () => { - console.log(`Rumor Party Line - Running on http://localhost:${PORT}`); + console.log(`Rumor Party Line`); + console.log(`Internally running on http://localhost:${PORT} in ${process.env.ENVIRONMENT} mode.`); + if (process.env.DOCKER) { + console.log(`Seems you're running on Docker! Check your external port in the compose file to avoid confusion!`); + } }); \ No newline at end of file