yazid138 3 rokov pred
rodič
commit
98fa8681e3

+ 72 - 0
controller/auth.controller.js

@@ -0,0 +1,72 @@
+const handleError = require('../utils/handleError')
+const response = require('../utils/responseHandler')
+const userModel = require('../model/user.model')
+const jwt = require('jsonwebtoken')
+const { validate } = require('../utils/validation')
+const axios = require('axios')
+const qs = require('qs')
+const https = require('https')
+
+exports.login = handleError(async (req, res) => {
+  const httpsAgent = new https.Agent({
+    rejectUnauthorized: false,
+  })
+  const isValid = validate(res, req.body, {
+    username: 'string',
+    password: 'string',
+  })
+  if (!isValid) return
+
+  const { username, password } = req.body
+  const data = qs.stringify({
+    username,
+    password,
+  })
+  const user = await axios.post(
+    'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
+    data,
+    {
+      headers: {
+        Authorization: `Bearer ${process.env.TOKEN}`,
+        'Content-Type': 'application/x-www-form-urlencoded',
+        Accept: 'application/json',
+      },
+      httpsAgent,
+    }
+  )
+
+  if (user.data.code === 400) {
+    return response.error(res, {
+      code: 400,
+      message: user.data.message,
+    })
+  }
+
+  const cekUser = await userModel.findOne({
+    user_id: user.data.id,
+  })
+  if (!cekUser) {
+    await userModel.create({
+      user_id: user.data.id,
+      nama: user.data.nama,
+      lembaga: user.data.peran[0].organisasi.nama,
+      email: user.data.username,
+      no_hp: user.data.no_hp,
+      alamat: user.data.alamat,
+      isPublic: false,
+      isPrivate: false,
+    })
+  }
+
+  const accessToken = jwt.sign({ user_id: user.data.id }, process.env.SECRET, {
+    expiresIn: '1d',
+  })
+
+  response.success(res, {
+    message: 'Berhasil Login',
+    data: {
+      token: `Bearer ${accessToken}`,
+      user: user.data,
+    },
+  })
+})

+ 101 - 0
controller/laporan.controller.js

@@ -0,0 +1,101 @@
+const handleError = require('../utils/handleError')
+const response = require('../utils/responseHandler')
+const laporanModel = require('../model/laporan.model')
+const userModel = require('../model/user.model')
+const { validate } = require('../utils/validation')
+const axios = require('axios')
+const https = require('https')
+const { addManyDokumen } = require('../utils/dokumenFunction')
+
+exports.create = handleError(async (req, res) => {
+  const httpsAgent = new https.Agent({
+    rejectUnauthorized: false,
+  })
+  req.body.dokumen = req.files
+  const isValid = validate(res, req.body, {
+    no_laporan: 'string',
+    user_id: 'string',
+    pt_id: 'string',
+    pelanggaran_id: 'string',
+    keterangan: 'string',
+    is_public: { type: 'boolean', convert: true },
+    dokumen: { type: 'array', items: 'object' },
+  })
+  if (!isValid) return
+
+  const {
+    no_laporan,
+    pt_id,
+    user_id,
+    keterangan,
+    pelanggaran_id,
+    role_data,
+    is_public,
+  } = req.body
+
+  const url = `https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${pt_id}`
+
+  const responseAxios = await axios.get(url, {
+    headers: {
+      Authorization: `Bearer ${process.env.TOKEN}`,
+    },
+    httpsAgent,
+  })
+  const pt = responseAxios.data[0]
+
+  let user = {}
+  if (!is_public) {
+    user = await userModel.findOne({
+      user_id: user_id,
+    })
+  }
+
+  const dokumen = await addManyDokumen(req.files)
+  const dokumen_id = dokumen.map((e) => e._id)
+
+  let data = {
+    no_laporan,
+    user: user._id || user_id,
+    dokumen: dokumen_id,
+    pt,
+    pelanggaran: pelanggaran_id.split(',').map((e) => e),
+    keterangan,
+  }
+  if (role_data) data.role_data = role_data
+
+  data = await laporanModel.create(data)
+
+  return response.success(res, {
+    message: 'Berhasil menambah laporan',
+    data,
+  })
+})
+
+exports.getAll = handleError(async (req, res) => {
+  const data = await laporanModel
+    .find()
+    .populate('user')
+    .populate('pelanggaran')
+    .populate('dokumen')
+  return response.success(res, {
+    message: '',
+    data,
+  })
+})
+
+exports.getOne = handleError(async (req, res) => {
+  const { id } = req.params
+  const user_id = req.data
+  const user = await userModel.findOne({
+    user_id: user_id,
+  })
+  const data = await laporanModel
+    .findOne({ _id: id, user: user._id })
+    .populate('user')
+    .populate('pelanggaran')
+    .populate('dokumen')
+  return response.success(res, {
+    message: '',
+    data,
+  })
+})

