const pengunjungModel = require('../model/pengunjung.model') const handleError = require('../utils/handleError') const response = require('../utils/responseHandler') const { validate } = require('../utils/validation') exports.create = handleError(async (req, res) => { const { os, ipv4, location } = req.body const isValid = validate(res, req.body, { os: 'string', ipv4: 'string', location: { $$type: 'object', country: 'string', region: 'string', city: 'string', lat: 'number', lon: 'number', timezone: 'string', }, }) if (!isValid) return await pengunjungModel.create({ os, ipv4, location }) return response.success(res, { message: 'data pengunjung berhasil dibuat', }) }) exports.getPengunjung = handleError(async (req, res) => { const { tahun } = req.query let date = {} if (tahun) { date = { $expr: { $eq: [ { $year: '$createdAt' }, parseInt(tahun) || new Date().getFullYear(), ], }, } } const pengunjung = await pengunjungModel.aggregate([ { $match: date }, { $group: { _id: { bulan: { $month: '$createdAt', }, tahun: { $year: '$createdAt', }, }, jumlah_pengunjung: { $sum: 1, }, }, }, { $sort: { ['_id.bulan']: 1, }, }, ]) return response.success(res, { message: 'data pengunjung', data: pengunjung, }) }) exports.getPengunjungPublic = handleError(async (req, res) => { const { tahun, bulan } = req.query let date = {} if (tahun || bulan) { date = { $expr: { $and: [ { $eq: [ { $year: '$createdAt' }, parseInt(tahun) || new Date().getFullYear(), ], }, { $eq: [ { $month: '$createdAt' }, parseInt(bulan) || new Date().getMonth() + 1, ], }, ], }, } } const pengunjung = await pengunjungModel.aggregate([ { $match: date }, { $group: { _id: { tanggal: { $dayOfMonth: '$createdAt', }, bulan: { $month: '$createdAt', }, tahun: { $year: '$createdAt', }, }, jumlah_pengunjung: { $sum: 1, }, data_ip: { $addToSet: '$ipv4', }, }, }, { $addFields: { jumlah_pengunjung: { $size: '$data_ip', }, }, }, { $project: { data_ip: 0, }, }, { $sort: { ['_id.tanggal']: 1, }, }, ]) return response.success(res, { message: 'data pengunjung', data: pengunjung, }) })