| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | 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,  })})
 |