const db = require("../config/dbproc.js"); const Adapter = require("./dbadapter.js"); const request = require("request"); class SAPAccountAdapter extends Adapter { constructor() { super(); } /* ================= LIST + PAGINATION ================= */ async queryList(req, callback) { var apires = this.getApiResultDefined(); try { let limit = parseInt(req.query.limit) || 10; let offset = parseInt(req.query.offset) || 0; let keyword = req.query.keyword || ""; /* ===== QUERY TOTAL ROW ===== */ let qry = ` SELECT * FROM tbl_sap_connections WHERE deleted_at IS NULL AND ( host LIKE '%${keyword}%' OR sap_user LIKE '%${keyword}%' OR ket_sap LIKE '%${keyword}%' ) `; db.query(qry, [], function (err, result) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { if (result.length > 0) { let pagination = result.length / limit; if (!Number.isInteger(pagination)) { pagination = Math.floor(result.length / limit) + 1; } apires.success = true; apires.data.push({ totalpage: pagination, totalrows: result.length, }); /* ===== QUERY DATA WITH LIMIT ===== */ let qryData = ` SELECT * FROM tbl_sap_connections WHERE deleted_at IS NULL AND ( host LIKE '%${keyword}%' OR sap_user LIKE '%${keyword}%' OR ket_sap LIKE '%${keyword}%' ) ORDER BY id ASC LIMIT ${offset}, ${limit} `; db.query(qryData, [], function (err, resultData) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { apires.data.push({ results: JSON.parse(JSON.stringify(resultData)), }); callback(null, apires); } }); } else { apires.meta.code = 200; apires.meta.message = "Record Not Found"; callback(null, apires); } } }); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } /* ================= CREATE ================= */ async queryCreate(req, callback) { var apires = this.getApiResultDefined(); try { const {sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi} = req.body; let qry = ` INSERT INTO tbl_sap_connections (sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi, created_at, created_by, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?, 'Not_Active') `; const password = Buffer.from(sap_password, "utf8").toString("base64"); db.query( qry, [ sap_id, host, sysnr, client, codepage, ket_sap, sap_user, password, aktivasi, req.body.nik || "system", ], function (err, result) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { apires.success = true; apires.data = {insertId: result.insertId}; callback(null, apires); } }, ); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } async callSapActivateById(id, nik, callback) { var apires = this.getApiResultDefined(); let qry = ` SELECT * FROM tbl_sap_connections WHERE id = ? AND deleted_at IS NULL LIMIT 1 `; db.query(qry, [id], (err, result) => { if (err || result.length === 0) { apires.meta.code = 404; apires.meta.message = "SAP Connection not found"; return callback("err", apires); } const sap = result[0]; // decode password sebelum kirim ke SAP const decodedPassword = Buffer.from(sap.sap_password, "base64").toString("utf8"); const sapUrl = process.env.SAP_API_BASE_URL + "/sapConnection" + `?user=${sap.sap_user}` + `&password=${decodedPassword}` + `&sysnr=${sap.sysnr}` + `&client=${sap.client}` + `&codepage=${sap.codepage}` + `&ket_sap=${sap.ket_sap}` + `&host=${encodeURIComponent(sap.host)}`; const options = { method: "POST", url: sapUrl, timeout: 10000, headers: { "x-api-key": process.env.SAP_API_KEY, }, }; request(options, (error, response, body) => { if (error || response.statusCode !== 200) { apires.meta.code = 500; apires.meta.message = "SAP API activate failed"; apires.data = body; return callback("err", apires); } // set semua Not_Active db.query(`UPDATE tbl_sap_connections SET status='Not_Active'`, [], () => { // set Active untuk ID ini db.query( `UPDATE tbl_sap_connections SET status='Active', updated_at=NOW(), updated_by=? WHERE id=?`, [nik || "system", id], (err2) => { if (err2) { apires.meta.code = 500; apires.meta.message = err2.toString(); return callback("err", apires); } apires.success = true; apires.data = {sap_id: sap.sap_id}; callback(null, apires); }, ); }); }); }); } /* ================= UPDATE ================= */ async queryUpdate(req, callback) { var apires = this.getApiResultDefined(); try { const id = req.params.id; const {sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi} = req.body; /* 1️⃣ Ambil data existing (untuk cek status) */ const detailQry = ` SELECT status, sap_password FROM tbl_sap_connections WHERE id = ? AND deleted_at IS NULL LIMIT 1 `; db.query(detailQry, [id], (err, rows) => { if (err || rows.length === 0) { apires.meta.code = 404; apires.meta.message = "SAP Connection not found"; return callback("err", apires); } const currentStatus = rows[0].status; /* 2️⃣ Handle password (jangan overwrite kalau kosong) */ const encodedPassword = sap_password ? Buffer.from(sap_password, "utf8").toString("base64") : rows[0].sap_password; /* 3️⃣ Update data */ const updateQry = ` UPDATE tbl_sap_connections SET sap_id = ?, host = ?, sysnr = ?, client = ?, codepage = ?, ket_sap = ?, sap_user = ?, sap_password = ?, aktivasi = ?, updated_at = NOW(), updated_by = ? WHERE id = ? AND deleted_at IS NULL `; db.query( updateQry, [ sap_id, host, sysnr, client, codepage, ket_sap, sap_user, encodedPassword, aktivasi, req.body.nik || "system", id, ], (err2, result) => { if (err2) { apires.meta.code = 500; apires.meta.message = err2.toString(); return callback("err", apires); } /* 4️⃣ Jika sebelumnya Active → activate ulang SAP */ if (currentStatus === "Active") { return this.callSapActivateById(id, req.body.nik, callback); } /* 5️⃣ Kalau Not_Active → selesai */ apires.success = true; apires.data = {affectedRows: result.affectedRows}; callback(null, apires); }, ); }); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } /* ================= DELETE (SOFT) ================= */ async queryDelete(req, callback) { var apires = this.getApiResultDefined(); try { const id = req.params.id; let qry = ` UPDATE tbl_sap_connections SET deleted_at = NOW(), deleted_by = ? WHERE id = ? AND deleted_at IS NULL `; db.query(qry, [req.body.nik || "system", id], function (err, result) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { apires.success = true; apires.data = {affectedRows: result.affectedRows}; callback(null, apires); } }); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } /* ================= DETAIL ================= */ async queryDetail(req, callback) { var apires = this.getApiResultDefined(); try { const id = req.params.id; let qry = ` SELECT * FROM tbl_sap_connections WHERE id = ? AND deleted_at IS NULL LIMIT 1 `; db.query(qry, [id], function (err, result) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { if (result.length > 0) { const password = Buffer.from(result[0].sap_password, "base64").toString("utf8"); apires.success = true; apires.data = {...result[0], sap_password: password}; } else { apires.meta.code = 200; apires.meta.message = "Record Not Found"; apires.data = null; } callback(null, apires); } }); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } /* ================= ACTIVATE ================= */ async queryActivate(req, callback) { try { const id = req.params.id; const nik = req.body.nik || "system"; // reuse logic yang sama return this.callSapActivateById(id, nik, callback); } catch (err) { const apires = this.getApiResultDefined(); apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } /* ================= CURRENT ================= */ async queryCurrent(req, callback) { var apires = this.getApiResultDefined(); try { let qry = ` SELECT * FROM tbl_sap_connections WHERE status='Active' AND deleted_at IS NULL LIMIT 1 `; db.query(qry, [], function (err, result) { if (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("err", apires); } else { apires.success = true; apires.data = result.length > 0 ? result[0] : null; callback(null, apires); } }); } catch (err) { apires.meta.code = 500; apires.meta.message = err.toString(); callback("error", apires); } } } module.exports = SAPAccountAdapter;