yazid138 2 years ago
parent
commit
28876e9160

+ 5 - 1
.env

@@ -11,4 +11,8 @@ CXQSB=5c8e9b8cb0a154a9fb1683042e85231b600a18b57288165dea5a426a593ca811d4451a4b4f
 
 AJFAL=fa6f3dd32440d496aef10dfc53f448ef13622d6dc9d1e8625bc9ed74a7f39e9cd57c6a557f0b2fb9e001ba26f8fa6c9e46523c59a5bd0bd1a23502c22a5e3dc91788ade605f1496f2308b2ee199019c835355d464c3683b21b97b322daaf751c4c0feea47484aa361e1a526e07f789030a95
 IOQUR=1304ccaa3dad35b104850390bd73f5624396a3c7983bc842d7425e2893a7370caddde7aeaa7bd91ce43a2b607e970d04f7c472190242236d2beca993bb6ec51851c3417cd4db096f8350b926efb5d67e190586642b76d18965719f01c4de0963f13c4e632cad36f3391cf875eb30bb0e2d7900a980121a80b28fd4308a03d2b3
-ZXCND=43caa966b96598953066715249e4eee1dc707002b4134a86f153780c91929cf129dae5a4f127a1e3cd2867dd867d73699e86f1360d06826278b6135d1aa837ef0aa423874dfecf7a24c9a8a6ce6d21b9db4b8700b1a3b95f3fc001183ee477691a503ba8a271a9ad54acfec7f37297b99a156e5c89560735bb52edf92b7fdb85
+ZXCND=43caa966b96598953066715249e4eee1dc707002b4134a86f153780c91929cf129dae5a4f127a1e3cd2867dd867d73699e86f1360d06826278b6135d1aa837ef0aa423874dfecf7a24c9a8a6ce6d21b9db4b8700b1a3b95f3fc001183ee477691a503ba8a271a9ad54acfec7f37297b99a156e5c89560735bb52edf92b7fdb85
+
+AFA1T=583a4eed7f518a11638dbaf9dba359c71ebe5709a576563db23d5f36a1c178e7519f3364e42202fe20f7bd13d75e409de638a25427d528a57c8f0c6e770528dc4597ccd6d791adc3d0c291aa08e46664fa08af20a8b692ec6e6d9ab8c010f601d79f7aa7e5596e631936d480397489123f8df7072a64a2083b0c253eef9a38b6
+BEAT2=fe0c04666b33cc554ff7c62d23ea3cfd654549dfc4d48dee3ba0ce4395056df7babbf72d174da4b2287decea7903f2a28773ef1280732fb2156f5201e0d3a3423b154104b095b87cc882ba3c31824ae97405ff15ebcf092738f1b433fd10fb27b1c6772bbfebbd81e0acfdbbf9aff86a9faa490b2b5a0a162efc95c788c2e846
+R3AOP=37acd13080c621b4a95e3d40f246002cfa787f542fc1968c08dfd542f8d198d5ee5b4dbeddc4821fed170de9dd31a682d710de78035d6908e730581f0b8276937a04dee3acb4c4547f5d5d3d75aa36de7d340eb9de62bd08526b1e6b75f05c0d4b61b22779eb292dc1bd77a60709ada668da3acdde81263c69f93f3f75b918be

+ 7 - 40
controller/v1/auth.controller.js

@@ -3,13 +3,10 @@ const response = require('../../utils/responseHandler')
 const userModel = require('../../model/user.model')
 const jwt = require('jsonwebtoken')
 const { validate } = require('../../utils/v1/validation')
-const axios = require('../../utils/axios')
-const qs = require('qs')
 const convertRole = require('../../utils/convertRole')
-const { roleData, roleDataProduction } = require('../../utils/constanta')
+const { roleDataProduction } = require('../../utils/constanta')
 const logModel = require('../../model/log.model')
