Files
backend-Eprocurement/adapter/sapaccountadapter.js
Rizki 638ff55bff upd
2026-01-09 15:40:05 +07:00

413 lines
10 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;