TanksApp/compose/server/reportRouter.js

126 lines
4.6 KiB
JavaScript
Raw Normal View History

2023-12-24 13:16:15 +04:00
module.exports = (req, res, next) => {
if (req.url.startsWith('/report') && req.method === 'GET') {
const { startDate, endDate } = req.query;
try {
delete require.cache[require.resolve('./data.json')];
const data = require('./data.json');
const filteredPurchase = data.users_tanks.filter(purchase => {
const purchaseDate = new Date(purchase.date);
return purchaseDate >= new Date(startDate) && purchaseDate <= new Date(endDate);
});
//ПОИСК САМОГО ПОПУЛЯРНОГО ТАНКА ЗА ПЕРИОД
//список танков с кол-во их покупок
let tankList = [];
filteredPurchase.forEach(purchase => {
const tankId = purchase.tankId;
const tankInList = tankList.some(item => item.tankId === tankId);
if (tankInList) {
tankList[tankList.findIndex(index => index.tankId === tankId)].count++;
} else {
tankList.push(
{
tankId: tankId,
count: 1
}
)
}
});
tankList.sort((a, b) => b.count - a.count);
//нашли самый популярный танк
const supportTank = data.tanks.find(tank => tank.id === tankList[0].tankId);
const supportLevel = data.levels.find(level => level.id === supportTank.levelId).level;
2023-12-24 22:27:25 +04:00
const supportNation = data.nations.find(nation => nation.id === supportTank.nationId).nationName;
2023-12-24 13:16:15 +04:00
const popularTank = {
id: supportTank.id,
name: supportTank.name,
price: supportTank.price,
miniature: supportTank.miniature,
level: supportLevel,
nation: supportNation
};
//ПОИСК САМЫХ ПОПУЛЯРНЫХ УРОВНЯ И НАЦИИ ЗА ПЕРИОД
//список уроней и кол-во их покупок
let levelList = [];
//список уроней и кол-во их покупок
let nationList = [];
tankList.forEach(element => {
const tank = data.tanks.find(tank => tank.id === element.tankId);
//смотрим, сколько раз танк был куплен, чтобы сразу прибавить к соответствующему уровню текущее кол-во
const countCurrentTank = element.count;
const levelId = tank.levelId;
const nationId = tank.nationId;
const levelInList = levelList.some(item => item.levelId === levelId);
const nationInList = nationList.some(item => item.nationId === nationId);
if (levelInList) {
levelList[levelList.findIndex(index => index.levelId === levelId)].count += countCurrentTank;
} else {
levelList.push(
{
levelId: levelId,
count: countCurrentTank
}
)
}
if (nationInList) {
nationList[nationList.findIndex(index => index.nationId === nationId)].count += countCurrentTank;
} else {
nationList.push(
{
nationId: nationId,
count: countCurrentTank
}
)
}
});
levelList.sort((a, b) => b.count - a.count);
nationList.sort((a, b) => b.count - a.count);
//нашли самые популярные уровень и нацию
const popularLevel = data.levels.find(level => level.id === levelList[0].levelId)
const popularNation = data.nations.find(nation => nation.id === nationList[0].nationId)
finalDataReport = {
id: popularTank.id,
tankName: popularTank.name,
price: popularTank.price,
miniature: popularTank.miniature,
tankLevel: popularTank.level,
tankNation: popularTank.nation,
countTankPurchase: tankList[0].count,
level: popularLevel.level,
countLevelPurchase: levelList[0].count,
nationName: popularNation.nationName,
countNationPurchase: nationList[0].count
};
console.log(finalDataReport)
res.json(finalDataReport);
} catch (error) {
console.error('Error loading data:', error);
res.status(500).json({ message: 'Internal Server Error' });
}
} else {
next();
}
};