68 lines
1.8 KiB
JavaScript
68 lines
1.8 KiB
JavaScript
const { Router } = require('express')
|
|
const mongoose = require('mongoose')
|
|
|
|
const { getAnswer } = require('../../utils/common')
|
|
const { CigaretteModel } = require('./model/cigarette')
|
|
const { authMiddleware } = require('./middleware/auth')
|
|
|
|
const router = Router()
|
|
|
|
// Все эндпоинты статистики требуют авторизации
|
|
router.use(authMiddleware)
|
|
|
|
// Агрегация по дням: количество сигарет в день для построения графика
|
|
router.get('/daily', async (req, res, next) => {
|
|
try {
|
|
const user = req.user
|
|
const { from, to } = req.query
|
|
|
|
const now = new Date()
|
|
const defaultFrom = new Date(now)
|
|
defaultFrom.setDate(defaultFrom.getDate() - 30)
|
|
|
|
const fromDate = from ? new Date(from) : defaultFrom
|
|
const toDate = to ? new Date(to) : now
|
|
|
|
const match = {
|
|
userId: new mongoose.Types.ObjectId(user.id),
|
|
smokedAt: {
|
|
$gte: fromDate,
|
|
$lte: toDate,
|
|
},
|
|
}
|
|
|
|
// Отладка: проверяем, сколько записей попадает в фильтр
|
|
const totalCount = await CigaretteModel.countDocuments(match)
|
|
console.log('[STATS] Match filter:', JSON.stringify(match, null, 2))
|
|
console.log('[STATS] Total cigarettes in range:', totalCount)
|
|
|
|
const data = await CigaretteModel.aggregate([
|
|
{ $match: match },
|
|
{
|
|
$group: {
|
|
_id: {
|
|
$dateToString: { format: '%Y-%m-%d', date: '$smokedAt', timezone: 'UTC' },
|
|
},
|
|
count: { $sum: 1 },
|
|
},
|
|
},
|
|
{ $sort: { _id: 1 } },
|
|
])
|
|
|
|
console.log('[STATS] Aggregation result:', data)
|
|
|
|
const result = data.map((item) => ({
|
|
date: item._id,
|
|
count: item.count,
|
|
}))
|
|
|
|
res.json(getAnswer(null, result))
|
|
} catch (err) {
|
|
next(err)
|
|
}
|
|
})
|
|
|
|
module.exports = router
|
|
|
|
|