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') `; db.query( qry, [ sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_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); } } /* ================= UPDATE ================= */ async queryUpdate(req, callback) { var apires = this.getApiResultDefined(); try { const id = req.params.id; const {host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi} = req.body; let qry = ` UPDATE tbl_sap_connections SET 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( qry, [ host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi, 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); } } /* ================= 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) { apires.success = true; apires.data = result[0]; } 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) { var apires = this.getApiResultDefined(); try { const id = req.params.id; /* 1️⃣ Ambil SAP connection dari DB */ 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]; /* 2️⃣ Build SAP API URL (host + query) */ const sapUrl = process.env.SAP_API_BASE_URL + "/sapConnection" + `?user=${sap.sap_user}` + `&password=${sap.sap_password}` + `&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, // 10 detik headers: { "x-api-key": process.env.SAP_API_KEY, }, }; /* 3️⃣ Call SAP API */ request(options, (error, response, body) => { if (error) { apires.meta.code = 500; apires.meta.message = error.toString(); return callback("err", apires); } if (response.statusCode !== 200) { apires.meta.code = response.statusCode; apires.meta.message = "SAP API failed"; apires.data = body; return callback("err", apires); } /* 4️⃣ Set semua Not_Active */ db.query("UPDATE tbl_sap_connections SET status='Not_Active'", [], () => { /* 5️⃣ Set Active untuk ID terpilih */ db.query( `UPDATE tbl_sap_connections SET status='Active', updated_at=NOW(), updated_by=? WHERE id=?`, [req.body.nik || "system", id], (err2) => { if (err2) { apires.meta.code = 500; apires.meta.message = err2.toString(); return callback("err", apires); } apires.success = true; apires.data = { message: "SAP Connection Activated", sap_id: sap.sap_id, }; callback(null, apires); }, ); }); }); }); } catch (err) { 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;