+ 0 - 0
controller/pt.controller.js


+ 16 - 0
controller/user.controller.js

@@ -0,0 +1,16 @@
+const handleError = require('../utils/handleError')
+const response = require('../utils/responseHandler')
+const userModel = require('../model/user.model')
+const { validate } = require('../utils/validation')
+
+exports.addUserPublic = handleError(async (req, res) => {
+  req.body.dokumen = req.files
+  const isValid = validate(res, req.body, {
+    nama: 'string',
+    email: 'string',
+    no_hp: 'string',
+    alamat: 'string',
+    dokumen: { type: 'array', items: 'object' },
+  })
+  if (!isValid) return
+})

+ 5 - 4
model/laporan.model.js

@@ -2,16 +2,17 @@ const mongoose = require('mongoose')
 const { Schema, Types } = mongoose
 const user = require('./user.model')
 const dokumen = require('./dokumen.model')
+const pelanggaran = require('./pelanggaran.model')
 
 module.exports = mongoose.model(
   'Laporan',
   new Schema(
     {
-      no_laporan: { type: String, unique },
+      no_laporan: { type: String, unique: true },
       user: { type: Types.ObjectId, ref: user },
       pt: Object,
       keterangan: String,
-      pelanggaran: [Object],
+      pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       role_data: {
         type: String,
         enum: ['dikti', 'lldikti'],
@@ -44,13 +45,13 @@ module.exports = mongoose.model(
             ],
           },
           {
-            timestamps,
+            timestamps: true,
           }
         ),
       ],
     },
     {
-      timestamps,
+      timestamps: true,
     }
   ),
   'laporan'

+ 15 - 0
model/pelanggaran.model.js

@@ -0,0 +1,15 @@
+const mongoose = require('mongoose')
+const { Schema } = mongoose
+
+module.exports = mongoose.model(
+  'Pelanggaran',
+  new Schema({
+    sanksi: String,
+    pelanggaran: String,
+    level_sanksi: Number,
+    keterangan_sanksi: String,
+    label_sanksi: String,
+    tmt_bulan: Number,
+  }),
+  'pelanggaran'
+)

+ 58 - 0
model/pt.model.js

@@ -0,0 +1,58 @@
+const mongoose = require('mongoose')
+const { Schema, Types } = mongoose
+const user = require('./user.model')
+const dokumen = require('./dokumen.model')
+const pelanggaran = require('./pelanggaran.model')
+
+module.exports = mongoose.model(
+  'PT',
+  new Schema(
+    {
+      no_laporan: { type: String, unique: true },
+      user: { type: Types.ObjectId, ref: user },
+      pt: Object,
+      keterangan: String,
+      pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
+      role_data: {
+        type: String,
+        enum: ['dikti', 'lldikti'],
+        default: 'dikti',
+      },
+      status: String,
+      aktif: { type: Boolean, default: true },
+      dokumen: [
+        {
+          type: Types.ObjectId,
+          ref: dokumen,
+        },
+      ],
+      jadwal: {
+        judul: String,
+        dari_tanggal: Date,
+        sampai_tanggal: Date,
+        warna: String,
+      },
+      evaluasi: [
+        new Schema(
+          {
+            tanggal: Date,
+            judul: String,
+            dokumen: [
+              {
+                type: Types.ObjectId,
+                ref: dokumen,
+              },
+            ],
+          },
+          {
+            timestamps: true,
+          }
+        ),
+      ],
+    },
+    {
+      timestamps: true,
+    }
+  ),
+  'pt'
+)

+ 2 - 1
model/sanksi.model.js

@@ -3,6 +3,7 @@ const { Schema, Types } = mongoose
 const dokumen = require('./dokumen.model')
 const laporan = require('./laporan.model')
 const user = require('./user.model')
