126 lines
4.6 KiB
JavaScript
126 lines
4.6 KiB
JavaScript
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;
|
||
const supportNation = data.nations.find(nation => nation.id === supportTank.nationId).nationName;
|
||
|
||
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();
|
||
}
|
||
}; |