migrasi.controller.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. const sanksiModel = require('../../model/sanksi.model')
  2. const dokumenModel = require('../../model/dokumen.model')
  3. const laporanModel = require('../../model/laporan.model')
  4. const handleError = require('../../utils/v1/handleError')
  5. const response = require('../../utils/responseHandler')
  6. const coba = require('../../utils/coba')
  7. exports.pengajuan = handleError(async (req, res) => {
  8. const [keberatan, banding] = await Promise.all([
  9. (() =>
  10. sanksiModel.find({
  11. ['pengajuan.keberatan']: { $ne: null, $exists: true },
  12. is_pengajuan_keberatan: { $eq: null, $exists: false }
  13. }))(),
  14. (() =>
  15. sanksiModel.find({
  16. ['jawaban.keberatan']: { $ne: null, $exists: true },
  17. ['pengajuan.banding']: { $ne: null, $exists: true },
  18. is_pengajuan_banding: { $eq: null, $exists: false }
  19. }))()
  20. ])
  21. await Promise.all([
  22. ...keberatan.map(async (e) => {
  23. await sanksiModel.findOneAndUpdate({ _id: e._id }, { is_pengajuan_keberatan: true })
  24. }),
  25. ...banding.map(async (e) => {
  26. await sanksiModel.findOneAndUpdate({ _id: e._id }, { is_pengajuan_banding: true })
  27. })
  28. ])
  29. return response.success(res, {
  30. message: 'Berhasil migrasi pengajuan'
  31. })
  32. })
  33. exports.dokumen = handleError(async (req, res) => {
  34. const dokumen = await dokumenModel.find()
  35. const BATCH_SIZE = 10 // Proses 10 dokumen per batch
  36. const DELAY_MS = 100 // Delay 100ms antar batch
  37. if (dokumen?.length) {
  38. for (let i = 0; i < dokumen.length; i += BATCH_SIZE) {
  39. const batch = dokumen.slice(i, i + BATCH_SIZE)
  40. await Promise.all(
  41. batch.map(async (e) => {
  42. const path = e.path.split('/').slice(3).join('/')
  43. await dokumenModel.findOneAndUpdate(
  44. {
  45. _id: e._id,
  46. },
  47. {
  48. path: `${coba.decrypt(process.env.W8A1C)}/${path}`,
  49. }
  50. )
  51. })
  52. )
  53. // Delay antar batch untuk avoid rate limit
  54. if (i + BATCH_SIZE < dokumen.length) {
  55. await new Promise((resolve) => setTimeout(resolve, DELAY_MS))
  56. }
  57. }
  58. }
  59. return response.success(res, {
  60. message: `Berhasil migrasi ${dokumen?.length || 0} dokumen`,
  61. })
  62. })
  63. exports.pelanggaranSanksi = handleError(async (req, res) => {
  64. const sanksi = await sanksiModel.find({
  65. sanksi: {
  66. $eq: []
  67. }
  68. }).populate('pelanggaran')
  69. if (sanksi?.length) await Promise.all(sanksi.map(async e => {
  70. await sanksiModel.findOneAndUpdate({
  71. _id: e._id
  72. }, {
  73. sanksi: e.pelanggaran.map(e2 => ({ label: e2.label_sanksi, description: e2.sanksi, level: e2.level_sanksi }))
  74. })
  75. }))
  76. return response.success(res, {
  77. message: 'Berhasil migrasi pelanggaran sanksi'
  78. })
  79. })
  80. exports.tambahStep = handleError(async (req, res) => {
  81. const laporan = await laporanModel.find()
  82. await Promise.all(laporan.map(e => {
  83. let step = ['pelaporan']
  84. if (e.jadwal) step.push('penjadwalan')
  85. if (e.evaluasi.length) step.push('pemeriksaan')
  86. if (e.sanksi) step.push('sanksi')
  87. return laporanModel.updateOne({ _id: e._id }, { step })
  88. }))
  89. const sanksi = await sanksiModel.find()
  90. await Promise.all(sanksi.map(e => {
  91. let step = []
  92. if (e.pengajuan?.keberatan) step.push('keberatan')
  93. if (e.pengajuan?.banding) step.push('banding')
  94. if (e.perbaikan.length) step.push('dokumen_perbaikan')
  95. if (e.pengajuan?.cabut_sanksi) step.push('cabut_sanksi')
  96. return sanksiModel.updateOne({ _id: e._id }, { step })
  97. }))
  98. return laporan
  99. })
  100. exports.backToSanksi = handleError(async (req, res) => {
  101. const sanksi = await sanksiModel.find({
  102. 'masa_berlaku.to_date': {
  103. $lte: new Date().toISOString()
  104. },
  105. aktif: false
  106. })
  107. await Promise.all(sanksi.map(e => sanksiModel.findOneAndUpdate({ _id: e._id }, { aktif: true, 'masa_berlaku.berakhir': true })))
  108. return sanksi
  109. })