pengunjung.controller.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const pengunjungModel = require('../../model/pengunjung.model')
  2. const handleError = require('../../utils/v1/handleError')
  3. const response = require('../../utils/responseHandler')
  4. const { validate } = require('../../utils/v1/validation')
  5. exports.create = handleError(async (req, res) => {
  6. const { os, ipv4, location } = req.body
  7. const isValid = validate(res, req.body, {
  8. ipv4: 'string',
  9. })
  10. if (!isValid) return
  11. await pengunjungModel.create({ os, ipv4, location })
  12. return response.success(res, {
  13. message: 'data pengunjung berhasil dibuat',
  14. })
  15. })
  16. exports.getPengunjung = handleError(async (req, res) => {
  17. const { tahun } = req.query
  18. let date = {}
  19. if (tahun) {
  20. date = {
  21. $expr: {
  22. $eq: [
  23. { $year: '$createdAt' },
  24. parseInt(tahun) || new Date().getFullYear(),
  25. ],
  26. },
  27. }
  28. }
  29. const pengunjung = await pengunjungModel.aggregate([
  30. { $match: date },
  31. {
  32. $group: {
  33. _id: {
  34. bulan: {
  35. $month: '$createdAt',
  36. },
  37. tahun: {
  38. $year: '$createdAt',
  39. },
  40. },
  41. jumlah_pengunjung: {
  42. $sum: 1,
  43. },
  44. },
  45. },
  46. {
  47. $sort: {
  48. '_id.bulan': 1,
  49. },
  50. },
  51. ])
  52. return response.success(res, {
  53. message: 'data pengunjung',
  54. data: pengunjung,
  55. })
  56. })
  57. exports.getPengunjungPublic = handleError(async (req, res) => {
  58. const { tahun, bulan } = req.query
  59. let date = {}
  60. if (tahun || bulan) {
  61. date = {
  62. $expr: {
  63. $and: [
  64. {
  65. $eq: [
  66. { $year: '$createdAt' },
  67. parseInt(tahun) || new Date().getFullYear(),
  68. ],
  69. },
  70. {
  71. $eq: [
  72. { $month: '$createdAt' },
  73. parseInt(bulan) || new Date().getMonth() + 1,
  74. ],
  75. },
  76. ],
  77. },
  78. }
  79. }
  80. const pengunjung = await pengunjungModel.aggregate([
  81. { $match: date },
  82. {
  83. $group: {
  84. _id: {
  85. tanggal: {
  86. $dayOfMonth: '$createdAt',
  87. },
  88. bulan: {
  89. $month: '$createdAt',
  90. },
  91. tahun: {
  92. $year: '$createdAt',
  93. },
  94. },
  95. jumlah_pengunjung: {
  96. $sum: 1,
  97. },
  98. data_ip: {
  99. $addToSet: '$ipv4',
  100. },
  101. },
  102. },
  103. {
  104. $addFields: {
  105. jumlah_pengunjung: {
  106. $size: '$data_ip',
  107. },
  108. },
  109. },
  110. {
  111. $project: {
  112. data_ip: 0,
  113. },
  114. },
  115. {
  116. $sort: {
  117. '_id.tanggal': 1,
  118. },
  119. },
  120. ])
  121. return response.success(res, {
  122. message: 'data pengunjung',
  123. data: pengunjung,
  124. })
  125. })