mirror of
https://github.com/anatolykopyl/vk-bingo.git
synced 2026-03-26 12:54:25 +00:00
🎨 Backend eslint compliant
This commit is contained in:
231
backend/index.js
231
backend/index.js
@@ -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': {
|
wrong: {
|
||||||
'$sum': {
|
$sum: {
|
||||||
'$cond': [
|
$cond: [
|
||||||
'$correct', 0, 1
|
'$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
2938
backend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user