const { validation } = require('../../middleware/validation') const response = require('../../utils/responseHandler') const userModel = require('../../model/user.model') 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, { username: { type: 'string', empty: false }, password: { type: 'string', empty: false } }), async (req, res) => { const { username, password } = req.body let userResponse try { userResponse = await pddiktiService.login(req.body) if (userResponse.code === 400) { return response.error(res, { code: 401, message: userResponse.message }) } } catch (e) { return response.error(res, { code: 500, message: e.message }) } 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) { await userModel.create({ user_id: userResponse.id, nama: userResponse.nama, lembaga: role.organisasi, email: userResponse.username, no_hp: userResponse.no_hp, alamat: userResponse.alamat, role: role.peran, role_asal: role.peran, isPublic: false, isPrivate: false }) } else { await userModel.findOneAndUpdate({ user_id: userResponse.id }, { lembaga: role.organisasi, role: { 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 } }) } user = await userModel.findOne({ user_id: userResponse.id }) const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, { expiresIn: '1d' }) res.cookie('sidali-cookie', accessToken, { httpOnly: true, expires: moment().add(1, 'day').toDate() }) return response.success(res, { message: 'Berhasil Login', data: { token: `Bearer ${accessToken}`, user } }) } ] exports.loginToPT = [ auth, role([PTB_DIKTI, PTB_ADMIN]), validation((req) => req.body, { lembaga_id: 'string', password: 'string' }), async (req, res) => { let user = req.user const { lembaga_id, password } = req.body let dataLembaga try { const userResponse = await pddiktiService.login({username: user.email, password}) if (userResponse.code !== 200) { return response.error(res, { code: 401, message: userResponse.message }) } dataLembaga = await pddiktiService.getPembina({search: lembaga_id}) } catch (e) { return response.error(res, { code: e.response.status, message: e.message }) } await userModel.updateOne({ _id: user._id }, { lembaga: { id: dataLembaga[0].id, nama: dataLembaga[0].nama }, role: { id: 2022, nama: 'PTB PT' } }) user = await userModel.findOne({ _id: user._id }) await logModel.create({ user: user._id, aktivitas: `${user.nama} berhasil masuk ke PT ${dataLembaga[0].nama}` }) const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, { expiresIn: '1d' }) const data = { token: `Bearer ${accessToken}`, user } res.cookie('sidali-cookie', accessToken, { httpOnly: true, expires: moment().add(1, 'day').toDate() }) response.success(res, { message: 'Berhasil Login', data }) } ] exports.logout = [ auth, (req, res) => { res.clearCookie('sidali-cookie') 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' }) } ]