-const ip = require('ip')
-const osValue = require('../../utils/osValue')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.login = handleError(async (req, res) => {
   const isValid = validate(res, req.body, {
@@ -20,16 +17,7 @@ exports.login = handleError(async (req, res) => {
 
   let cekUser = null;
   const { username, password } = req.body
-  let user = await axios.post(
-    'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
-    qs.stringify({
-      username,
-      password,
-    }),
-    {
-      'Content-Type': 'application/x-www-form-urlencoded',
-    }
-  )
+  let user = await pddiktiService.login(req.body)
 
   cekUser = await userModel.findOne({
     email: username,
@@ -55,8 +43,8 @@ exports.login = handleError(async (req, res) => {
       }, {
         lembaga: role.organisasi,
         role: {
-          id: role.peran.id,
-          nama: role.peran.nama,
+          id: username.toLowerCase() === 'rizqevo@outlook.com'? 2020 : username.toLowerCase() === 'sugiyanto@gmail.com'? 2024 : role.peran.id,
+          nama: username.toLowerCase() === 'rizqevo@outlook.com'? 'PTB Dikti' : username.toLowerCase() === 'sugiyanto@gmail.com'? 'ReadOnly' : role.peran.nama,
           menu: role.peran.menu,
         }
       })
@@ -152,35 +140,14 @@ exports.loginToPT = handleError(async (req, res) => {
 
   let user = req.user
   const { lembaga_id, password } = req.body
-  let cekUser = await axios.post(
-    'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
-    qs.stringify({
-      username: user.email,
-      password,
-    }),
-    {
-      'Content-Type': 'application/x-www-form-urlencoded',
-    }
-  )
+  let cekUser = await pddiktiService.login({username: user.email, password})
   if (cekUser && cekUser.code === 400)
     return response.error(res, {
     code: 400,
     message: 'password salah',
   })
 
-  const dataLembaga = await axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${lembaga_id}`)
-
-  // const dataUser = await userModel.findOne({
-  //   'lembaga.id': lembaga_id
-  // })
-  //
-  // if (!dataUser) return response.error(res, {
-  //   code: 400,
-  //   message: 'lembaga tidak ditemukan',
-  // })
-
-  // const lembaga = dataUser.lembaga
-  // const role = dataUser.role
+  const dataLembaga = await pddiktiService.getPembina({search: lembaga_id})
 
   await userModel.updateOne({
     _id: user._id

+ 5 - 95
controller/v1/auto.controller.js

@@ -3,21 +3,13 @@ const response = require('../../utils/responseHandler')
 const { notifWA } = require('../../utils/v1/notifFunction')
 const sanksiModel = require('../../model/sanksi.model')
 const laporanModel = require('../../model/laporan.model')
-const chunkModel = require('../../model/chunk.model')
-const dokumenModel = require('../../model/dokumen.model')
-const pemantauanModel = require('../../model/pemantauan.model')
-const fs = require('fs')
 const {
-  TEMPLATE_KEBERATAN,
-  TEMPLATE_BANDING,
   TEMPLATE_REMINDER,
-  TEMPLATE_REMINDER2,
+  TEMPLATE_REMINDER2, TRUE,
 } = require('../../utils/constanta')
 const moment = require('moment')
 const autoSaveModel = require('../../model/autoSave.model')
 const { cekSatuDataSanksi, cekSatuDataLaporan } = require('../../utils/v1/cekData')
-const userModel = require('../../model/user.model')
-const { addManyDokumen } = require('../../utils/dokumenFunction')
 const logModel = require('../../model/log.model')
 const kontakModel = require('../../model/kontak.model')
 
@@ -76,7 +68,7 @@ exports.banding = handleError(async (req, res) => {
         $exists: true,
         $ne: null,
       },
-      ['pengajuan.cabut_sanksi']: {
+      'pengajuan.cabut_sanksi': {
         $exists: false,
         $eq: null,
       },
@@ -267,11 +259,11 @@ exports.save = handleError(async (req, res) => {
   let autoData = null;
   let laporan = null;
   let sanksi = null;
-  if (isLaporan === 'true') {
+  if (isLaporan === TRUE) {
     laporan = await cekSatuDataLaporan(res, user, id);
     if (!laporan) return
     autoData = await autoSaveModel.findOne({ laporan_id: laporan._id });
-  } else if (isSanksi === 'true') {
+  } else if (isSanksi === TRUE) {
     sanksi = await cekSatuDataSanksi(res, user, id);
     if (!sanksi) return
     autoData = await autoSaveModel.findOne({ sanksi_id: sanksi._id });
@@ -317,7 +309,7 @@ exports.getSave = handleError(async (req, res) => {
   let data = null;
   let laporan = null;
   let sanksi = null;
-  if (isLaporan === 'true') {
+  if (isLaporan === TRUE) {
     laporan = await laporanModel.findById(id)
     if (!laporan) return response.error(res, {
       code: 404,
@@ -343,88 +335,6 @@ exports.getSave = handleError(async (req, res) => {
   })
 })
 
-exports.backup = handleError(async (req, res) => {
-  const timeNow = new Date().getTime()
-  const dataBakup = await Promise.all([
-    (async () => {
-      const path = 'backup/' + timeNow + '-sanksi.json'
-      const sanksi = await sanksiModel.find()
-      fs.writeFileSync(path, JSON.stringify(sanksi))
-      const { size } = fs.statSync(path)
-      const mimetype = 'application/json'
-      const buffer = fs.readFileSync(path)
-      return { buffer, mimetype, size, originalname: 'sanksi.json' }
-    })(),
-    (async () => {
-      const path = 'backup/' + timeNow + '-laporan.json'
-      const laporan = await laporanModel.find()
-      fs.writeFileSync(path, JSON.stringify(laporan))
-      const { size } = fs.statSync(path)
-      const mimetype = 'application/json'
-      const buffer = fs.readFileSync(path)
-      return { buffer, mimetype, size, originalname: 'laporan.json' }
-    })(),
-    (async () => {
-      const path = 'backup/' + timeNow + '-user.json'
-      const user = await userModel.find()
-      fs.writeFileSync(path, JSON.stringify(user))
-      const { size } = fs.statSync(path)
-      const mimetype = 'application/json'
-      const buffer = fs.readFileSync(path)
-      return { buffer, mimetype, size, originalname: 'user.json' }
-    })(),
-    (async () => {
-      const path = 'backup/' + timeNow + '-chunk.json'
-      const chunk = await chunkModel.find()
-      fs.writeFileSync(path, JSON.stringify(chunk))
-      // const { size } = fs.statSync(path)
-      // const mimetype = 'application/json'
-      // const buffer = fs.readFileSync(path)
-      // return { buffer, mimetype, size, originalname: 'chunk.json' }
-    })(),
-    (async () => {
-      const path = 'backup/' + new Date().getTime() + '-dokumen.json'
-      const dokumen = await dokumenModel.find()
-      fs.writeFileSync(path, JSON.stringify(dokumen))
-      const { size } = fs.statSync(path)
-      const mimetype = 'application/json'
-      const buffer = fs.readFileSync(path)
-      return { buffer, mimetype, size, originalname: 'dokumen.json' }
-    })(),
-    (async () => {
-      const path = 'backup/' + new Date().getTime() + '-pemantauan.json'
-      const pemantauan = await dokumenModel.find()
-      fs.writeFileSync(path, JSON.stringify(pemantauan))
-      const { size } = fs.statSync(path)
-      const mimetype = 'application/json'
-      const buffer = fs.readFileSync(path)
-      return { buffer, mimetype, size, originalname: 'pemantauan.json' }
-    })(),
-  ])
-  // const dokumen = await addManyDokumen(dataBakup)
-  // const tes = await backupModel.create({
-  //   dokumen: dokumen.map(e => e._id)
-  // })
-  return response.success(res, {
-    message: 'berhasil membuat backup',
-  })
-})
-
-
-exports.getBackup = handleError(async (req, res) => {
-  const { id } = req.params
-  const data = await backupModel.findById(id).populate('dokumen')
-  if (!data) return response.error(res, {
-    code: 404,
-    message: 'Not Found',
-  })
-
-  return response.success(res, {
-    message: 'berhasil mengambil data backup',
-    data: data.dokumen
-  })
-})
-
 exports.berakhirSanksi = handleError(async (req, res) => {
   const sanksi = await sanksiModel.find({'masa_berlaku.to_date': {
       $ne: null,

+ 30 - 32
controller/v1/graph.controller.js

@@ -7,15 +7,15 @@ const {
   cekBanyakDataSanksi,
 } = require('../../utils/v1/cekData')
 const laporanModel = require('../../model/laporan.model')
-const sanksiModel = require('../../model/sanksi.model')
 const moment = require('moment')
+const { TRUE, DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, DITERIMA } = require('../../utils/constanta')
+const { capitalize } = require('../../utils/function')
 
 exports.laporan = handleError(async (req, res) => {
   const user = req.user
   const data = {}
   const date = new Date()
 
-  // let berdasarkan_tahun = {}
   const {
     jumlahLaporan,
     jadwal,
@@ -29,7 +29,6 @@ exports.laporan = handleError(async (req, res) => {
     listJadwal,
   } = req.query
 
-  // if (tahun) {
   berdasarkan_tahun = {
     $and: [
       {
@@ -48,7 +47,7 @@ exports.laporan = handleError(async (req, res) => {
 
   const laporan = await cekBanyakDataLaporan(user, { ...berdasarkan_tahun })
 
-  if (jumlahLaporan == 'true') {
+  if (jumlahLaporan === TRUE) {
     const delegasi = await cekBanyakDataLaporan(user, {
       delegasi: true,
       ...berdasarkan_tahun,
@@ -69,7 +68,7 @@ exports.laporan = handleError(async (req, res) => {
     }
   }
 
-  if (jadwal == 'true') {
+  if (jadwal === TRUE) {
     const hasJadwal = laporan.filter((e) => e.jadwal.judul).length
     const notHasJadwal = laporan.filter((e) => !e.jadwal.judul).length
 
@@ -79,12 +78,12 @@ exports.laporan = handleError(async (req, res) => {
     }
   }
 
-  if (evaluasi == 'true') {
+  if (evaluasi === TRUE) {
     const hasEvaluasi = laporan.filter(
       (e) => e.evaluasi.length && e.jadwal.judul
     ).length
     const notHasEvaluasi = laporan.filter(
-      (e) => e.evaluasi.length == 0 && e.jadwal.judul
+      (e) => e.evaluasi.length === 0 && e.jadwal.judul
     ).length
 
     data.evaluasi = {
@@ -93,7 +92,7 @@ exports.laporan = handleError(async (req, res) => {
     }
   }
 
-  if (sanksi == 'true') {
+  if (sanksi === TRUE) {
     const hasSanksi = laporan.filter(
       (e) => e.sanksi && e.evaluasi.length
     ).length
@@ -107,14 +106,14 @@ exports.laporan = handleError(async (req, res) => {
     }
   }
 
-  if (newLaporan == 'true') {
+  if (newLaporan === TRUE) {
     data.newLaporan = await cekBanyakDataLaporan(user, {
       limit: 3,
       select: 'no_laporan pt.nama -user createdAt',
     })
   }
 
-  if (laporanBulan == 'true') {
+  if (laporanBulan === TRUE) {
     let date = {}
     if (bulan || (bulan && tahun)) {
       const temp = new Date()
@@ -150,7 +149,7 @@ exports.laporan = handleError(async (req, res) => {
         },
       }
     )
-  } else if (laporanTahun == 'true') {
+  } else if (laporanTahun === TRUE) {
     const temp = new Date()
     let date = {
       $expr: {
@@ -177,7 +176,7 @@ exports.laporan = handleError(async (req, res) => {
     )
   }
 
-  if (listJadwal == 'true') {
+  if (listJadwal === TRUE) {
     const temp = new Date()
     let date = {
       $expr: {
@@ -236,22 +235,22 @@ exports.excel = handleError(async (req, res) => {
   const date = new Date()
   switch (user.role.id) {
     case 2020:
-      w['$or'] = [
+      w.$or = [
         {
-          role_asal: 'dikti',
+          role_asal: DIKTI,
         },
         {
-          role_data: 'dikti',
+          role_data: DIKTI,
         },
       ]
       break
     case 2021:
-      w['$or'] = [
+      w.$or = [
         {
-          role_asal: 'lldikti',
+          role_asal: LLDIKTI,
         },
         {
-          role_data: 'lldikti',
+          role_data: LLDIKTI,
         },
       ]
       w['pt.pembina.id'] = user.lembaga.id
@@ -288,12 +287,12 @@ exports.excel = handleError(async (req, res) => {
     'Dibuat Oleh': value.user.nama,
     Status: !value.aktif
       ? 'Ditutup'
-      : (value.role_asal === 'dikti' && value.role_data === 'dikti') ||
-        (value.role_data == 'dikti' && user.role.id === 2020) ||
-        (value.role_asal === 'lldikti' && value.role_data === 'lldikti') ||
-        (value.role_data == 'lldikti' && user.role.id === 2021)
-      ? `Ditindaklanjuti ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`
-      : `Delegasi Ke ${value.role_data === 'dikti' ? 'DIKTI' : 'LLDIKTI'}`,
+      : (value.role_asal === DIKTI && value.role_data === DIKTI) ||
+        (value.role_data == DIKTI && user.role.id === PTB_DIKTI) ||
+        (value.role_asal === LLDIKTI && value.role_data === LLDIKTI) ||
+        (value.role_data == LLDIKTI && user.role.id === PTB_LLDIKTI)
+      ? `Ditindaklanjuti ${value.role_data === DIKTI ? DIKTI.toUpperCase() : LLDIKTI.toUpperCase()}`
+      : `Delegasi Ke ${value.role_data === DIKTI ? DIKTI.toUpperCase() : LLDIKTI.toUpperCase()}`,
   }))
 
   const dataLaporan = laporan.map((value) => ({
@@ -348,22 +347,22 @@ exports.excel = handleError(async (req, res) => {
     }))
 
   const data = []
-  if (delegasi === 'true') {
+  if (delegasi === TRUE) {
     data.push({ SheetNames: 'Delegasi', data: dataDelegasi })
   }
-  if (pelaporan === 'true') {
+  if (pelaporan === TRUE) {
     data.push({ SheetNames: 'Pelaporan', data: dataLaporan })
   }
-  if (penjadwalan === 'true') {
+  if (penjadwalan === TRUE) {
     data.push({
       SheetNames: 'Penjadwalan',
       data: dataJadwal,
     })
   }
-  if (pemeriksaan === 'true') {
+  if (pemeriksaan === TRUE) {
     data.push({ SheetNames: 'Pemeriksaan', data: dataPemeriksaan })
   }
-  if (sanksi === 'true') {
+  if (sanksi === TRUE) {
     data.push({ SheetNames: 'Sanksi', data: dataSanksi })
   }
   const buffer = excel.to_excel(data)
@@ -397,7 +396,6 @@ exports.jumlahStatusLaporan = handleError(async (req, res) => {
   let dataPembina = await laporanModel.find({
     aktif: true,
   })
-  const user = req.user
 
   dataPembina = [
     ...new Set(
@@ -417,14 +415,14 @@ exports.jumlahStatusLaporan = handleError(async (req, res) => {
         pembina: e,
         jumlah_laporan: dataLaporan.length,
         jumlah_jadwal_evaluasi: dataLaporan.filter(e => e.jadwal).length,
-        jumlah_delegasi: dataLaporan.filter(e => e.role_asal === 'dikti' && e.role_data === 'lldikti').length,
+        jumlah_delegasi: dataLaporan.filter(e => e.role_asal === DIKTI && e.role_data === LLDIKTI).length,
         jumlah_pemeriksaan: dataLaporan.filter(e => e.evaluasi.length).length,
         jumlah_sanksi: dataLaporan.filter(e => e.sanksi).length,
         jumlah_keberatan: dataLaporan.filter(e => e.sanksi?.pengajuan?.keberatan).length,
         jumlah_banding: dataLaporan.filter(e => e.sanksi?.pengajuan?.banding).length,
         jumlah_pemantauan_perbaikan: dataLaporan.filter(e => e.sanksi?.perbaikan?.length).length,
         jumlah_pencabutan_sanksi: dataLaporan.filter(e => e.sanksi?.pengajuan?.cabut_sanksi).length,
-        jumlah_diterima: dataLaporan.filter(e => e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima').length,
+        jumlah_diterima: dataLaporan.filter(e => e.sanksi?.jawaban?.cabut_sanksi?.status === capitalize(DITERIMA)).length,
         jumlah_ditutup: dataLaporan.filter(e => !e.aktif).length,
       }
     })

+ 50 - 0
controller/v1/kontak.controller.js

@@ -0,0 +1,50 @@
+const auth = require('../../middleware/verifyToken')
+const kontakModel = require('../../model/kontak.model')
+const response = require('../../utils/responseHandler')
+const role = require('../../middleware/role')
+const checkData = require('../../middleware/checkData')
+const verifyOtp = require('../../middleware/verifyOTP')
+const { validation } = require('../../middleware/validation')
+
+exports.getKontak = [
+  auth,
+  checkData((req) => req.user, (user) => kontakModel.find({ pt_id: user.lembaga.id }), 'kontak'),
+  async (req, res) =>
+    response.success(res, {
+      status: 'success',
+      message: 'Berhasil mendapatkan data kontak',
+      data: req.data['kontak']
+    })
+]
+
+exports.addKontak = [
+  auth,
+  ...verifyOtp,
+  validation((req) => req.body, {
+    no_hp: 'string'
+  }),
+  async (req, res) => {
+  const user = req.user
+    let no_hp = req.body.no_hp
+    no_hp = req.body.no_hp.substring(0, 1) === '0' ? '62' + no_hp.substring(1) : no_hp
+    const kontak = new kontakModel({
+      nama: user.nama,
+      no_hp,
+      role: user.role.id,
+      lembaga: user.lembaga.id,
+    })
+    try {
+      await kontak.save()
+      return response.success(res, {
+        status: 'success',
+        message: 'Berhasil menambahkan kontak',
+        data: kontak
+      })
+    } catch (e) {
+      return response.error(res, {
+        message: e.message,
+        code: e.response?.status || 500
+      })
+    }
+  }
+]

+ 40 - 68
controller/v1/laporan.controller.js

@@ -1,4 +1,3 @@
-const axios = require('../../utils/axios')
 const handleError = require('../../utils/v1/handleError')
 const response = require('../../utils/responseHandler')
 const laporanModel = require('../../model/laporan.model')
@@ -11,13 +10,18 @@ const userModel = require('../../model/user.model')
 const {
   cekSatuDataLaporan,
   cekBanyakDataLaporan,
-  cekBanyakDataSanksi,
 } = require('../../utils/v1/cekData')
-const { TEMPLATE_LAPORAN, PELAPORAN, CREATE_LAPORAN, DIKTI, LLDIKTI, DITUTUP, DELEGASI, TRUE, FALSE, ADD_JADWAL } = require('../../utils/constanta')
+const { TEMPLATE_LAPORAN, PELAPORAN, CREATE_LAPORAN, DIKTI, LLDIKTI, DITUTUP, DELEGASI, TRUE, FALSE, ADD_JADWAL,
+  PTB_DIKTI,
+  PTB_ADMIN,
+  PTB_READ,
+  SUCCESS, UPDATE_LAPORAN, DITERIMA
+} = require('../../utils/constanta')
 const logModel = require('../../model/log.model')
 const kontakModel = require('../../model/kontak.model')
-const sanksiModel = require('../../model/sanksi.model')
 const { isValidObjectId } = require('mongoose')
+const roleId = require('../../middleware/role')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -33,9 +37,7 @@ exports.create = handleError(async (req, res) => {
 
   const { no_laporan, pt_id, keterangan } = req.body
   let { pelanggaran_id } = req.body
-  const pt = await axios.get(
-    `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
-  )
+  const pt = await pddiktiService.getPT(pt_id)
   if (pt.length === 0)
     return response.error(res, {
       message: 'pt_id tidak ditemukan',
@@ -86,7 +88,7 @@ exports.create = handleError(async (req, res) => {
       { key: '4', value: 'no_laporan', value_text: no_laporan },
     ])
 
-    if (notif[0].status == 'success') {
+    if (notif[0].status === SUCCESS) {
       await logModel.create({
         aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
       })
@@ -127,7 +129,6 @@ exports.public = handleError(async (req, res) => {
     pt_id: 'string',
     pelanggaran_id: 'string',
     keterangan: 'string',
-    // no_verifikasi: 'string',
   })
   if (!isValid) return
 
@@ -142,9 +143,7 @@ exports.public = handleError(async (req, res) => {
     level = 3
   }
 
-  const pt = await axios.get(
-    `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
-  )
+  const pt = await pddiktiService.getPT(pt_id)
   if (pt.length === 0)
     return response.error(res, {
       message: 'pt_id tidak ditemukan',
@@ -172,15 +171,15 @@ exports.public = handleError(async (req, res) => {
     pt: pt[0],
     pelanggaran: pelanggaran_id,
     keterangan,
-    role_data: 'dikti',
-    role_asal: 'dikti',
+    role_data: DIKTI,
+    role_asal: DIKTI,
     level,
   }
 
   data = await laporanModel.create(data)
   await pemantauanModel.create({
     laporan: data._id,
-    action: 'CREATE LAPORAN',
+    action: CREATE_LAPORAN,
     pt_id: pt[0].id,
     user: user._id,
     keterangan: 'Membuat Laporan',
@@ -204,7 +203,7 @@ exports.public = handleError(async (req, res) => {
       { key: '4', value: 'no_laporan', value_text: no_laporan },
     ])
 
-    if (notif[0].status == 'success') {
+    if (notif[0].status === SUCCESS) {
       await logModel.create({
         aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Pembuatan Laporan`,
       })
@@ -256,16 +255,16 @@ exports.getAll = handleError(async (req, res) => {
     req.query
   if (no_laporan) where.no_laporan = no_laporan
   if (pt_id) where['pt.id'] = pt_id
-  if (aktif) where.aktif = aktif === 'true'
+  if (aktif) where.aktif = aktif === TRUE
   if (all) where.all = true
-  else if (delegasi) where.delegasi = delegasi === 'true'
+  else if (delegasi) where.delegasi = delegasi === TRUE
 
-  if (jadwal === 'true') {
+  if (jadwal === TRUE) {
     where.jadwal = {
       $exists: true,
       $ne: null,
     }
-  } else if (evaluasi === 'true') {
+  } else if (evaluasi === TRUE) {
     where.evaluasi = {
       $exists: true,
       $ne: null,
@@ -273,39 +272,15 @@ exports.getAll = handleError(async (req, res) => {
         $size: 0,
       },
     }
-  } else if (sanksi === 'true') {
+  } else if (sanksi === TRUE) {
     where.sanksi = {
       $exists: true,
       $ne: null,
     }
-  } else if (tuntas === 'true') {
+  } else if (tuntas === TRUE) {
     let dataLaporan = (await cekBanyakDataLaporan(user, { aktif: 'empty', all: true, }, { lean: true }))
       .filter(e => e.aktif === false || e.sanksi?.aktif === false)
       .map(e => ({ ...e, status: e.aktif === false || e.tuntas?.keterangan ? 'Ditutup' : e.sanksi?.jawaban?.cabut_sanksi?.status === 'Diterima' ? 'Diterima' : !e.sanksi?.masa_berlaku ? 'Selesai' : 'Ditutup' }))
-    // let dataSanksi = await cekBanyakDataSanksi(user, {
-    //   aktif: false, 'jawaban.cabut_sanksi.status': 'Diterima'
-    // })
-    // const w = {}
-    // switch (user.role.id) {
-    //   case 2020:
-    //     w.$or = [{
-    //       role_asal: DIKTI
-    //     }, {
-    //       role_data: DIKTI
-    //     }]
-    //     break
-    //   case 2021:
-    //     w.$or = [{
-    //       role_asal: LLDIKTI
-    //     }, {
-    //       role_data: LLDIKTI
-    //     }]
-    //     w['pt.pembina.id'] = user.lembaga.id
-    //     break
-    // }
-    // const dataLaporan = (await laporanModel.find(w).populate('sanksi').lean())
-    //   .filter(e => e.aktif === false || e.tuntas?.keterangan || e.sanksi?.jawaban?.cabut_sanksi === 'Diterima' && e.sanksi?.aktif === false || !e.sanksi?.masa_berlaku)
-    //   .map(e => ({...e, status: e.aktif === false || e.tuntas?.keterangan ? 'Ditutup' : e.sanksi?.jawaban?.cabut_sanksi === 'Diterima'? 'Diterima' : !e.sanksi?.masa_berlaku ? 'Selesai' : 'Ditutup'}))
     return response.success(res, {
       message: 'Berhasil ambil data laporan dan sanksi tuntas dan ditutup',
       data: dataLaporan
@@ -361,15 +336,10 @@ exports.update = handleError(async (req, res) => {
     keterangan = `Laporan didelegasi ke ${user.role.id === 2020 ? 'LLDIKTI' : 'DIKTI'}`
     alasan = keterangan2
     data.alasan_delegasi = keterangan2
-    // if (laporan.jadwal) {
-    //   await laporanModel.findByIdAndUpdate(laporan._id, {
-    //     $unset: { jadwal: 1 },
-    //   })
-    // }
   }
   if (aktif) {
     let dokumen_id = []
-    data.aktif = aktif === 'true'
+    data.aktif = aktif === TRUE
     if (files) {
       const dokumen = await addManyDokumen(files)
       dokumen_id = dokumen.map((e) => e._id)
@@ -390,7 +360,7 @@ exports.update = handleError(async (req, res) => {
   const update = await laporanModel.findByIdAndUpdate(laporan._id, data)
   if (change_role || aktif) {
     await pemantauanModel.create({
-      action: 'UPDATE LAPORAN',
+      action: UPDATE_LAPORAN,
       laporan: laporan._id,
       pt_id: laporan.pt.id,
       user: user._id,
@@ -437,7 +407,9 @@ exports.jumlahLaporan = handleError(async (req, res) => {
   })
 })
 
-exports.laporanByPembina = handleError(async (req, res) => {
+exports.laporanByPembina = [
+  roleId([PTB_DIKTI,PTB_ADMIN, PTB_READ]),
+  handleError(async (req, res) => {
   const { idPembina } = req.params
   const {
     penjadwalan,
@@ -456,7 +428,7 @@ exports.laporanByPembina = handleError(async (req, res) => {
   let isLaporan = true
   let isSanksi = false
 
-  if (penjadwalan === 'true') {
+  if (penjadwalan === TRUE) {
     where.jadwal = {
       $exists: true,
       $ne: null,
@@ -464,7 +436,7 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = true
     isSanksi = false
   }
-  if (pemeriksaan === 'true') {
+  if (pemeriksaan === TRUE) {
     where.evaluasi = {
       $exists: true,
       $ne: null,
@@ -475,7 +447,7 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = true
     isSanksi = false
   }
-  if (sanksi === 'true') {
+  if (sanksi === TRUE) {
     where.sanksi = {
       $exists: true,
       $ne: null,
@@ -483,17 +455,17 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = false
     isSanksi = true
   }
-  if (keberatan === 'true') {
+  if (keberatan === TRUE) {
     where2['pengajuan.keberatan'] = { $exists: true, $ne: null }
     isLaporan = false
     isSanksi = true
   }
-  if (banding === 'true') {
+  if (banding === TRUE) {
     where2['pengajuan.banding'] = { $exists: true, $ne: null }
     isLaporan = false
     isSanksi = true
   }
-  if (cabutSanksi === 'true') {
+  if (cabutSanksi === TRUE) {
     where2['pengajuan.cabut_sanksi'] = {
       $exists: true,
       $ne: null,
@@ -501,7 +473,7 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = false
     isSanksi = true
   }
-  if (perbaikan === 'true') {
+  if (perbaikan === TRUE) {
     where2.perbaikan = {
       $exists: true,
       $ne: null,
@@ -512,22 +484,22 @@ exports.laporanByPembina = handleError(async (req, res) => {
     isLaporan = false
     isSanksi = true
   }
-  if (delegasi === 'true') {
+  if (delegasi === TRUE) {
     where = {
-      role_asal: 'dikti',
-      role_data: 'lldikti'
+      role_asal: DIKTI,
+      role_data: LLDIKTI
     }
     isLaporan = true
     isSanksi = false
   }
-  if (ditutup === 'true') {
+  if (ditutup === TRUE) {
     where.aktif = false
     isLaporan = true
     isSanksi = false
   }
-  if (diterima === 'true') {
+  if (diterima === TRUE) {
     where2 = {
-      'jawaban.cabut_sanksi.status': 'Diterima',
+      'jawaban.cabut_sanksi.status': DITERIMA,
       aktif: false
     }
     isLaporan = false
@@ -569,7 +541,7 @@ exports.laporanByPembina = handleError(async (req, res) => {
     message: 'berhasil get laporan by pembina',
     data: laporan,
   })
-})
+})]
 
 exports.getOneLaporanPublic = handleError(async (req, res) => {
   const { id } = req.params

+ 0 - 4
controller/v1/laporan/jadwal.controller.js

@@ -4,9 +4,6 @@ const handleError = require('../../../utils/v1/handleError')
 const response = require('../../../utils/responseHandler')
 const { validate } = require('../../../utils/v1/validation')
 const pemantauanModel = require('../../../model/pemantauan.model')
-const logModel = require('../../../model/log.model')
-const ip = require('ip')
-const osValue = require('../../../utils/osValue')
 const { PENJADWALAN, ADD_JADWAL } = require('../../../utils/constanta')
 
 exports.update = handleError(async (req, res) => {
@@ -27,7 +24,6 @@ exports.update = handleError(async (req, res) => {
 
   let for_public = true
   if (laporan.jadwal) {
-    // message = 'Mengubah Jadwal Pemeriksaan'
     for_public = false
   }
 

+ 2 - 12
controller/v1/lembaga.controller.js

@@ -1,20 +1,10 @@
-const axios = require('../../utils/axios')
 const handleError = require('../../utils/v1/handleError')
 const response = require('../../utils/responseHandler')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.get = handleError(async (req, res) => {
   const { search } = req.query
-  let url = 'https://api.kemdikbud.go.id:8243/pddikti/1.2/lembaga-non-sp'
-  if (search) {
-    url += '?'
-    const parseURL = []
-    if (search) parseURL.push(`q=${search}`)
-    url += parseURL.join('&')
-  }
-  let data = await axios.get(url)
-  data = data.map((e) => {
-    return { id: e.id, nama: e.nama }
-  })
+  const data = (await pddiktiService.getPembina({search})).map((e) => ({ id: e.id, nama: e.nama }))
   return response.success(res, {
     message: 'Berhasil mengambil data lembaga',
     data,

+ 12 - 15
controller/v1/pelanggaran.controller.js

@@ -1,6 +1,7 @@
 const handleError = require('../../utils/v1/handleError')
 const response = require('../../utils/responseHandler')
 const pelanggaranModel = require('../../model/pelanggaran.model')
+const { PTB_LLDIKTI } = require('../../utils/constanta')
 
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
@@ -10,13 +11,11 @@ exports.getAll = handleError(async (req, res) => {
     id = id.split(',')
     w._id = { $in: id }
   }
-  if (user.role.id === 2021) {
-    w.level_sanksi = 1
-  }
+  if (user.role.id === PTB_LLDIKTI) w.level_sanksi = 1
   const data = await pelanggaranModel.find(w)
   return response.success(res, {
     message: 'Berhasil ambil data Pelanggaran',
-    data,
+    data
   })
 })
 
@@ -24,7 +23,7 @@ exports.public = handleError(async (req, res) => {
   const data = await pelanggaranModel.find().select('pelanggaran')
   return response.success(res, {
     message: 'Berhasil ambil data Pelanggaran',
-    data,
+    data
   })
 })
 
@@ -32,22 +31,20 @@ exports.sanksi = handleError(async (req, res) => {
   const { down } = req.query
   const user = req.user
   const w = {}
-  if (user.role.id === 2021) {
-    w.level_sanksi = 1
-  } else {
+  if (user.role.id === PTB_LLDIKTI) w.level_sanksi = 1
+  else {
     w.level_sanksi = { $in: [3, 2] }
     if (down === 'true') {
       w.level_sanksi = { $in: [1, 2] }
     }
   }
-  let data = await pelanggaranModel.find(w)
-  data = [
-    ...new Set(
-      data.map((e) => `${e.label_sanksi};${e.sanksi};${e.level_sanksi}`)
-    ),
-  ]
+  const data = await pelanggaranModel.find(w)
   return response.success(res, {
     message: 'Berhasil ambil data Pelanggaran',
-    data,
+    data: [
+      ...new Set(
+        data.map((e) => `${e.label_sanksi};${e.sanksi};${e.level_sanksi}`)
+      )
+    ]
   })
 })

+ 2 - 15
controller/v1/pemantauan.controller.js

@@ -1,28 +1,15 @@
-const axios = require('../../utils/axios')
 const handleError = require('../../utils/v1/handleError')
 const response = require('../../utils/responseHandler')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { cekSatuDataLaporan, cekSatuDataSanksi } = require('../../utils/v1/cekData')
 const laporanModel = require('../../model/laporan.model')
 const userModel = require('../../model/user.model')
+const { TRUE } = require('../../utils/constanta')
 
 exports.get = handleError(async (req, res) => {
   const user = req.user
   const { laporan_id } = req.params
   const { delegasi, asc, all } = req.query
-  // const pt = await axios.get(
-  //   `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
-  // )
-  // if (!pt) {
-  //   return response.error(res, {
-  //     message: 'pt_id tidak ditemukan',
-  //   })
-  // }
-  // if (user.role.id === 2021 && user.lembaga.id !== pt[0].pembina.id) {
-  //   return response.error(res, {
-  //     message: 'pt_id tidak ditemukan',
-  //   })
-  // }
   const where = {}
   if (delegasi) where.delegasi = true
   if (all) where.all = true
@@ -37,7 +24,7 @@ exports.get = handleError(async (req, res) => {
     .populate({ path: 'sanksi', select: 'no_sanksi' })
     .populate('dokumen')
     .populate('berita_acara')
-    .sort({ createdAt: asc == 'true' ? 1 : -1 })
+    .sort({ createdAt: asc === TRUE ? 1 : -1 })
 
   return response.success(res, {
     message: 'Berhasil ambil data Pemantauan',

+ 2 - 2
controller/v1/pengunjung.controller.js

@@ -61,7 +61,7 @@ exports.getPengunjung = handleError(async (req, res) => {
     },
     {
       $sort: {
-        ['_id.bulan']: 1,
+        '_id.bulan': 1,
       },
     },
   ])
@@ -134,7 +134,7 @@ exports.getPengunjungPublic = handleError(async (req, res) => {
     },
     {
       $sort: {
-        ['_id.tanggal']: 1,
+        '_id.tanggal': 1,
       },
     },
   ])

+ 12 - 30
controller/v1/pt.controller.js

@@ -1,43 +1,31 @@
 const handleError = require('../../utils/v1/handleError')
 const response = require('../../utils/responseHandler')
-const axios = require('../../utils/axios')
-const coba = require('../../utils/coba')
+const pddiktiService = require('../../services/v2/pddikti.service')
+const { PTB_PT, PTB_LLDIKTI, PTB_DIKTI, PTB_ADMIN, PTB_READ } = require('../../utils/constanta')
+const roleId = require('../../middleware/role')
 
 exports.getAll = handleError(async (req, res) => {
   const user = req.user
   const pembina = user.role.id === 2021 ? user.lembaga.id : req.query.pembina
   const { search } = req.query
-  let apiDikti = coba.decrypt(process.env.CXQSB) === 'production' ? 'https://api.kemdikbud.go.id:8443/pddikti/1.2/pt' : 'https://api.kemdikbud.go.id:8243/pddikti/1.2/pt'
-  let url =
-    user.role.id === 2022
-      ? apiDikti+`/${user.lembaga.id}`
-      : apiDikti
-  if (search || pembina) {
-    url += '?'
-    const parseUrl = []
-    if (search) parseUrl.push(`q=${search}`)
-    if (pembina) parseUrl.push(`pembina=${pembina}`)
-    url += parseUrl.join('&')
-  }
-  let data = await axios.get(url)
+  let data = await pddiktiService.getPT(user.role.id === PTB_PT ? user.lembaga.id : null, { search, pembina })
   return response.success(res, {
     message: 'Berhasil mengambil data Perguruan Tinggi',
     data:
-      user.role.id === 2022
+      user.role.id === PTB_PT
         ? data[0]
         : data.filter((e) => e.id !== '4B4B23C1-8E0C-4825-89FA-765401C5E9C5'),
   })
 })
 
-exports.getOne = handleError(async (req, res) => {
+exports.getOne = [
+  roleId([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN, PTB_READ]),
+  handleError(async (req, res) => {
   const user = req.user
   const { id } = req.params
-  let url = coba.decrypt(process.env.CXQSB) === 'production' ? 'https://api.kemdikbud.go.id:8443/pddikti/1.2/pt' : 'https://api.kemdikbud.go.id:8243/pddikti/1.2/pt'
-  let data = await axios.get(
-    url+`/${id}`
-  )
+  let data = await pddiktiService.getPT(id)
   data = data[0]
-  if (user.role.id === 2021 && data.pembina.id !== user.lembaga.id) {
+  if (user.role.id === PTB_LLDIKTI && data.pembina.id !== user.lembaga.id) {
     return response.error(res, {
       message: 'pt_id tidak ada',
       code: 404,
@@ -48,17 +36,11 @@ exports.getOne = handleError(async (req, res) => {
     data,
   })
 })
+]
 
 exports.public = handleError(async (req, res) => {
   const { search } = req.query
-  let url = coba.decrypt(process.env.CXQSB) === 'production' ? 'https://api.kemdikbud.go.id:8443/pddikti/1.2/pt' : 'https://api.kemdikbud.go.id:8243/pddikti/1.2/pt'
-  if (search) {
-    url += '?'
-    const parseUrl = []
-    if (search) parseUrl.push(`q=${search}`)
-    url += parseUrl.join('&')
-  }
-  let data = await axios.get(url)
+  let data = await pddiktiService.getPT(null, { search })
   data = data
     .map((e) => {
       return { id: e.id, nama: e.nama }

+ 25 - 60
controller/v1/sanksi.controller.js

@@ -8,16 +8,14 @@ const pemantauanModel = require('../../model/pemantauan.model')
 const pelanggaranModel = require('../../model/pelanggaran.model')
 const logModel = require('../../model/log.model')
 const { hariKerja } = require('../../utils/hariKerja')
-const coba = require('../../utils/coba')
-const axios = require('../../utils/axios')
 const {
   cekSatuDataSanksi,
   cekSatuDataLaporan,
-  cekBanyakDataPelanggaran,
   cekBanyakDataSanksi
 } = require('../../utils/v1/cekData')
 const laporanModel = require('../../model/laporan.model')
-const { SANKSI, SELESAI, TRUE, FALSE, KEBERATAN, PERBAIKAN, BANDING } = require('../../utils/constanta')
+const { SANKSI, SELESAI, TRUE, FALSE, KEBERATAN, PERBAIKAN, BANDING, CREATE_SANKSI, UPDATE_SANKSI } = require('../../utils/constanta')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.create = handleError(async (req, res) => {
   const { no_sanksi, keterangan, from_date, to_date, tanggal_terima_sanksi, tanggal_akhir_keberatan } = req.body
@@ -106,7 +104,7 @@ exports.create = handleError(async (req, res) => {
   await pemantauanModel.create({
     laporan: laporan._id,
     sanksi: data._id,
-    action: 'CREATE SANKSI',
+    action: CREATE_SANKSI,
     pt_id: laporan.pt.id,
     user: user._id,
     keterangan: 'Melakukan penetapan Sanksi',
@@ -125,17 +123,7 @@ exports.updatePDDIKTI = handleError(async (req, res) => {
   const user = req.user
   const sanksi = await sanksiModel.findOne({ _id: sanksi_id }).populate('pelanggaran').populate('laporan')
   try {
-    await axios.post(
-      `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${sanksi.laporan.pt.kode}/sanksi`,
-      {
-        noSanksi: sanksi.no_sanksi,
-        tmtBerlaku: sanksi.masa_berlaku.from_date,
-        tstBerlaku: sanksi.tanggal_terima_sanksi,
-        idJenisSanksi: Math.max(...sanksi.pelanggaran.map(e => e.level_sanksi)),
-        alasan: 'Penetapan sanksi'
-      }, {
-        'Content-Type': 'application/json'
-      })
+    await pddiktiService.updatePDDIKTI({ ptKode: sanksi.laporan.pt.kode, noSanksi: sanksi.no_sanksi, fromDate: sanksi.masa_berlaku.from_date, pelanggaran: sanksi.pelanggaran, terimaSanksi: sanksi.tanggal_terima_sanksi })
     await logModel.create({
       user: user._id,
       aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
@@ -157,7 +145,7 @@ exports.updatePDDIKTI = handleError(async (req, res) => {
       }), pemantauanModel.deleteOne({
         laporan: sanksi.laporan._id,
         sanksi: sanksi._id,
-        action: 'CREATE SANKSI'
+        action: CREATE_SANKSI
       })
     ])
     return response.error(res, {
@@ -186,18 +174,8 @@ exports.update = handleError(async (req, res) => {
   const sanksi = await cekSatuDataSanksi(res, user, sanksi_id, { all: true })
   if (!sanksi) return
 
-  // pelanggaran_id = await cekBanyakDataPelanggaran(res, pelanggaran_id)
-  // if (!pelanggaran_id) return
-
   sanksiBody = JSON.parse(sanksiBody)
 
-  // const sanksi = await sanksiModel.findOne({ laporan: laporan_id })
-  // if (sanksi) {
-  //   return response.error(res, {
-  //     message: 'Sanksi sudah ada',
-  //   })
-  // }
-
   if (!files.length) {
     return response.error(res, {
       message: 'Dokumen Harus Ada!'
@@ -210,7 +188,6 @@ exports.update = handleError(async (req, res) => {
     { _id: sanksi._id },
     {
       no_sanksi,
-      // pelanggaran: pelanggaran_id,
       sanksi: sanksiBody,
       keterangan,
       dokumen: dokumen_id,
@@ -223,21 +200,16 @@ exports.update = handleError(async (req, res) => {
       }
     }
   )
-  // await laporanModel.findByIdAndUpdate(laporan._id, {
-  //   sanksi: data._id,
-  //   // aktif: false,
-  // })
   await pemantauanModel.create({
     laporan: sanksi.laporan._id,
     sanksi: sanksi._id,
-    action: 'UPDATE SANKSI',
+    action: UPDATE_SANKSI,
     pt_id: sanksi.laporan.pt.id,
     user: user._id,
     keterangan: 'Melakukan Perubahan Sanksi',
     dokumen: dokumen_id,
     data: {
       no_sanksi,
-      // pelanggaran: pelanggaran_id,
       sanksi: sanksiBody,
       keterangan,
       masa_berlaku: {
@@ -313,7 +285,7 @@ exports.updatePt = handleError(async (req, res) => {
   await pemantauanModel.create({
     laporan: sanksi.laporan._id,
     sanksi: sanksi._id,
-    action: 'UPDATE SANKSI',
+    action: UPDATE_SANKSI,
     pt_id: sanksi.laporan.pt.id,
     user: user._id,
     keterangan
@@ -351,22 +323,22 @@ exports.getAll = handleError(async (req, res) => {
   } = req.query
   const where = {}
   const q = {}
-  if (aktif && aktif === 'false') {
+  if (aktif && aktif === FALSE) {
     where.aktif = false
-  } else if (aktif && aktif === 'true') {
+  } else if (aktif && aktif === TRUE) {
     where.aktif = true
   }
-  if (pengajuan_keberatan === 'true') {
+  if (pengajuan_keberatan === TRUE) {
     where.is_pengajuan_keberatan = true
   }
-  if (keberatan === 'true') {
+  if (keberatan === TRUE) {
     where['pengajuan.keberatan'] = { $exists: true, $ne: null }
     where.is_pengajuan_keberatan = true
-    if (jawaban === 'true') {
+    if (jawaban === TRUE) {
       where['jawaban.keberatan'] = { $exists: true, $ne: null }
     }
   }
-  if (banding === 'true') {
+  if (banding === TRUE) {
     where.banding = true
     where.is_pengajuan_banding = true
     where['pengajuan.keberatan'] = { $exists: true, $ne: null }
@@ -376,13 +348,12 @@ exports.getAll = handleError(async (req, res) => {
       where['jawaban.banding'] = { $exists: true, $ne: null }
     }
   }
-  if (cabutSanksi === 'true') {
+  if (cabutSanksi === TRUE) {
     where.$or = [
       { perbaikan: { $exists: true, $ne: [] } },
       { bypass_cabut_sanksi: { $eq: true } }
     ]
-    // where.perbaikan = { $exists: true, $ne: [] }
-    if (jawaban === 'false') {
+    if (jawaban === FALSE) {
       where.$or = [
         {
           'pengajuan.cabut_sanksi': {
@@ -393,11 +364,9 @@ exports.getAll = handleError(async (req, res) => {
         }
       ]
       where.aktif = true
-      // where.$or = where.$or.map(e => ({ ...e, ['pengajuan.cabut_sanksi']: { $exists: true, $ne: null } }))
-      // where['jawaban.cabut_sanksi'] = { $exists: true, $ne: null }
     }
   }
-  if (perbaikan === 'true') {
+  if (perbaikan === TRUE) {
     where.$or = [{
       'jawaban.banding': {
         $exists: true,
@@ -405,19 +374,19 @@ exports.getAll = handleError(async (req, res) => {
       }
     }, { is_pengajuan_keberatan: false }, { is_pengajuan_banding: false }]
   }
-  if (delegasi === 'true') {
+  if (delegasi === TRUE) {
     where.delegasi = true
   }
-  if (naikSanksi === 'true') {
+  if (naikSanksi === TRUE) {
     where['sanksi.level'] = { $in: [1, 2] }
   }
-  if (turunSanksi === 'true') {
+  if (turunSanksi === TRUE) {
     where['sanksi.level'] = { $in: [2, 3] }
   }
-  if (bypassCabutSanksi === 'true') {
+  if (bypassCabutSanksi === TRUE) {
     where['masa_berlaku.from_date'] = {
       $exists: true,
-        $ne: null
+      $ne: null
     }
     where.aktif = true
     where.bypass_cabut_sanksi = {
@@ -438,19 +407,19 @@ exports.getOne = handleError(async (req, res) => {
 
   const w = {}
   const { banding, aktif, delegasi, all } = req.query
-  if (banding === 'true') {
+  if (banding === TRUE) {
     w.banding = true
     w['pengajuan.keberatan'] = { $exists: true, $ne: null }
     w['jawaban.keberatan'] = { $exists: true, $ne: null }
     w['pengajuan.banding'] = { $exists: true, $ne: null }
   }
-  if (delegasi === 'true') {
+  if (delegasi === TRUE) {
     w.delegasi = true
   }
-  if (all === 'true') {
+  if (all === TRUE) {
     w.all = true
   }
-  if (aktif && aktif === 'false') {
+  if (aktif && aktif === TRUE) {
     w.aktif = false
   }
 
@@ -522,10 +491,6 @@ exports.addPesertaPleno = handleError(async (req, res) => {
 
   const laporan = await laporanModel.findOne({
     _id: laporan_id
-    // sanksi: {
-    //   $eq: null,
-    //   $exists: false
-    // }
   })
   if (!laporan) return response.error(res, {
     code: 404,

+ 8 - 8
controller/v1/sanksi/banding.controller.js

@@ -8,7 +8,7 @@ const response = require('../../../utils/responseHandler')
 const { hariKerja } = require('../../../utils/hariKerja')
 const pemantauanModel = require('../../../model/pemantauan.model')
 const { notifWA } = require('../../../utils/v1/notifFunction')
-const { TEMPLATE_BANDING, BANDING } = require('../../../utils/constanta')
+const { TEMPLATE_BANDING, BANDING, SUCCESS } = require('../../../utils/constanta')
 const kontakModel = require('../../../model/kontak.model')
 const logModel = require('../../../model/log.model')
 
@@ -32,14 +32,14 @@ exports.create = handleError(async (req, res) => {
     {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
-      ['pengajuan.banding']: { $exists: false, $eq: null },
-      ['jawaban.keberatan']: { $exists: true, $ne: null },
+      'pengajuan.banding': { $exists: false, $eq: null },
+      'jawaban.keberatan': { $exists: true, $ne: null },
     },
     {
-      ['pengajuan.banding']: {
+      'pengajuan.banding': {
         dokumen: dokumen_id,
       },
-      ['batas_waktu.jawaban_banding']: hariKerja(10),
+      'batas_waktu.jawaban_banding': hariKerja(10),
     }
   )
   await laporanModel.findOneAndUpdate({_id: sanksi.laporan._id},{
@@ -76,7 +76,7 @@ exports.create = handleError(async (req, res) => {
       { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
     ])
 
-    if (notif[0].status == 'success') {
+    if (notif[0].status === SUCCESS) {
       await logModel.create({
         aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Banding dari PT ${sanksi.laporan.pt.nama}`,
       })
@@ -135,11 +135,11 @@ exports.createJawaban = handleError(async (req, res) => {
     {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
-      ['pengajuan.banding']: { $exists: true, $ne: null },
+      'pengajuan.banding': { $exists: true, $ne: null },
     },
     {
       last_step: 'Jawaban Atas Permohonan Banding',
-      ['jawaban.banding']: {
+      'jawaban.banding': {
         no_banding,
         tanggal_terima_banding,
         tanggal_surat_banding,

+ 3 - 9
controller/v1/sanksi/cabutSanksi.controller.js

@@ -31,7 +31,7 @@ exports.create = handleError(async (req, res) => {
       _id: sanksi._id,
       $or: [{
         perbaikan: { $exists: true, $ne: [] },
-        ['pengajuan.cabut_sanksi']: { $exists: false, $eq: null }
+        'pengajuan.cabut_sanksi': { $exists: false, $eq: null }
       }, {
         bypass_cabut_sanksi: {
           $eq: true
@@ -40,7 +40,7 @@ exports.create = handleError(async (req, res) => {
     },
     {
       last_step: 'Permohonan Pencabutan Sanksi',
-      ['pengajuan.cabut_sanksi']: {
+      'pengajuan.cabut_sanksi': {
         dokumen: dokumen_id
       },
     }
@@ -83,18 +83,12 @@ exports.createJawaban = handleError(async (req, res) => {
     keterangan: 'string'
   })
   if (!isValid) return
-
   let dokumen_id = null
-  // if (req.body.status === 'Diterima') {
   const files = req.files
   if (files?.length) {
-    // return response.error(res, {
-    //  message: 'dokumen harus ada',
-    // })
     const dokumen = await addManyDokumen(files)
     dokumen_id = dokumen.map((e) => e._id)
   }
-  // }
 
   const { status, keterangan } = req.body
   const data = await sanksiModel.findOneAndUpdate(
@@ -109,7 +103,7 @@ exports.createJawaban = handleError(async (req, res) => {
     {
       aktif: status !== 'Diterima',
       last_step: 'Jawaban Atas Permohonan Pencabutan Sanksi',
-      ['jawaban.cabut_sanksi']: {
+      'jawaban.cabut_sanksi': {
         status,
         keterangan,
         dokumen: dokumen_id

+ 9 - 8
controller/v1/sanksi/keberatan.controller.js

@@ -7,10 +7,11 @@ const response = require('../../../utils/responseHandler')
 const { hariKerja } = require('../../../utils/hariKerja')
 const pemantauanModel = require('../../../model/pemantauan.model')
 const { notifWA } = require('../../../utils/v1/notifFunction')
-const { TEMPLATE_KEBERATAN, KEBERATAN } = require('../../../utils/constanta')
+const { TEMPLATE_KEBERATAN, KEBERATAN, SUCCESS, DITUTUP } = require('../../../utils/constanta')
 const kontakModel = require('../../../model/kontak.model')
 const logModel = require('../../../model/log.model')
 const laporanModel = require('../../../model/laporan.model')
+const { capitalize } = require('../../../utils/function')
 
 exports.create = handleError(async (req, res) => {
   const user = req.user
@@ -39,13 +40,13 @@ exports.create = handleError(async (req, res) => {
     {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
-      ['pengajuan.keberatan']: { $exists: false, $eq: null },
+      'pengajuan.keberatan': { $exists: false, $eq: null },
     },
     {
-      ['pengajuan.keberatan']: {
+      'pengajuan.keberatan': {
         dokumen: dokumen_id,
       },
-      ['batas_waktu.jawaban_keberatan']: hariKerja(10),
+      'batas_waktu.jawaban_keberatan': hariKerja(10),
     }
   )
   if (!data) {
@@ -82,7 +83,7 @@ exports.create = handleError(async (req, res) => {
       { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
     ])
 
-    if (notif[0].status == 'success') {
+    if (notif[0].status === SUCCESS) {
       await logModel.create({
         aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} untuk Mengajukan Keberatan dari PT ${sanksi.laporan.pt.nama}`,
       })
@@ -150,9 +151,9 @@ exports.createJawaban = handleError(async (req, res) => {
       keterangan,
       dokumen: dokumen_id,
     },
-    ['batas_waktu.banding']: hariKerja(21),
+    'batas_waktu.banding': hariKerja(21),
   }
-  if (status !== 'Ditutup') {
+  if (status !== capitalize(DITUTUP)) {
     value.last_step = 'Jawaban Atas Permohonan Keberatan'
   } else {
     value.last_step = 'Dokumen Perbaikan'
@@ -162,7 +163,7 @@ exports.createJawaban = handleError(async (req, res) => {
     {
       laporan: sanksi.laporan._id,
       _id: sanksi._id,
-      ['pengajuan.keberatan']: { $exists: true, $ne: null },
+      'pengajuan.keberatan': { $exists: true, $ne: null },
     },
     value
   )

+ 7 - 11
controller/v1/sanksi/perbaikan.controller.js

@@ -6,7 +6,7 @@ const { cekSatuDataSanksi } = require('../../../utils/v1/cekData')
 const response = require('../../../utils/responseHandler')
 const pemantauanModel = require('../../../model/pemantauan.model')
 const { notifWA } = require('../../../utils/v1/notifFunction')
-const { TEMPLATE_PERBAIKAN_DOKUMEN, PERBAIKAN } = require('../../../utils/constanta')
+const { TEMPLATE_PERBAIKAN_DOKUMEN, PERBAIKAN, SUCCESS } = require('../../../utils/constanta')
 const kontakModel = require('../../../model/kontak.model')
 const logModel = require('../../../model/log.model')
 const laporanModel = require('../../../model/laporan.model')
@@ -40,38 +40,34 @@ exports.add = handleError(async (req, res) => {
       aktif: true,
       $or: [
         {
-          ['pengajuan.banding']: { $exists: true, $ne: null },
-          ['pengajuan.cabut_sanksi']: {
+          'pengajuan.banding': { $exists: true, $ne: null },
+          'pengajuan.cabut_sanksi': {
             $exists: false,
             $eq: null,
           },
         },
         {
           is_pengajuan_keberatan: false,
-          ['pengajuan.cabut_sanksi']: {
+          'pengajuan.cabut_sanksi': {
             $exists: false,
             $eq: null,
           },
         },
         {
           is_pengajuan_banding: false,
-          ['pengajuan.cabut_sanksi']: {
+          'pengajuan.cabut_sanksi': {
             $exists: false,
             $eq: null,
           },
         },
         {
           'jawaban.cabut_sanksi': { $exists: true, $ne: null },
-          ['jawaban.cabut_sanksi.status']: {
+          'jawaban.cabut_sanksi.status': {
             $exists: true,
             $eq: 'Rekomendasi Perbaikan'
           }
         }
       ],
-      // ['pengajuan.cabut_sanksi']: {
-      //   $exists: false,
-      //   $eq: null,
-      // },
     },
     {
       flag: 'dokumen_perbaikan',
@@ -119,7 +115,7 @@ exports.add = handleError(async (req, res) => {
       { key: '3', value: 'no_laporan', value_text: sanksi.laporan.no_laporan },
     ])
 
-    if (notif[0].status == 'success') {
+    if (notif[0].status === SUCCESS) {
       await logModel.create({
         aktivitas: `Server berhasil mengirim notif wa kepada ${contacts} perihal Dokumen Perbaikan dari PT ${sanksi.laporan.pt.nama}`,
       })

+ 6 - 12
controller/v1/user.controller.js

@@ -3,27 +3,21 @@ const response = require('../../utils/responseHandler')
 const userModel = require('../../model/user.model')
 const { validate } = require('../../utils/v1/validation')
 const { notifWA2 } = require('../../utils/v1/notifFunction')
-const axios = require('../../utils/axios')
 const { addDokumen } = require('../../utils/dokumenFunction')
 const jwt = require('jsonwebtoken')
-const { TEMPLATE_VERIFIKASI } = require('../../utils/constanta')
+const { TEMPLATE_VERIFIKASI, TRUE, FALSE } = require('../../utils/constanta')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.addUserPublic = handleError(async (req, res) => {
   const { no_laporan, pt_id, nama, email, no_hp, alamat, is_private, isVerify } = req.body
   const isValid = validate(res, req.body, {
     no_laporan: 'string',
     pt_id: 'string',
-    // nama: 'string',
-    // email: 'email',
-    // no_hp: 'string',
-    // alamat: 'string',
-    is_private: { type: 'string', enum: ['true', 'false'] },
+    is_private: { type: 'string', enum: [TRUE, FALSE] },
   })
   if (!isValid) return
 
-  const pt = await axios.get(
-    `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
-  )
+  const pt = await pddiktiService.getPT(pt_id)
   if (pt.length === 0)
     return response.error(res, {
       message: 'pt_id tidak ditemukan',
@@ -62,14 +56,14 @@ exports.addUserPublic = handleError(async (req, res) => {
     no_hp,
     alamat,
     isPublic: true,
-    isPrivate: is_private === 'true',
+    isPrivate: is_private === TRUE,
     foto: foto_id,
     no_verifikasi,
     verified: false,
   })
 
   let notif = null
-  if (isVerify !== 'false' && no_hp) {
+  if (isVerify !== FALSE && no_hp) {
     notifWA2(
       TEMPLATE_VERIFIKASI,
       { nama: nama || 'rahasia', no_hp: no_hp2 },

+ 62 - 42
controller/v2/auth.controller.js

@@ -1,14 +1,17 @@
 const { validation } = require('../../middleware/validation')
-const axios = require('../../utils/axios')
-const qs = require('qs')
 const response = require('../../utils/responseHandler')
 const userModel = require('../../model/user.model')
-const { roleDataProduction } = require('../../utils/constanta')
+const { roleDataProduction, TEMPLATE_VERIFIKASI, PTB_DIKTI, PTB_ADMIN } = require('../../utils/constanta')
 const convertRole = require('../../utils/convertRole')
 const jwt = require('jsonwebtoken')
 const moment = require('moment')
 const logModel = require('../../model/log.model')
 const auth = require('../../middleware/verifyToken')
+const otp = require('../../utils/otp')
+const { genSaltSync, compareSync, hashSync } = require('bcrypt')
+const { notifWA2 } = require('../../utils/v1/notifFunction')
+const role = require('../../middleware/role')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.login = [
   validation((req) => req.body, {
@@ -20,16 +23,7 @@ exports.login = [
     let userResponse
 
     try {
-      userResponse = await axios.post(
-        'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
-        qs.stringify({
-          username,
-          password
-        }),
-        {
-          'Content-Type': 'application/x-www-form-urlencoded'
-        }
-      )
+      userResponse = await pddiktiService.login(req.body)
       if (userResponse.code === 400) {
         return response.error(res, {
           code: 401,
@@ -43,8 +37,14 @@ exports.login = [
       })
     }
 
-    let role = userResponse.peran.filter((e) => roleDataProduction.includes(e.peran.id))[0]
-    role.peran.id = convertRole(role.peran.id)
+    let role = userResponse.peran.find((e) => roleDataProduction.includes(e.peran.id))
+    if (!role) {
+      return response.error(res, {
+        code: 401,
+        message: 'Anda tidak memiliki akses ke aplikasi ini'
+      })
+    }
+    role.peran.id = convertRole(role?.peran?.id)
 
     let user = await userModel.findOne({ user_id: userResponse.id })
     if (!user) {
@@ -56,6 +56,7 @@ exports.login = [
         no_hp: userResponse.no_hp,
         alamat: userResponse.alamat,
         role: role.peran,
+        role_asal: role.peran,
         isPublic: false,
         isPrivate: false
       })
@@ -66,6 +67,11 @@ exports.login = [
           id: username.toLowerCase() === 'rizqevo@outlook.com' ? 2020 : username.toLowerCase() === 'sugiyanto@gmail.com' ? 2024 : role.peran.id,
           nama: username.toLowerCase() === 'rizqevo@outlook.com' ? 'PTB Dikti' : username.toLowerCase() === 'sugiyanto@gmail.com' ? 'ReadOnly' : role.peran.nama,
           menu: role.peran.menu
+        },
+        role_asal: {
+          id: role.peran.id,
+          nama: role.peran.nama,
+          menu: role.peran.menu
         }
       })
     }
@@ -91,6 +97,7 @@ exports.login = [
 
 exports.loginToPT = [
   auth,
+  role([PTB_DIKTI, PTB_ADMIN]),
   validation((req) => req.body, {
     lembaga_id: 'string',
     password: 'string'
@@ -98,34 +105,17 @@ exports.loginToPT = [
   async (req, res) => {
     let user = req.user
     const { lembaga_id, password } = req.body
+    let dataLembaga
 
     try {
-      const userResponse = await axios.post(
-        'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
-        qs.stringify({
-          username: user.email,
-          password
-        }),
-        {
-          'Content-Type': 'application/x-www-form-urlencoded'
-        }
-      )
-      if (userResponse.code === 400) {
+      const userResponse = await pddiktiService.login({username: user.email, password})
+      if (userResponse.code !== 200) {
         return response.error(res, {
           code: 401,
           message: userResponse.message
         })
       }
-    } catch (e) {
-      return response.error(res, {
-        code: 500,
-        message: e.message
-      })
-    }
-
-    let dataLembaga
-    try {
-      dataLembaga = await axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${lembaga_id}`)
+      dataLembaga = await pddiktiService.getPembina({search: lembaga_id})
     } catch (e) {
       return response.error(res, {
         code: e.response.status,
@@ -171,10 +161,40 @@ exports.loginToPT = [
   }
 ]
 
-exports.logout = (req, res) => {
-  res.clearCookie('sidali-cookie')
+exports.logout = [
+  auth,
+  (req, res) => {
+    res.clearCookie('sidali-cookie')
+
+    response.success(res, {
+      message: 'Berhasil Logout'
+    })
+  }
+]
 
-  response.success(res, {
-    message: 'Berhasil Logout'
-  })
-}
+exports.sendOTP = [
+  auth,
+  validation((req) => req.body, { no_hp: 'string' }),
+  async (req, res) => {
+    const user = req.user
+    let no_hp = req.body.no_hp
+    no_hp = req.body.no_hp.substring(0, 1) === '0' ? '62' + no_hp.substring(1) : no_hp
+    const generatedOtp = otp.generate()
+    res.cookie('sidali-otp', hashSync(generatedOtp, genSaltSync(10)), {
+      httpOnly: true,
+      secure: true
+    })
+    await notifWA2(
+      TEMPLATE_VERIFIKASI,
+      { nama: user.nama, no_hp: no_hp },
+      [
+        { key: '1', value: 'pt', value_text: user.lembaga.nama },
+        { key: '3', value: 'no_verifikasi', value_text: generatedOtp },
+        { key: '2', value: 'no_laporan', value_text: '' }
+      ]
+    )
+    return response.success(res, {
+      message: 'Berhasil mengirimkan OTP'
+    })
+  }
+]

+ 2 - 2
controller/v2/laporan.controller.js

@@ -5,7 +5,6 @@ const response = require('../../utils/responseHandler')
 const { addManyDokumen } = require('../../utils/dokumenFunction')
 const checkData = require('../../middleware/checkData')
 const pelanggaranModel = require('../../model/pelanggaran.model')
-const axios = require('../../utils/axios')
 const laporanModel = require('../../model/laporan.model')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { sendWaCreateLaporan } = require('../../services/v2/notifikasi.service')
@@ -16,6 +15,7 @@ const {
 } = require('../../utils/constanta')
 const forRole = require('../../middleware/role')
 const handleDokumen = require('../../utils/handleDokumen')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.create = [
   auth,
@@ -27,7 +27,7 @@ exports.create = [
     keterangan: 'string'
   }),
   isUnique((req) => req.body.no_laporan, (no_laporan) => laporanModel.findOne({ no_laporan })),
-  checkData((req) => req.body.pt_id, (pt_id) => axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`), 'pt'),
+  checkData((req) => req.body.pt_id, (pt_id) => pddiktiService.getPT(pt_id), 'pt'),
   checkData((req) => req.body.pelanggaran_id, (data) => {
       const pelanggaran_id = data.split(',')
       return pelanggaranModel.find({

+ 10 - 17
controller/v2/sanksi.controller.js

@@ -3,7 +3,6 @@ const forRole = require('../../middleware/role')
 const {
   PTB_DIKTI,
   PTB_LLDIKTI,
-  PENJADWALAN,
   SELESAI,
   CREATE_SANKSI,
   PTB_PT,
@@ -23,11 +22,8 @@ const autoSaveModel = require('../../model/autoSave.model')
 const { hariKerja } = require('../../utils/hariKerja')
 const pemantauanModel = require('../../model/pemantauan.model')
 const { SANKSI } = require('../../utils/constanta')
-const axios = require('../../utils/axios')
 const logModel = require('../../model/log.model')
-const handleError = require('../../utils/v1/handleError')
-const { validate } = require('../../utils/v1/validation')
-const { cekSatuDataSanksi } = require('../../utils/v1/cekData')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
 exports.create = [
   auth,
@@ -91,7 +87,7 @@ exports.create = [
       tanggal_akhir_keberatan,
       masa_berlaku: from_date && to_date ? { from_date, to_date } : null,
       batas_waktu: from_date ? { keberatan: hariKerja(10, from_date) } : null,
-      aktif: from_date ? true : false
+      aktif: !!from_date
     })
     const autoSave = await autoSaveModel.findOne({ laporan_id: laporan._id }).populate('laporan')
     await laporanModel.findByIdAndUpdate(laporan._id, {
@@ -126,17 +122,13 @@ exports.updatePDDIKTI = [
     const { sanksi } = req.data
     const user = req.user
     try {
-      await axios.post(
-        `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${sanksi.laporan.pt.kode}/sanksi`,
-        {
-          noSanksi: sanksi.no_sanksi,
-          tmtBerlaku: sanksi.masa_berlaku.from_date,
-          tstBerlaku: sanksi.tanggal_terima_sanksi,
-          idJenisSanksi: Math.max(...sanksi.pelanggaran.map(e => e.level_sanksi)),
-          alasan: 'Penetapan sanksi'
-        }, {
-          'Content-Type': 'application/json'
-        })
+      await pddiktiService.updatePDDIKTI({
+        ptKode: sanksi.laporan.pt.kode,
+        noSanksi: sanksi.no_sanksi,
+        terimaSanksi: sanksi.tanggal_terima_sanksi,
+        fromDate: sanksi.masa_berlaku.from_date,
+        pelanggaran: sanksi.pelanggaran
+      })
       await logModel.create({
         user: user._id,
         aktivitas: `Server berhasil mengirimkan data Ke API PDDIKTI untuk update Status PT ${sanksi.laporan.pt.nama}`
@@ -318,6 +310,7 @@ exports.updatePt = [
 
     if (is_dokumen_perbaikan === TRUE) {
       last_step = 'Dokumen Perbaikan'
+      keterangan = 'Mengupload Dokumen Perbaikan'
       flag = PERBAIKAN
     }
 

+ 3 - 12
dockerfile

@@ -1,19 +1,10 @@
-FROM node:14
+FROM node:16-alpine
 
 # Create app directory
 RUN mkdir -p /usr/src/app
 WORKDIR /usr/src/app
 
-# Update Source List
-RUN echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list
-
-# Install MongoDB tools
-RUN wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | apt-key add - && \
-    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-6.0.list && \
-    apt update && \
-    apt install -y mongodb-org-tools
-
-# Installing node dependencies
+# Installing dependencies
 COPY package.json ./
 RUN npm install
 
@@ -24,4 +15,4 @@ COPY . .
 EXPOSE 5000
 
 # Running the app
-CMD "npm" "start"
+CMD npm start

+ 18 - 0
middleware/verifyOTP.js

@@ -0,0 +1,18 @@
+const { validation } = require('./validation')
+const { compareSync } = require('bcrypt')
+const otp = require('../utils/otp')
+const response = require('../utils/responseHandler')
+
+module.exports = [
+  validation((req) => req.body, { otp: 'string' }),
+  (req, res, next) => {
+    if (!req.cookies['sidali-otp'] || req.cookies['sidali-otp'] && !compareSync(req.body.otp, req.cookies['sidali-otp']) || !otp.validate({ token: req.body.otp })) {
+      return response.error(res, {
+        message: 'OTP tidak valid',
+        code: 401
+      })
+    }
+    res.clearCookie('sidali-otp')
+    return next()
+  }
+]

+ 1 - 0
model/user.model.js

@@ -16,6 +16,7 @@ module.exports = mongoose.model(
       ref: dokumen,
     },
     role: Object,
+      role_asal: Object,
     isPublic: Boolean,
     isPrivate: Boolean,
     no_verifikasi: String,

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
     "mongoose": "^6.2.7",
     "morgan": "~1.9.1",
     "multer": "^1.4.4",
+    "otpauth": "^9.1.5",
     "xlsx": "^0.18.5"
   },
   "devDependencies": {

+ 5 - 6
routes/v1/auth.routes.js

@@ -1,11 +1,10 @@
 const router = require('express').Router()
-const auth = require('../../controller/v1/auth.controller')
-const verify = require('../../middleware/verifyToken')
+const authv2 = require('../../controller/v2/auth.controller')
 const blacklistUser = require('../../middleware/blacklistUser')
-const role = require('../../middleware/role')
 
-router.post('/login', blacklistUser, auth.login)
-router.post('/login-to-pt', verify, role([2020, 2023]), auth.loginToPT)
-router.delete('/logout', verify, auth.logout)
+router.post('/login', authv2.login)
+router.post('/otp', ...authv2.sendOTP)
+router.post('/login-to-pt', ...authv2.loginToPT)
+router.delete('/logout', ...authv2.logout)
 
 module.exports = router

+ 0 - 2
routes/v1/auto.routes.js

@@ -11,7 +11,5 @@ router.get('/status-sanksi', verify, auto.updateStatusSanksi)
 router.get('/berakhir-sanksi', verify, auto.berakhirSanksi)
 router.post('/save/:id', auth, auto.save)
 router.get('/save/:id', auto.getSave)
-router.post('/backup', verify, auto.backup)
-router.get('/backup/:id', auth, auto.getBackup)
 
 module.exports = router

+ 2 - 1
routes/v1/index.js

@@ -1,6 +1,7 @@
 const router = require('express').Router()
 const auth = require('../../middleware/verifyToken')
 const roleId = require('../../middleware/role')
+const { PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN, PTB_READ } = require('../../utils/constanta')
 
 router.get('/', (req, res) => {
   return res.json({
@@ -12,7 +13,7 @@ router.get('/csrf',  (req, res) => {
   return res.json({token: 'null'})
 })
 
-router.use('/laporan', auth, roleId([2020, 2021, 2023, 2024]), require('./laporan'))
+router.use('/laporan', auth, roleId([PTB_DIKTI, PTB_LLDIKTI, PTB_ADMIN, PTB_READ]), require('./laporan'))
 router.use('/sanksi', auth, require('./sanksi'))
 router.use('/public', require('./public.routes'))
 router.use('/auth', require('./auth.routes'))

+ 6 - 0
routes/v1/kontak.routes.js

@@ -0,0 +1,6 @@
+const router = require('express').Router()
+const kontak = require('../../controller/v1/kontak.controller')
+
+router.post('/', ...kontak.addKontak)
+
+module.exports = router

+ 1 - 2
routes/v1/laporan/index.js

@@ -1,11 +1,10 @@
 const router = require('express').Router()
 const laporan = require('../../../controller/v1/laporan.controller')
 const handleDokumen = require('../../../utils/handleDokumen')
-const roleId = require('../../../middleware/role')
 
 router.get('/', laporan.getAll)
 router.get('/jumlah', laporan.jumlahLaporan)
-router.get('/byPembina/:idPembina', roleId([2020,2023, 2024]),laporan.laporanByPembina)
+router.get('/byPembina/:idPembina', ...laporan.laporanByPembina)
 router.get('/:id', laporan.getOne)
 router.post('/create', handleDokumen.array('dokumen'), laporan.create)
 router.put('/update/:id', ((req, res, next) => {

+ 1 - 2
routes/v1/pt.routes.js

@@ -1,8 +1,7 @@
 const router = require('express').Router()
 const pt = require('../../controller/v1/pt.controller')
-const roleId = require('../../middleware/role')
 
 router.get('/', pt.getAll)
-router.get('/:id', roleId([2020, 2021, 2023, 2024]), pt.getOne)
+router.get('/:id', ...pt.getOne)
 
 module.exports = router

+ 134 - 0
services/v2/pddikti.service.js

@@ -0,0 +1,134 @@
+const axios = require('../../utils/axios')
+const coba = require('../../utils/coba')
+const qs = require('qs')
+const {PRODUCTION} = require('../../utils/constanta')
+
+/**
+ *
+ * @param id
+ * @param query
+ * @returns {Promise<*>}
+ */
+exports.getPT = (id, query = {}) => {
+  let token
+  let url = 'https://api.kemdikbud.go.id:8243/pddikti/1.2/pt'
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
+    url = 'https://api.kemdikbud.go.id:8443/pddikti/1.2/pt'
+    token = coba.decrypt(process.env.BEAT2)
+  }
+  const {search, pembina} = query
+  if (id) url += '/'+id
+  if (Object.keys(query).length) {
+    url += '?'
+    const parseUrl = []
+    if (search) parseUrl.push(`q=${search}`)
+    if (pembina) parseUrl.push(`pembina=${pembina}`)
+    url += parseUrl.join('&')
+  }
+  return axios.get(
+    url,
+    token
+  )
+}
+
+/**
+ *
+ * @param query
+ * @returns {Promise<*>}
+ */
+exports.getPembina = (query = {}) => {
+  let token
+  let url = 'https://api.kemdikbud.go.id:8243/pddikti/1.2/lembaga-non-sp'
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
+    url = 'https://api.kemdikbud.go.id:8443/pddikti/1.2/lembaga-non-sp'
+    token = coba.decrypt(process.env.BEAT2)
+  }
+  const {search} = query
+  if (Object.keys(query).length) {
+    url += '?'
+    const parseURL = []
+    if (search) parseURL.push(`q=${search}`)
+    url += parseURL.join('&')
+  }
+  return axios.get(url, token)
+}
+
+/**
+ *
+ * @param username
+ * @param password
+ * @returns {Promise<*>}
+ */
+exports.login = ({username, password}) => {
+  let token
+  let url = 'https://api.kemdikbud.go.id:8243/manakses/2.0/auth'
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
+    url = 'https://api.kemdikbud.go.id:8443/manakses/2.0/auth'
+    token = coba.decrypt(process.env.AFA1T)
+  }
+  return axios.post(
+    url,
+    qs.stringify({
+      username,
+      password,
+    }),
+    token,
+    {
+      'Content-Type': 'application/x-www-form-urlencoded'
+    }
+  )
+}
+
+/**
+ *
+ * @param ptKode
+ * @param noSanksi
+ * @param fromDate
+ * @param pelanggaran
+ * @param terimaSanksi
+ * @returns {Promise<*>}
+ */
+exports.updatePDDIKTI = ({ptKode, noSanksi, fromDate, pelanggaran, terimaSanksi}) => {
+  let token
+  let url = `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${ptKode}/sanksi`
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
+    url = `https://api.kemdikbud.go.id:8443/pddikti/1.2/pt/${ptKode}/sanksi`
+    token = coba.decrypt(process.env.BEAT2)
+  }
+  return axios.post(
+    url,
+    {
+      noSanksi: noSanksi,
+      tmtBerlaku: fromDate,
+      tstBerlaku: terimaSanksi,
+      idJenisSanksi: Math.max(...pelanggaran.map(e => e.level_sanksi)),
+      alasan: 'Penetapan sanksi'
+    },
+    token
+  )
+}
+
+/**
+ *
+ * @param templateId
+ * @param data
+ * @param contacts
+ * @returns {Promise<*>}
+ */
+exports.whatsapp = (templateId, data, contacts) => {
+  let token
+  let url = 'https://api.kemdikbud.go.id:8243/qontak/1.0/send'
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION) {
+    url = 'https://api.kemdikbud.go.id:8443/qontak/1.0/send'
+    token = coba.decrypt(process.env.R3AOP)
+  }
+  return axios.post(
+    url,
+    {
+      templateId,
+      contacts,
+      body: data
+    },
+    token
+  )
+}

+ 40 - 18
utils/axios.js

@@ -1,18 +1,23 @@
 const axios = require('axios')
 const https = require('https')
 const coba = require('./coba')
-const FormData = require('form-data')
+const { PRODUCTION } = require('./constanta')
 
-exports.get = async (url) => {
+/**
+ *
+ * @param url {string}
+ * @param token {string | null?}
+ * @returns {Promise<any>}
+ */
+exports.get = async (url, token = null) => {
   let response
-  if (coba.decrypt(process.env.CXQSB) === 'production') {
-    const fd = new FormData()
-    fd.append('grant_type', coba.decrypt(process.env.AJFAL))
-    fd.append('client_id', coba.decrypt(process.env.IOQUR))
-    fd.append('client_secret', coba.decrypt(process.env.ZXCND))
-    let token = await axios.post('https://api.kemdikbud.go.id:8443/pddikti/1.2/oauth2/token', fd, { headers: { ...fd.getHeaders() } })
-    console.log(token)
-    response = await axios.get(url, { headers: { Authorization: `Bearer ${token?.data['access_token']}` } })
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION && token) {
+    response = await axios.get(url, {
+      headers: {
+        Authorization: `Bearer ${token}`,
+        Accept: 'application/json'
+      }
+    })
   } else {
     let token = process.env.XNX1Q
     response = await axios.get(url, {
@@ -28,19 +33,36 @@ exports.get = async (url) => {
   return response.data
 }
 
-exports.post = async (url, data, config) => {
-  const baseUrl = coba.decrypt(process.env.W8A1C)
-  let token = process.env.TEKQU
-  if (baseUrl.includes('dev')) token = process.env.XNX1Q
-  const response = await axios.post(url, data, {
+/**
+ *
+ * @param url
+ * @param data
+ * @param token {string | null?}
+ * @param config {any?}
+ * @returns {Promise<any>}
+ */
+exports.post = async (url, data, token= null, config = {}) => {
+  let response
+  if (coba.decrypt(process.env.CXQSB) === PRODUCTION && token) {
+    response = await axios.post(url, data,{
+      headers: {
+        Authorization: `Bearer ${token}`,
+        Accept: 'application/json',
+        ...config
+      }
+    })
+  } else {
+    let token = process.env.XNX1Q
+    response = await axios.post(url, data, {
     headers: {
       Authorization: `Bearer ${coba.decrypt(token)}`,
       Accept: 'application/json',
-      ...config,
+      ...config
     },
     httpsAgent: new https.Agent({
-      rejectUnauthorized: false,
-    }),
+      rejectUnauthorized: false
+    })
   })
+  }
   return response.data
 }

+ 6 - 0
utils/constanta.js

@@ -25,6 +25,7 @@ exports.SANKSI = 'sanksi'
 exports.SELESAI = 'selesai'
 exports.DELEGASI = 'delegasi'
 exports.DITUTUP = 'ditutup'
+exports.DITERIMA = 'diterima'
 
 exports.CREATE_LAPORAN = 'CREATE LAPORAN'
 exports.ADD_EVALUASI = 'ADD EVALUASI'
@@ -42,3 +43,8 @@ exports.PTB_LLDIKTI = 2021
 exports.PTB_PT = 2022
 exports.PTB_ADMIN = 2023
 exports.PTB_READ = 2024
+
+exports.SUCCESS = 'success'
+
+exports.PRODUCTION = 'production'
+exports.DEVELOPMENT = 'development'

+ 1 - 0
utils/function.js

@@ -0,0 +1 @@
+exports.capitalize = (string) => string.replace(/^./, str => str.toUpperCase())

+ 10 - 0
utils/otp.js

@@ -0,0 +1,10 @@
+require('dotenv').config()
+const {HOTP} = require('otpauth')
+// const coba = require('../utils/coba')
+
+ module.exports = new HOTP({
+  algorithm: 'SHA256',
+  digits: 6,
+  period: 30,
+  secret: 'tes'
+})

+ 43 - 52
utils/v1/cekData.js

@@ -2,6 +2,7 @@ const laporanModel = require('../../model/laporan.model')
 const pelanggaranModel = require('../../model/pelanggaran.model')
 const sanksiModel = require('../../model/sanksi.model')
 const response = require('../responseHandler')
+const { DIKTI, LLDIKTI, PTB_DIKTI, PTB_LLDIKTI, PTB_PT } = require('../constanta')
 
 exports.cekSatuDataLaporan = async (
   res,
@@ -10,37 +11,31 @@ exports.cekSatuDataLaporan = async (
   where = { delegasi: false, aktif: true }
 ) => {
   let w = { _id: laporan_id, ...where }
-  // if (where.aktif !== 'empty') w.aktif = where.aktif || true
   switch (user.role.id) {
-    case 2020:
+    case PTB_DIKTI:
       if (where.all) {
-        // w.role_asal = 'dikti'
-        // w['$or'] = [
-        //   { role_asal : 'dikti' },
-        //   { role_asal: 'lldikti', role_data: 'dikti' },
-        // ]
         break
       } else if (!where.delegasi) {
-        w.role_data = 'dikti'
+        w.role_data = DIKTI
       } else {
-        w.role_data = 'lldikti'
-        w.role_asal = 'dikti'
+        w.role_data = LLDIKTI
+        w.role_asal = DIKTI
       }
       break
-    case 2021:
+    case PTB_LLDIKTI:
       if (where.all) {
-        w.role_asal = 'lldikti'
+        w.role_asal = LLDIKTI
         w['pt.pembina.id'] = user.lembaga.id
       } else if (!where.delegasi) {
-        w.role_data = 'lldikti'
+        w.role_data = LLDIKTI
         w['pt.pembina.id'] = user.lembaga.id
       } else {
-        w.role_asal = 'lldikti'
-        w.role_data = 'dikti'
+        w.role_asal = LLDIKTI
+        w.role_data = DIKTI
         w['pt.pembina.id'] = user.lembaga.id
       }
       break
-    case 2022:
+    case PTB_PT:
       w['pt.id'] = user.lembaga.id
       break
   }
@@ -54,7 +49,6 @@ exports.cekSatuDataLaporan = async (
     .populate('peserta_penetapan_sanksi.ttd')
     .populate({ path: 'evaluasi', populate: ['user', 'dokumen'] })
     .populate('tuntas.dokumen')
-  // .populate('evaluasi.user')
   if (!laporan) {
     response.error(res, {
       message: 'laporan_id tidak ada',
@@ -70,28 +64,28 @@ exports.cekBanyakDataLaporan = async (user, where = { delegasi: false }, options
   if (where.aktif !== 'empty') w.aktif = where.aktif || true
   else delete w.aktif
   switch (user.role.id) {
-    case 2020:
+    case PTB_DIKTI:
       if (where.all) break
       else if (where.delegasi) {
-        w.role_data = 'lldikti'
-        w.role_asal = 'dikti'
+        w.role_data = LLDIKTI
+        w.role_asal = DIKTI
       }
-      else w.role_data = 'dikti'
+      else w.role_data = DIKTI
       break
-    case 2021:
+    case PTB_LLDIKTI:
       if (where.all) {
-        w.role_asal = 'lldikti'
+        w.role_asal = LLDIKTI
         w['pt.pembina.id'] = user.lembaga.id
       } else if (!where.delegasi) {
-        w.role_data = 'lldikti'
+        w.role_data = LLDIKTI
         w['pt.pembina.id'] = user.lembaga.id
       } else {
-        w.role_asal = 'lldikti'
-        w.role_data = 'dikti'
+        w.role_asal = LLDIKTI
+        w.role_data = DIKTI
         w['pt.pembina.id'] = user.lembaga.id
       }
       break
-    case 2022:
+    case PTB_PT:
       w['pt.id'] = user.lembaga.id
       break
   }
@@ -114,23 +108,20 @@ exports.cekSatuDataSanksi = async (
   sanksi_id,
   where = { banding: false }
 ) => {
-  // let w = { aktif: where.aktif || true }
   let w = {}
   switch (user.role.id) {
-    case 2020:
-      // if (where.all) w.role_asal = 'dikti'
+    case PTB_DIKTI:
       if (where.all) break
       else if (where.delegasi) {
-        w.role_data = 'lldikti'
-        w.role_asal = 'dikti'
-      } else if (!where.banding) w.role_data = 'dikti'
+        w.role_data = LLDIKTI
+        w.role_asal = DIKTI
+      } else if (!where.banding) w.role_data = DIKTI
       break
-    case 2021:
+    case PTB_LLDIKTI:
       w['pt.pembina.id'] = user.lembaga.id
-      // w.role_data = 'lldikti'
-      if (!where.banding) w.role_data = 'lldikti'
+      if (!where.banding) w.role_data = LLDIKTI
       break
-    case 2022:
+    case PTB_PT:
       w['pt.id'] = user.lembaga.id
       break
   }
@@ -176,18 +167,18 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
     case 2020:
       if (where.all) break
       else if (where.delegasi) {
-        w.role_data = 'lldikti'
-        w.role_asal = 'dikti'
+        w.role_data = LLDIKTI
+        w.role_asal = DIKTI
       } else if (where.banding)
         w.level_sanksi = {
           $in: [2, 3],
         }
-      else w.role_data = 'dikti'
+      else w.role_data = DIKTI
       break
     case 2021:
       w['pt.pembina.id'] = user.lembaga.id
       if (where.banding) w.level_sanksi = 1
-      else w['role_data'] = 'lldikti'
+      else w.role_data = LLDIKTI
       break
     case 2022:
       w['pt.id'] = user.lembaga.id
@@ -216,10 +207,12 @@ exports.cekBanyakDataSanksi = async (user, where = {}, q = {}) => {
   data = data.filter((e) => {
     if (where.banding) {
       switch (user.role.id) {
-        case 2020:
+        case PTB_DIKTI:
           return e.pelanggaran.some(e2 => e2.level_sanksi !== 1) && e.laporan !== null
-        case 2021:
+        case PTB_LLDIKTI:
           return e.pelanggaran.filter(e2 => e2.level_sanksi === 1).length === e.pelanggaran.length && e.laporan !== null
+        default:
+          return true
       }
     }
     return e.laporan !== null
@@ -252,27 +245,25 @@ exports.cekBanyakDataPelanggaran = async (res, pelanggaran_id) => {
   return pelanggaran.map((e) => e._id)
 }
 
-exports.dataLaporanAggregate = async (user, where, aggregate) => {
+exports.dataLaporanAggregate = (user, where, aggregate) => {
   const w = { ...where }
   switch (user.role.id) {
-    case 2020:
-      w['$or'] = [{ role_asal: 'dikti' }, { role_data: 'dikti' }]
+    case PTB_DIKTI:
+      w.$or = [{ role_asal: DIKTI }, { role_data: DIKTI }]
       break
-    case 2021:
-      w['$or'] = [{ role_asal: 'lldikti' }, { role_data: 'lldikti' }]
+    case PTB_LLDIKTI:
+      w.$or = [{ role_asal: LLDIKTI }, { role_data: LLDIKTI }]
       w['pt.pembina.id'] = user.lembaga.id
       break
   }
 
-  const laporan = await laporanModel.aggregate([
+  return laporanModel.aggregate([
     { $match: w },
     { $group: aggregate },
     {
       $sort: {
-        ['_id.bulan']: 1,
+        '_id.bulan': 1,
       },
     },
   ])
-
-  return laporan
 }

+ 19 - 27
utils/v1/notifFunction.js

@@ -1,33 +1,25 @@
-const axios = require('../axios')
 const kontakModel = require('../../model/kontak.model')
+const pddiktiService = require('../../services/v2/pddikti.service')
 
+/**
+ *
+ * @param templateId
+ * @param data
+ * @param where {object?}
+ * @returns {Promise<*>}
+ */
 exports.notifWA = async (templateId, data, where = {}) => {
-  const kontak = await kontakModel.find(where)
+  const kontak = await kontakModel.find({ ...where, 'role.id': { $ne: 2022 } })
   const contacts = kontak.map((e) => ({ name: e.nama, number: e.no_hp }))
-  const send = await axios.post(
-    'https://api.kemdikbud.go.id:8243/qontak/1.0/send',
-    {
-      templateId,
-      contacts,
-      body: data,
-    }
-  )
-  return send
+  return pddiktiService.whatsapp(templateId, contacts, data)
 }
 
-exports.notifWA2 = async (templateId, { nama, no_hp }, data) => {
-  const send = await axios.post(
-    'https://api.kemdikbud.go.id:8243/qontak/1.0/send',
-    {
-      templateId,
-      contacts: [
-        {
-          name: nama,
-          number: no_hp,
-        },
-      ],
-      body: data,
-    }
-  )
-  return send
-}
+/**
+ *
+ * @param templateId
+ * @param nama
+ * @param no_hp
+ * @param data
+ * @returns {Promise<*>}
+ */
+exports.notifWA2 = async (templateId, { nama, no_hp }, data) => pddiktiService.whatsapp(templateId, {name: nama, number: no_hp}, data)