+const pelanggaran = require('./pelanggaran.model')
 
 module.exports = mongoose.model(
   'Sanksi',
@@ -13,7 +14,7 @@ module.exports = mongoose.model(
       pt: Object,
       keterangan: String,
       aktif: { type: Boolean, default: true },
-      pelanggaran: [Object],
+      pelanggaran: [{ type: Types.ObjectId, ref: pelanggaran }],
       dokumen: [
         {
           type: Types.ObjectId,

+ 13 - 0
package-lock.json

@@ -526,6 +526,14 @@
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
       "dev": true
     },
+    "axios": {
+      "version": "0.26.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
+      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "requires": {
+        "follow-redirects": "^1.14.8"
+      }
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1347,6 +1355,11 @@
       "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
       "dev": true
     },
+    "follow-redirects": {
+      "version": "1.14.9",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
+      "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
+    },
     "forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",

+ 1 - 0
package.json

@@ -8,6 +8,7 @@
     "dev": "nodemon ./bin/www"
   },
   "dependencies": {
+    "axios": "^0.26.1",
     "bcrypt": "^5.0.1",
     "cookie-parser": "~1.4.4",
     "crypto": "^1.0.1",

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

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

+ 4 - 0
routes/v1/index.js

@@ -7,4 +7,8 @@ router.get('/', (req, res) => {
   })
 })
 
+router.use('/laporan', require('./laporan.routes'))
+router.use('/public', require('./public.routes'))
+router.use('/auth', require('./auth.routes'))
+
 module.exports = router

+ 8 - 0
routes/v1/laporan.routes.js

@@ -0,0 +1,8 @@
+const router = require('express').Router()
+const laporan = require('../../controller/laporan.controller')
+const handleDokumen = require('../../utils/handleDokumen')
+
+router.post('/create', handleDokumen.array('dokumen'), laporan.create)
+router.get('/', handleDokumen.array('dokumen'), laporan.getAll)
+
+module.exports = router

+ 7 - 0
routes/v1/public.routes.js

@@ -0,0 +1,7 @@
+const router = require('express').Router()
+const user = require('../../controller/user.controller')
+const handleDokumen = require('../../utils/handleDokumen')
+
+router.post('/user/add', handleDokumen.array('dokumen'), user.addUserPublic)
+
+module.exports = router

+ 7 - 0
routes/v1/user.routes.js

@@ -0,0 +1,7 @@
+const router = require('express').Router()
+const laporan = require('../../controller/laporan.controller')
+const handleDokumen = require('../../utils/handleDokumen')
+
+router.post('/add', handleDokumen.single('dokumen'), laporan.create)
+
+module.exports = router

+ 0 - 16
utils/documentFunction.js

@@ -1,16 +0,0 @@
-const chunkModel = require('../model/chunk.model')
-const dokumenModel = require('../model/dokumen.model')
-
-exports.addDokumen = async (dokumen) => {
-  const chunk = await chunkModel.create({
-    data: dokumen.buffer,
-    size: dokumen.size,
-    type: dokumen.mimetype,
-  })
-  const data = await dokumenModel.create({
-    chunk: chunk._id,
-    judul: Date.now() + '-' + dokumen.originalname,
-    path: process.env.BASE_URL + '/dokumen/' + chunk._id,
-  })
-  return data
-}

+ 34 - 0
utils/dokumenFunction.js

@@ -0,0 +1,34 @@
+const chunkModel = require('../model/chunk.model')
+const dokumenModel = require('../model/dokumen.model')
+
+exports.addDokumen = async (dokumen) => {
+  const chunk = await chunkModel.create({
+    data: dokumen.buffer,
+    size: dokumen.size,
+    type: dokumen.mimetype,
+  })
+  const data = await dokumenModel.create({
+    chunk: chunk._id,
+    judul: Date.now() + '-' + dokumen.originalname,
+    path: process.env.BASE_URL + '/dokumen/' + chunk._id,
+  })
+  return data
+}
+
+exports.addManyDokumen = async (dokumenArray) => {
+  return Promise.all(
+    dokumenArray.map(async (dokumen) => {
+      const chunk = await chunkModel.create({
+        data: dokumen.buffer,
+        size: dokumen.size,
+        type: dokumen.mimetype,
+      })
+      const data = await dokumenModel.create({
+        chunk: chunk._id,
+        judul: Date.now() + '-' + dokumen.originalname,
+        path: process.env.BASE_URL + '/dokumen/' + chunk._id,
+      })
+      return data
+    })
+  )
+}

+ 9 - 1
utils/handleError.js

@@ -10,9 +10,17 @@ module.exports = (callback) => async (req, res, next) => {
         error: error.errors.map((e) => e.message),
       })
     }
+
+    if (error.code === 'ETIMEDOUT') {
+      return res.status(408).send({
+        message: 'Request Time Out',
+        error: error.message || error,
+      })
+    }
+
     return response.error(res, {
       message: 'Terjadi error',
-      error,
+      error: error.message || error,
     })
   }
 }