Add docker detection and lint

This commit is contained in:
pedrocx486 2025-01-27 23:14:43 -03:00
parent b9a57d6083
commit 3018bf2ee2
2 changed files with 34 additions and 29 deletions

View file

@ -11,3 +11,4 @@ services:
MAX_PARTY_LINES: '1'
INITIAL_RUMOR: '...nothing has been said, yet.'
ENVIRONMENT: 'production'
DOCKER: 'true'

View file

@ -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!`);
}
});