pengunjung.controller.js 2.8 KB

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