🎨 Backend eslint compliant

This commit is contained in:
2022-01-13 01:06:49 +03:00
parent 9150fd813c
commit 6c1d62b389
3 changed files with 3048 additions and 140 deletions

View File

@@ -1,23 +1,25 @@
const express = require('express') const express = require('express');
const session = require('express-session') const session = require('express-session');
const app = express()
const { MongoClient, ObjectId } = require('mongodb') const app = express();
const MongoStore = require('connect-mongo') const { MongoClient, ObjectId } = require('mongodb');
const cors = require('cors') const MongoStore = require('connect-mongo');
require('dotenv').config() const cors = require('cors');
require('dotenv').config();
app.use(cors({ app.use(cors({
origin: [ origin: [
process.env.FRONTEND, process.env.FRONTEND,
], ],
credentials: true, credentials: true,
exposedHeaders: ['set-cookie'] exposedHeaders: ['set-cookie'],
})) }));
app.use(express.json()) app.use(express.json());
app.use(express.urlencoded({ extended: true })) app.use(express.urlencoded({ extended: true }));
const names = require('./names.json') const names = require('./names.json');
const client = new MongoClient(process.env.URI, { useUnifiedTopology: true })
const client = new MongoClient(process.env.URI, { useUnifiedTopology: true });
app.use(session({ app.use(session({
secret: process.env.SECRET, secret: process.env.SECRET,
@@ -25,195 +27,194 @@ app.use(session({
saveUninitialized: true, saveUninitialized: true,
store: MongoStore.create({ store: MongoStore.create({
client, client,
dbName: process.env.DB_NAME dbName: process.env.DB_NAME,
}), }),
cookie: { cookie: {
secure: false, secure: false,
maxAge: 1000 * 60 * 60 * 24 maxAge: 1000 * 60 * 60 * 24,
} },
})) }));
client.connect() client.connect();
const cardsCollection = client.db(process.env.DB_NAME).collection('cards') const cardsCollection = client.db(process.env.DB_NAME).collection('cards');
const answersCollection = client.db(process.env.DB_NAME).collection('answers') const answersCollection = client.db(process.env.DB_NAME).collection('answers');
// Выравнивание вероятности // Выравнивание вероятности
let dropProb = {} // Объект хранящий вероятности с которой карта каждого участника отбрасывается const dropProb = {}; // Объект хранящий вероятности с которой карта каждого участника отбрасывается
cardsCollection.aggregate([ cardsCollection.aggregate([
{ {
'$group': { $group: {
'_id': '$name', _id: '$name',
'count': { count: {
'$sum': 1 $sum: 1,
} },
} },
} },
]).toArray().then((memeCount) => { ]).toArray().then((memeCount) => {
cardsCollection.countDocuments().then((totalCount) => { cardsCollection.countDocuments().then((totalCount) => {
let quota, quotaTimes let quotaTimes;
quota = totalCount/memeCount.length // Квота мемов на человека const quota = totalCount / memeCount.length; // Квота мемов на человека
console.log(totalCount + " мемов всего. Квота: " + quota) console.log(`${totalCount} мемов всего. Квота: ${quota}`);
function activeUsers() { function activeUsers() {
let activeUsers = 0 let count = 0;
memeCount.forEach((person) => { memeCount.forEach((person) => {
if (person.count > quota/10) if (person.count > quota / 10) { count += 1; }
activeUsers++ });
}) return count;
return activeUsers
} }
memeCount.forEach((person) => { memeCount.forEach((person) => {
// Во сколько раз превышена квота: // Во сколько раз превышена квота:
// (колич. астивных человек в конфе * колич. мемов данного человека / мемов всего) // (колич. астивных человек в конфе * колич. мемов данного человека / мемов всего)
quotaTimes = activeUsers()*person.count/totalCount quotaTimes = activeUsers() * (person.count / totalCount);
if (quotaTimes > 1) { if (quotaTimes > 1) {
dropProb[person._id] = 1 - (1/quotaTimes) dropProb[person._id] = 1 - (1 / quotaTimes);
} else { } else {
dropProb[person._id] = 0 dropProb[person._id] = 0;
} }
console.log(person._id + " ["+person.count+"]: " + dropProb[person._id]) console.log(`${person._id} [${person.count}]: ${dropProb[person._id]}`);
}) });
}) });
}) });
app.post('/api/auth', async (req, res) => { app.post('/api/auth', async (req, res) => {
if (req.session.loggedIn) { if (req.session.loggedIn) {
res.status(200).send("Logged in") res.status(200).send('Logged in');
} else { } else {
try { try {
const pass = req.body.pass const { pass } = req.body;
if (pass && pass.toLowerCase() === process.env.PASSWORD) { if (pass && pass.toLowerCase() === process.env.PASSWORD) {
req.session.loggedIn = true req.session.loggedIn = true;
res.status(200).send("Logged in") res.status(200).send('Logged in');
} else { } else {
res.status(401).send("Wrong password") res.status(401).send('Wrong password');
} }
} catch (e) { } catch (e) {
console.log("Error: " + e) console.log(`Error: ${e}`);
res.status(500).send() res.status(500).send();
} }
} }
}) });
app.get('/api/card', async (req, res) => { app.get('/api/card', async (req, res) => {
async function drawCard() { async function drawCard() {
let card let card;
// Тянем карты и отбрасываем их в соответствии с их вероятностью отбрасывания // Тянем карты и отбрасываем их в соответствии с их вероятностью отбрасывания
do { do {
/* eslint-disable no-await-in-loop */
card = await cardsCollection.aggregate([ card = await cardsCollection.aggregate([
{ {
$sample: { size: 1 } $sample: { size: 1 },
}, { }, {
$unset: [ 'name', 'link', 'date' ] $unset: ['name', 'link', 'date'],
} },
]).toArray() ]).toArray();
card = card[0] /* eslint-enable no-await-in-loop */
} while (Math.random() < dropProb[card.name]) [card] = card;
return card } while (Math.random() < dropProb[card.name]);
return card;
} }
if (req.session.loggedIn) { if (req.session.loggedIn) {
res.status(200).send(await drawCard()) res.status(200).send(await drawCard());
} else { } else {
res.status(403).send() res.status(403).send();
} }
}) });
app.get('/api/meme', async (req, res) => { app.get('/api/meme', async (req, res) => {
const amount = Number(req.query.amount) || 1 const amount = Number(req.query.amount) || 1;
try { try {
let cards = await cardsCollection.aggregate([{ $sample: { size: amount } }]).toArray() let cards = await cardsCollection.aggregate([{ $sample: { size: amount } }]).toArray();
// Удаляем конфиденциальную информацию // Удаляем конфиденциальную информацию
cards = cards.map((card) => { cards = cards.map((card) => card.image);
return card.image res.status(200).send(cards);
})
res.status(200).send(cards)
} catch (e) { } catch (e) {
console.log("Error: " + e) console.log(`Error: ${e}`);
res.status(500).send() res.status(500).send();
} }
}) });
app.post('/api/answer', async (req, res) => { app.post('/api/answer', async (req, res) => {
if (req.session.loggedIn) { if (req.session.loggedIn) {
if (req.body.data.id && req.body.data.name) { if (req.body.data.id && req.body.data.name) {
const card = await cardsCollection.findOne({ _id: ObjectId(req.body.data.id) }) const card = await cardsCollection.findOne({ _id: ObjectId(req.body.data.id) });
if (card) { if (card) {
const correct = card.name === req.body.data.name const correct = card.name === req.body.data.name;
if (correct) { if (correct) {
req.session.right++ req.session.right += 1;
} else { } else {
req.session.wrong++ req.session.wrong += 1;
} }
answersCollection.insertOne({ answersCollection.insertOne({
correct, correct,
selected: req.body.data.name selected: req.body.data.name,
}) });
res.status(200).send({ res.status(200).send({
correct, correct,
card card,
}) });
} else { } else {
res.status(500).send() res.status(500).send();
} }
} else { } else {
res.status(400).send() res.status(400).send();
} }
} else { } else {
res.status(403).send() res.status(403).send();
} }
}) });
app.get('/api/score', (req, res) => { app.get('/api/score', (req, res) => {
if (req.session.loggedIn) { if (req.session.loggedIn) {
req.session.right = req.session.right || 0 req.session.right = req.session.right || 0;
req.session.wrong = req.session.wrong || 0 req.session.wrong = req.session.wrong || 0;
const scoreObj = { const scoreObj = {
"right": req.session.right, right: req.session.right,
"wrong": req.session.wrong wrong: req.session.wrong,
} };
res.status(200).send(scoreObj) res.status(200).send(scoreObj);
} else { } else {
res.status(403).send() res.status(403).send();
} }
}) });
app.get('/api/stats', async (req, res) => { app.get('/api/stats', async (req, res) => {
if (req.session.loggedIn) { if (req.session.loggedIn) {
answersCollection.aggregate([ answersCollection.aggregate([
{ {
'$group': { $group: {
'_id': '$selected', _id: '$selected',
'correct': { correct: {
'$sum': { $sum: {
'$cond': [ $cond: [
'$correct', 1, 0 '$correct', 1, 0,
] ],
}
}, },
'wrong': { },
'$sum': { wrong: {
'$cond': [ $sum: {
'$correct', 0, 1 $cond: [
] '$correct', 0, 1,
} ],
} },
} },
} },
]).toArray().then(stats => res.status(200).send(stats)) },
]).toArray().then((stats) => res.status(200).send(stats));
} else { } else {
res.status(403).send() res.status(403).send();
} }
}) });
app.get('/api/options', async (req, res) => { app.get('/api/options', async (req, res) => {
if (req.session.loggedIn) { if (req.session.loggedIn) {
res.status(200).send(names) res.status(200).send(names);
} else { } else {
res.status(403).send() res.status(403).send();
} }
}) });
app.listen(process.env.PORT, () => console.log('Server started on ' + process.env.PORT)); app.listen(process.env.PORT, () => console.log(`Server started on ${process.env.PORT}`));

2938
backend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,8 @@
"author": "Anatoly Kopyl", "author": "Anatoly Kopyl",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"eslint": "^8.6.0",
"eslint-config-airbnb-base": "^15.0.0",
"nodemon": "^2.0.7" "nodemon": "^2.0.7"
}, },
"dependencies": { "dependencies": {
@@ -20,5 +22,16 @@
"express": "^4.17.1", "express": "^4.17.1",
"express-session": "^1.17.1", "express-session": "^1.17.1",
"mongodb": "^3.6.5" "mongodb": "^3.6.5"
},
"eslintConfig": {
"extends": "airbnb-base",
"rules": {
"no-underscore-dangle": [
"off"
],
"no-console": [
"off"
]
}
} }
} }