Browse Source

fitur OTP

yazid138 3 years ago
parent
commit
adf52fb0af

+ 122 - 43
controller/laporan.controller.js

@@ -11,6 +11,9 @@ const userModel = require('../model/user.model')
 const { cekSatuDataLaporan, cekBanyakDataLaporan } = require('../utils/cekData')
 
 exports.create = handleError(async (req, res) => {
+  const user = req.user
+  const files = req.files
+
   const isValid = validate(res, req.body, {
     no_laporan: 'string',
     pt_id: 'string',
@@ -24,12 +27,11 @@ exports.create = handleError(async (req, res) => {
   const pt = await axios.get(
     `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
   )
-  if (!pt)
+  if (pt.length === 0)
     return response.error(res, {
       message: 'pt_id tidak ditemukan',
     })
 
-  const files = req.files
   let dokumen_id = []
   if (files.length) {
     const dokumen = await addManyDokumen(files)
@@ -45,7 +47,6 @@ exports.create = handleError(async (req, res) => {
   if (!pelanggaran.length)
     return response.error(res, { message: 'pelanggaran_id tidak ada' })
 
-  const user = req.user
   let data = {
     no_laporan,
     user: user._id,
@@ -72,61 +73,136 @@ exports.create = handleError(async (req, res) => {
   })
 })
 
+// exports.public = handleError(async (req, res) => {
+//   const isValid = validate(res, req.body, {
+//     nama: 'string',
+//     email: 'email',
+//     alamat: 'string',
+//     no_hp: 'string',
+//     no_laporan: 'string',
+//     pt_id: 'string',
+//     pelanggaran_id: 'string',
+//     keterangan: 'string',
+//     is_private: { type: 'string', enum: ['true', 'false'] },
+//   })
+//   if (!isValid) return
+
+//   const {
+//     no_laporan,
+//     pt_id,
+//     keterangan,
+//     nama,
+//     email,
+//     alamat,
+//     no_hp,
+//     is_private,
+//   } = req.body
+//   let { pelanggaran_id } = req.body
+
+//   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',
+//     })
+//   }
+
+//   const { dokumen, foto } = req.files
+//   if (!foto.length) {
+//     return response.error(res, {
+//       message: 'foto harus ada',
+//     })
+//   }
+//   const foto_id = await addDokumen(foto[0])
+//   const user = await userModel.create({
+//     nama,
+//     email,
+//     no_hp,
+//     alamat,
+//     isPublic: true,
+//     isPrivate: is_private === 'true',
+//     foto: foto_id,
+//   })
+//   let dokumen_id = []
+//   if (dokumen?.length) {
+//     const dataDokumen = await addManyDokumen(dokumen)
+//     dokumen_id = dataDokumen.map((e) => e._id)
+//   }
+
+//   pelanggaran_id = pelanggaran_id.split(',')
+//   const pelanggaran = await pelanggaranModel.find({
+//     _id: {
+//       $in: pelanggaran_id,
+//     },
+//   })
+//   if (!pelanggaran.length)
+//     return response.error(res, { message: 'pelanggaran_id tidak ada' })
+
+//   let data = {
+//     no_laporan,
+//     user: user._id,
+//     dokumen: dokumen_id,
+//     pt: pt[0],
+//     pelanggaran: pelanggaran_id,
+//     keterangan,
+//     role_data: 'dikti',
+//   }
+
+//   data = await laporanModel.create(data)
+//   await pemantauanModel.create({
+//     laporan: data._id,
+//     pt_id: pt[0].id,
+//     user: user._id,
+//     keterangan: 'Mengajukan Laporan',
+//     dokumen: dokumen_id,
+//     for_pt: false,
+//   })
+//   await notifWA('d5609c3c-e9e9-4dbe-9a4e-e8fa772d6770', [
+//     { key: '1', value: 'nama', value_text: nama },
+//     { key: '2', value: 'pt', value_text: pt[0].nama },
+//     { key: '3', value: 'keterangan', value_text: keterangan },
+//     { key: '4', value: 'no_laporan', value_text: no_laporan },
+//   ])
+//   return response.success(res, {
+//     message: 'Berhasil menambah laporan',
+//     data,
+//   })
+// })
+
 exports.public = handleError(async (req, res) => {
+  const user = req.user
+  const no_laporan = req.no_laporan
+  const files = req.files
+
   const isValid = validate(res, req.body, {
-    nama: 'string',
-    email: 'email',
-    alamat: 'string',
-    no_hp: 'string',
-    no_laporan: 'string',
     pt_id: 'string',
     pelanggaran_id: 'string',
     keterangan: 'string',
-    is_private: { type: 'string', enum: ['true', 'false'] },
+    no_verifikasi: 'string',
   })
   if (!isValid) return
 
-  const {
-    no_laporan,
-    pt_id,
-    keterangan,
-    nama,
-    email,
-    alamat,
-    no_hp,
-    is_private,
-  } = req.body
+  const { pt_id, keterangan, no_verifikasi } = req.body
   let { pelanggaran_id } = req.body
-
+  if (user.no_verifikasi !== no_verifikasi) {
+    return response.error(res, {
+      message: 'no_verifikasi tidak sesuai',
+      error: { no_verifikasi: 'No. Verifikasi tidak sesuai' },
+    })
+  }
   const pt = await axios.get(
     `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
   )
-  if (!pt) {
+  if (pt.length === 0)
     return response.error(res, {
       message: 'pt_id tidak ditemukan',
     })
-  }
 
-  const { dokumen, foto } = req.files
-  if (!foto.length) {
-    return response.error(res, {
-      message: 'foto harus ada',
-    })
-  }
-  const foto_id = await addDokumen(foto[0])
-  const user = await userModel.create({
-    nama,
-    email,
-    no_hp,
-    alamat,
-    isPublic: true,
-    isPrivate: is_private === 'true',
-    foto: foto_id,
-  })
   let dokumen_id = []
-  if (dokumen?.length) {
-    const dataDokumen = await addManyDokumen(dokumen)
-    dokumen_id = dataDokumen.map((e) => e._id)
+  if (files.length) {
+    const dokumen = await addManyDokumen(files)
+    dokumen_id = dokumen.map((e) => e._id)
   }
 
   pelanggaran_id = pelanggaran_id.split(',')
@@ -153,16 +229,19 @@ exports.public = handleError(async (req, res) => {
     laporan: data._id,
     pt_id: pt[0].id,
     user: user._id,
-    keterangan: 'Mengajukan Laporan',
+    keterangan: 'Membuat Laporan',
     dokumen: dokumen_id,
     for_pt: false,
   })
+
+  await userModel.findByIdAndUpdate(user._id, { verified: true })
   await notifWA('d5609c3c-e9e9-4dbe-9a4e-e8fa772d6770', [
-    { key: '1', value: 'nama', value_text: nama },
+    { key: '1', value: 'nama', value_text: user.nama },
     { key: '2', value: 'pt', value_text: pt[0].nama },
     { key: '3', value: 'keterangan', value_text: keterangan },
     { key: '4', value: 'no_laporan', value_text: no_laporan },
   ])
+
   return response.success(res, {
     message: 'Berhasil menambah laporan',
     data,

+ 67 - 3
controller/user.controller.js

@@ -2,17 +2,81 @@ const handleError = require('../utils/handleError')
 const response = require('../utils/responseHandler')
 const userModel = require('../model/user.model')
 const { validate } = require('../utils/validation')
+const { notifWA2 } = require('../utils/notifFunction')
+const axios = require('../utils/axios')
+const { addDokumen } = require('../utils/dokumenFunction')
+const jwt = require('jsonwebtoken')
 
 exports.addUserPublic = handleError(async (req, res) => {
-  req.body.dokumen = req.files
+  const { no_laporan, pt_id, nama, email, no_hp, alamat, is_private } = req.body
+  const no_hp2 =
+    no_hp.substring(0, 1) === '0' ? '62' + no_hp.substring(1) : no_hp
   const isValid = validate(res, req.body, {
+    no_laporan: 'string',
+    pt_id: 'string',
     nama: 'string',
-    email: 'string',
+    email: 'email',
     no_hp: 'string',
     alamat: 'string',
-    dokumen: { type: 'array', items: 'object' },
+    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}`
+  )
+  if (pt.length === 0)
+    return response.error(res, {
+      message: 'pt_id tidak ditemukan',
+    })
+
+  const foto = req.file
+  if (!foto) {
+    return response.error(res, {
+      message: 'foto harus ada',
+    })
+  }
+  const foto_id = await addDokumen(foto)
+
+  const no_verifikasi = Math.floor(Math.random() * 1000000)
+  const user = await userModel.create({
+    nama,
+    email,
+    no_hp,
+    alamat,
+    isPublic: true,
+    isPrivate: is_private === 'true',
+    foto: foto_id,
+    no_verifikasi,
+    verified: false,
+  })
+
+  await notifWA2(
+    '37a9ccba-e1bc-4d02-86e0-3be4c718af2a',
+    { nama, no_hp: no_hp2 },
+    [
+      { key: '1', value: 'pt', value_text: pt[0].nama },
+      { key: '3', value: 'no_verifikasi', value_text: no_verifikasi },
+      { key: '2', value: 'no_laporan', value_text: no_laporan },
+    ]
+  )
+
+  const accessToken = jwt.sign(
+    { _id: user._id, no_laporan },
+    process.env.SECRET,
+    {
+      expiresIn: '30m',
+    }
+  )
+
+  const data = {
+    token: `Bearer ${accessToken}`,
+  }
+
+  return response.success(res, {
+    data: data,
+    message: 'Berhasil menambah user',
+  })
 })
 
 exports.get = handleError((req, res) => {

+ 33 - 0
middleware/verifyTokenPublic.js

@@ -0,0 +1,33 @@
+const jwt = require('jsonwebtoken')
+const userModel = require('../model/user.model')
+const response = require('../utils/responseHandler')
+
+module.exports = (req, res, next) => {
+  const authHeader = req.headers.authorization
+  const token = authHeader && authHeader.split(' ')[1]
+
+  if (!token)
+    return response.error(res, {
+      code: 401,
+      message: 'Token tidak ada',
+    })
+
+  jwt.verify(token, process.env.SECRET, async (err, data) => {
+    if (err)
+      return response.error(res, {
+        code: 401,
+        message: 'Unauthorized',
+      })
+    try {
+      const user = await userModel.findById(data._id)
+      req.user = user
+      req.no_laporan = data.no_laporan
+      next()
+    } catch (error) {
+      return response.error(res, {
+        code: 401,
+        message: 'Unauthorized',
+      })
+    }
+  })
+}

+ 0 - 1
model/laporan.model.js

@@ -19,7 +19,6 @@ module.exports = mongoose.model(
         enum: ['dikti', 'lldikti'],
         default: 'dikti',
       },
-      // status: String,
       aktif: { type: Boolean, default: true },
       dokumen: [
         {

+ 2 - 0
model/user.model.js

@@ -18,6 +18,8 @@ module.exports = mongoose.model(
     role: Object,
     isPublic: Boolean,
     isPrivate: Boolean,
+    no_verifikasi: String,
+    verified: Boolean,
   }),
   'user'
 )

+ 9 - 1
routes/v1/public.routes.js

@@ -5,15 +5,23 @@ const pelanggaran = require('../../controller/pelanggaran.controller')
 const laporan = require('../../controller/laporan.controller')
 const pemantauan = require('../../controller/pemantauan.controller')
 const handleDokumen = require('../../utils/handleDokumen')
+const auth = require('../../middleware/verifyTokenPublic')
 
 // router.post('/user/add', handleDokumen.array('dokumen'), user.addUserPublic)
 router.get('/pt', pt.public)
 router.get('/pelanggaran', pelanggaran.public)
 router.get('/pemantauan', pemantauan.public)
+// router.post(
+//   '/laporan/create',
+//   handleDokumen.fields([{ name: 'dokumen' }, { name: 'foto', maxCount: 1 }]),
+//   laporan.public
+// )
 router.post(
   '/laporan/create',
-  handleDokumen.fields([{ name: 'dokumen' }, { name: 'foto', maxCount: 1 }]),
+  auth,
+  handleDokumen.array('dokumen'),
   laporan.public
 )
+router.post('/user/create', handleDokumen.single('foto'), user.addUserPublic)
 
 module.exports = router

+ 17 - 0
utils/notifFunction.js

@@ -16,3 +16,20 @@ exports.notifWA = async (templateId, data, where = {}) => {
   )
   return send
 }
+
+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
+}