413 lines
10 KiB
JavaScript
413 lines
10 KiB
JavaScript
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;
|